๐ŸŒ• ์นด์นด์˜ค ์†Œ์…œ๋กœ๊ทธ์ธ - KOE303 ์—๋Ÿฌ?

์ดํ•˜์–€ยท2023๋…„ 12์›” 6์ผ
1
post-thumbnail

0. ํ˜„์žฌ ์ง„ํ–‰ ์ƒํ™ฉ


1. ๋ฌธ์ œ ์ƒํ™ฉ

  • ์ธ๊ฐ€ ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ api์˜ ์ ‘๊ทผ์€ ์ •์ƒ์ ์œผ๋กœ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.


  • ๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ์šฉ์ž ์ •๋ณด๊ฐ€ ํ•„์š”ํ•ด ์ธ๊ฐ€ ์ฝ”๋“œ๋ฅผ ๋ฐ›์•„์™€์•ผ ํ•˜๋Š” ๋ชจ๋“  api๋Š” ์ ‘๊ทผ ๋ถˆ๊ฐ€์ธ ์ƒํƒœ์ž…๋‹ˆ๋‹ค๐Ÿ˜…

  • ์›น๋ธŒ๋ผ์šฐ์ € ์ ‘๊ทผ ์‹œ 500 Error ๋ฐœ์ƒ

    • ์นด์นด์˜ค ์†Œ์…œ๋กœ๊ทธ์ธ์ด ์ œ๋Œ€๋กœ ์ž‘๋™๋˜์ง€ ์•Š๋Š” ๊ฒƒ -> jwtfilter๋ฅผ ํ†ต๊ณผํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ฌธ์ œ๋กœ ์ „์ด๋œ ๊ฒƒ์œผ๋กœ ํŒŒ์•…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

    • AWS ec2 ์„œ๋ฒ„ ๋‚ด ์—๋Ÿฌ(์นด์นด์˜ค ์†Œ์…œ ๋กœ๊ทธ์ธ ์‹œ๋„ ์‹œ)



2. KOE303 ์—๋Ÿฌ๊ฐ€ ๋ญ˜๊นŒ?

KOE๋ž€?

  • kakao ์ธก์—์„œ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋ณด์—ฌ์ฃผ๋Š” ์—๋Ÿฌ ๋กœ๊ทธ์˜ ํ—ค๋” ํ˜•์‹
  • ๋’ค์— ๋ถ™๋Š” ๋ฒˆํ˜ธ์— ๋”ฐ๋ผ ์—๋Ÿฌ ์›์ธ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ
  • kakao develops ๊ณต์‹ ์‚ฌ์ดํŠธ์—์„œ ๋ฌธ์ œ ํ•ด๊ฒฐ์— ๊ด€ํ•œ ์ž๋ฃŒ๋ฅผ ์˜ฌ๋ ค๋‘์—ˆ์œผ๋‹ˆ ํ•ด๋‹น ์ž๋ฃŒ๋ฅผ ์ฐธ๊ณ ํ•ด ์—๋Ÿฌ์˜ ์›์ธ์„ ํŒŒ์•…ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค!
    ๐Ÿ“ Kakao Delelopers/trouble-shooting
  • KOE303 ์—๋Ÿฌ
  • ์นด์นด์˜ค ์†Œ์…œ๋กœ๊ทธ์ธ์€ ์ธ๊ฐ€ ์ฝ”๋“œ ์š”์ฒญ๊ณผ ์•ก์„ธ์Šค ํ† ํฐ ์š”์ฒญ์‹œ ์‚ฌ์šฉํ•˜๋Š” redirest URI๊ฐ€ ๋ฐ˜๋“œ์‹œ ๋™์ผํ•œ ํ˜•ํƒœ์—ฌ์•ผ ํ•œ๋‹ค๊ณ  ํ•˜๋„ค์š”!


3. KOE303 Trouble Shooting

1๏ธโƒฃ ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉ์ค‘์ธ redirect URI ์„ค์ •์„ ๋ชจ๋‘ ec2 ์„œ๋ฒ„์— ํ•ด๋‹นํ•˜๋Š” IP์™€ ํฌํŠธ๋ฒˆํ˜ธ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ์ž‘์—…์„ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.
localhost:8080 โžก๏ธ 3.34.236.224:3000

๐Ÿš€ application.yml ์ผ๋ถ€

  security:
    oauth2:
      client:
        registration:
          kakao:
            client-id: {RestapiKey ๊ฐ’์„ ์ž‘์„ฑ}
            client-secret: {์นด์นด์˜ค ๋””๋ฒจ๋กœํผ์—์„œ ๋ฐœ๊ธ‰}
            client-name: Kakao
            redirect-uri: http://3.34.236.224:3000/oauth/kakao/login
            scope: profile_nickname, profile_image, account_email
            authorization-grant-type: authorization_code
            client-authentication-method: POST
        provider:
          kakao:
            authorization_uri: https://kauth.kakao.com/oauth/authorize
            token_uri: https://kauth.kakao.com/oauth/token
            user-info-uri: https://kapi.kakao.com/v2/user/me
            user_name_attribute: id

๐Ÿš€ OauthController ์ผ๋ถ€

    @GetMapping("/kakao/login")
    public void redirectToKakaoLogin(HttpServletResponse response) throws IOException {
        response.sendRedirect("https://kauth.kakao.com/oauth/authorize?client_id=[์‹ค์ œ restapikey ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ๋„ฃ์–ด์คŒ]&redirect_uri=http://3.34.236.224:3000/oauth/kakao/login&response_type=code");
    }

    //์นด์นด์˜ค ์†Œ์…œ ๋กœ๊ทธ์ธ ๊ตฌํ˜„
    @GetMapping("/oauth/kakao/login")
    public void kakaoLogin(@RequestParam("code") String authCode, HttpServletResponse response)
            throws IOException {

        LoginResultDto loginResult = kakaoLoginService.handleKakaoLogin(authCode);
        boolean isNewUser = loginResult.isNewUser();

        Cookie authorization = new Cookie("Authorization", loginResult.getToken());
        authorization.setSecure(true);
        authorization.setHttpOnly(true);
        authorization.setPath("/");
        authorization.setMaxAge(3600);
        response.addCookie(authorization);

        String redirectUrl = "/api/v1/parking/read/detail/1";
        response.sendRedirect(redirectUrl);
    }
  • ๋ชจ๋‘ ์ง„ํ–‰ํ–ˆ์œผ๋‚˜, ๋ณ€ํ™”๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.
    ๋”์ด์ƒ ์ฝ”๋“œ ๋ถ€๋ถ„์—์„œ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์ด ์—†์–ด, kakao Devtalk์— ๊ธ€์„ ์˜ฌ๋ ค ํ•ด๊ฒฐํ•ด๋ณด๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค๐Ÿง

2๏ธโƒฃ Kakao Devtalk ์‚ฌ์ดํŠธ์— KOE303 ์—๋Ÿฌ ์งˆ๋ฌธ

  • KOE320์—๋Ÿฌ์™€ ํ•จ๊ป˜ KOE303์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์งˆ๋ฌธ์„ ์˜ฌ๋ ธ์Šต๋‹ˆ๋‹ค.
    ์•ž์„œ ๊ณต์‹ ์‚ฌ์ดํŠธ์—์„œ ํ™•์ธํ–ˆ๋“ฏ, ํ˜„์žฌ์˜ ๋ฐฐํฌ๋œ ํ”„๋กœ์ ํŠธ์—์„œ redirect URI๊ฐ€ ๋‹ค๋ฅด๋‹ค๋Š” ๋‹ต๋ณ€์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.
  • ํ•˜์ง€๋งŒ ํ˜„์žฌ ๋ฐฐํฌ๋œ ํ”„๋กœ์ ํŠธ์—์„œ์˜ ์ฝ”๋“œ ๋ฌธ์ œ๊ฐ€ ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ํŒ๋‹จํ•˜์—ฌ, ์›น๋ธŒ๋ผ์šฐ์ €์—์„œ ํ™•์ธ ๊ฐ€๋Šฅํ•œ ์—๋Ÿฌ๋ฅผ ์ฒจ๋ถ€ํ•ด ๋‹ค์‹œ ์งˆ๋ฌธ์„ ์˜ฌ๋ ธ์Šต๋‹ˆ๋‹ค.

    -> ๋ณ€๊ฒฝ์„ ํ–ˆ์Œ์—๋„ ์—ฌ์ „ํžˆ kakao ์ธก์—์„œ๋Š” ๋ฆฌ๋‹ค์ด๋ ‰ํŒ… URI๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์—ฌ ๋” ์ž์„ธํ•œ ์งˆ๋ฌธ์„ ์˜ฌ๋ฆฐ ๋’ค, ์šฐ์„  ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ๋ถ„์„ํ•ด๋ณด๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ๋‹ค์‹œํ•œ๋ฒˆ ๋ถ„์„ํ•ด๋ณด๋‹ˆ, ํ˜„์žฌ ์นด์นด์˜ค ๋กœ๊ทธ์ธ์˜ ์ธ๊ฐ€ ์ฝ”๋“œ๊นŒ์ง€๋Š” ๋ฐœ๊ธ‰์ด ๋˜์ง€๋งŒ, jwtfilter๊นŒ์ง€ ๋„๋‹ฌํ•˜์ง€ ๋ชปํ•˜๋ฉฐ 500 ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ ๊ฐ™์•„ ์ฝ”๋“œ์— ๋Œ€ํ•œ ์งˆ๋ฌธ์„ ๋“œ๋ ธ์Šต๋‹ˆ๋‹ค.

  • ์ฝ”๋“œ ์ƒ์˜ ํฐ ๋ฌธ์ œ๋Š” ์—†๋‹ค๋Š” ๋‹ต๋ณ€์„ ๋ฐ›์•˜๊ณ , ๋ฐฐํฌ์— ๋Œ€ํ•ด์„œ ์–ธ๊ธ‰ํ•ด์ฃผ์…จ๋Š”๋ฐ ์ด ๋ถ€๋ถ„์—์„œ Github Actions๋ฅผ ๋‹ค์‹œ ์‚ดํŽด๋ด์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ•  ์ˆ˜ ์žˆ์—ˆ์–ด์š”!


4. ํ˜„์žฌ๊นŒ์ง€์˜ ๋ถ„์„

  • ํ˜„์žฌ ํ”„๋กœ์ ํŠธ๋Š” Github Actions์—์„œ github repository์˜ deploy.yml์„ ์›Œํฌํ”Œ๋กœ์šฐ์— ์˜ฌ๋ ค ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ชจ๋‘ ์‹คํ–‰๋˜๋Š” ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค.
  • ๊ทธ ์ค‘, Make application.yml์— ๋Œ€ํ•œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ chatGPT์— ์งˆ๋ฌธํ•ด๋ณด๊ณ  ํžŒํŠธ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค!
    deploy.yml > Make application.yml ๋ถ€๋ถ„
      - name: Make application.yml
        run: |
          cd ./src/main/resources
          touch ./application.yml
          echo "${{ secrets.PROPERTIES }}" > ./application.yml
        shell: bash

์ง€๊ธˆ์˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ดํŽด๋ณด๋ฉด, Github Actions์˜ ์›Œํฌํ”Œ๋กœ์šฐ ์‹คํ–‰ ์‹œ Github Secrets์— ์ €์žฅ๋œ PROPERTIES๋ฅผ ๋ณต์‚ฌํ•ด์„œ ๊ฐ€์ ธ์˜ค๋Š” ํ˜•ํƒœ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ํ˜„์žฌ์˜ application.yml์˜ ๋‚ด์šฉ์ด ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌ๋˜์–ด ์žˆ์–ด์•ผ๋งŒ ์ ์šฉ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ, ํ˜„์žฌ PROPERTIES ๋‚ด๋ถ€์˜ ์‹ค์ œ ๋‚ด์šฉ ์ค‘ redirect uri ์„ค์ • ๋ถ€๋ถ„์—์„œ localhost:8080์œผ๋กœ ์„ค์ •ํ–ˆ๋˜ ์˜ˆ์ „ ๋‚ด์šฉ๋งŒ์ด ๋ฐ˜์˜๋˜์–ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์–ด์š”๐Ÿ˜ฎ

  • ์ฆ‰, github repo > Settings > Security > Actions ์—์„œ ์ €์žฅํ•œ PROPERTIES ๊ฐ’์„ ํ˜„์žฌ์˜ application.yml ๋‚ด์šฉ์œผ๋กœ ์ˆ˜์ •ํ•ด์ค˜์•ผ ๋ฐฐํฌ๋œ ํ”„๋กœ์ ํŠธ์— ๋ฐ˜์˜์ด ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ๊ฐ€ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์–ด์š”...!

    (1) Github Actions Properties ๋‚ด์šฉ ์ˆ˜์ •
    (2) ํ”„๋กœ์ ํŠธ commit&push๋กœ Github Actions Workflow ์‹คํ–‰ํ•˜๊ณ  ๋ฐฐํฌ
    (3) ๋‹ค์‹œ ์ ‘๊ทผํ•ด์„œ ํ™•์ธ

5. ๊ฒฐ๊ณผ

  • ์œ„์˜ ๋ฐฉ๋ฒ•๋Œ€๋กœ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ, ์†Œ์…œ๋กœ๊ทธ์ธ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!
    ํ•˜์ง€๋งŒ ์„œ๋ฒ„ ์†Œ์Šค์ฝ”๋“œ ์ƒ https์—์„œ๋งŒ cookie๊ฐ€ ๋‚˜์˜ค๋„๋ก ์„ค์ •ํ•œ ๊ฒƒ์ด ๋ฌธ์ œ๊ฐ€ ๋˜์–ด JWT String argument cannot be null or empty. ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ํ•ด๊ฒฐ์€ authorization.setSecure(false);๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.!
    • ๊ธฐ์กด์—๋Š” true๋กœ ๋˜์–ด ์žˆ์–ด http ํ˜•์‹์˜ ip ์ ‘๊ทผ์œผ๋กœ๋Š” api์— ์ ‘์†ํ•  ์ˆ˜ ์—†์—ˆ๋˜ ๋ฌธ์ œ์˜€๋˜ ๊ฑธ๋กœ ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

  • KOE303 ์—๋Ÿฌ๋Š” ๋ฐฐํฌ ์‹œ์— ๋ฌธ์ œ์ผ ์ˆ˜๋„ ์žˆ๋‹ค.
  • ๋Œ€๋ถ€๋ถ„์˜ ์—๋Ÿฌ๋Š” ์˜คํƒ€ ๋˜๋Š” ์ ‘๊ทผ ๊ถŒํ•œ ์„ค์ •์— ๋”ฐ๋ฅธ ๋ฌธ์ œ๋กœ ๋ฐœ์ƒํ•œ๋‹ค.
profile
์–ธ์  ๊ฐ€ ๋‚ด ์ฝ”๋“œ๋กœ ์„ธ์ƒ์— ๊ธฐ์—ฌํ•  ์ˆ˜ ์žˆ๋„๋ก, BE ๊ฐœ๋ฐœ ๊ธฐ๋ก ๋…ธํŠธโ˜˜๏ธ

0๊ฐœ์˜ ๋Œ“๊ธ€