๐Ÿ”ฅ #17 ์นด์นด์˜ค ๋กœ๊ทธ์ธ ์„œ๋น„์Šค ๊ตฌํ˜„ 1 - ์ธ์ฆ ๋ฐ ๊ถŒํ•œ ๋ถ€์—ฌ (Access Token ๋ฐ›๊ธฐ)

myeonjiยท2022๋…„ 2์›” 23์ผ
0

์นด์นด์˜ค ๋กœ๊ทธ์ธ ์„œ๋น„์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์นด์นด์˜ค ๊ฐœ๋ฐœ์ž ์„ผํ„ฐ์—์„œ ์ถ”๊ฐ€ํ•˜๊ณ , ์–ป์€ ์ •๋ณด๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

์นด์นด์˜ค api
ํด๋ผ์ด์–ธํŠธ ํ‚ค : d5526e3b2a4169a3d9f2b7a6f9a12..~~~
	
์›น์„œ๋ฒ„์ฃผ์†Œ : http://localhost:8000

์นด์นด์˜ค ๋กœ๊ทธ์ธ์š”์ฒญ ์ฝœ๋ฐฑ ์ฃผ์†Œ: http://localhost:8000/auth/kakao/callback

์นด์นด์˜ค๋กœ๋ถ€ํ„ฐ ๋ฐ›์„ ์ •๋ณด : profile ์ •๋ณด(ํ•„์ˆ˜) , email(์„ ํƒ)

๋กœ๊ทธ์ธ ์š”์ฒญ ์ฃผ์†Œ(GET)

๋‚ด๊ฐ€ ์“ธ ๊ฒƒ : https://kauth.kakao.com/oauth/authorize?client_id=d5526e3b2a4169a3d9f2b7a6f9a12cdf&redirect_uri=http://localhost:8000/auth/kakao/callback&response_type=code

์นด์นด์˜ค ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์— ์œ„ ์ฃผ์†Œ๋ฅผ href ๋กœ ๊ฑธ์–ด์ฃผ๋ฉด ๋œ๋‹ค.
์ด๋•Œ๋Š” ์œ„์˜ ์‚ฌ์ง„์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด GET ๋ฐฉ์‹์ด๋‹ค.

โญ๋”ฐ๋ผ์„œ ์ฃผ์†Œ๋ฅผ ํ†ตํ•ด (์ฟผ๋ฆฌ ์ŠคํŠธ๋ง) ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค. a ํƒœ๊ทธ!!

< loginForm.jsp >

<a href="https://kauth.kakao.com/oauth/authorize?client_id=d5526e3b2a4169a3d9f2b7a6f9a12cdf&redirect_uri=http://localhost:8000/auth/kakao/callback&response_type=code"><img height="38px" src="/image/kakao_login_button.png" /></a>

์‘๋‹ต ๋ฐ›์€ ์ฝ”๋“œ : http://localhost:8000/auth/kakao/callback?code=04MBIEBh-YAPy8FFBCCoe9h9L_NggQqfavAkjnQgbQ06FYQEbkC_YPG6-UBz9hyZxdBFiQorDKYAAAF_J2OJxg

๐Ÿ’ก ์ธ์ฆ์ฒ˜๋ฆฌ - code

    @GetMapping("/auth/kakao/callback")
    public @ResponseBody String kakaoCallback(String code) { // @ResponseBody : Data๋ฅผ ๋ฆฌํ„ดํ•ด์ฃผ๋Š” ์ปจํŠธ๋กค๋Ÿฌ ํ•จ์ˆ˜
        return "์นด์นด์˜ค ์ธ์ฆ ์™„๋ฃŒ : ์ฝ”๋“œ๊ฐ’ : " + code;
    }

์œ„๋ฅผ ๋ณด๋ฉด code= ํ•˜๊ณ  ์นด์นด์˜ค API ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ code๋ฅผ ๋ฐ›์•˜๋‹ค. ์ฆ‰, ์ •์ƒ์ ์œผ๋กœ ์ธ์ฆ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค!

-> ๋กœ๊ทธ์ธ์„ ํ†ตํ•ด ์ธ์ฆ์€ ๋˜์—ˆ์ง€๋งŒ, ๊ทธ ์œ ์ €์˜ ์ •๋ณด๋ฅผ ๋ชจ๋ฅธ๋‹ค!!! ์ •๋ณด์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ† ํฐ์„ ๋ฐ›์•„์•ผ ํ•œ๋‹ค.


๐Ÿ’ก ๊ถŒํ•œ๋ถ€์—ฌ - AccessToken

์ด์ œ ์‘๋‹ต ๋ฐ›์€ code ๊ฐ’์„ ํ†ตํ•ด์„œ AccessToken ์„ ๋ฐ›์•„์•ผ ํ•œ๋‹ค.
์นด์นด์˜ค ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„์— ๋“ฑ๋ก๋œ ๋กœ๊ทธ์ธ๋œ ์‚ฌ๋žŒ์˜ ์ •๋ณด๋ฅผ ์‘๋‹ต๋ฐ›๊ธฐ ์œ„ํ•ด์„œ ์ด๋‹ค.
์ฆ‰, ์นด์นด์˜ค ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„์— ์žˆ๋Š” ํ•ด๋‹น ์ •๋ณด์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“ขํ† ํฐ ๋ฐœ๊ธ‰ ์š”์ฒญ

์œ„์˜ ์‚ฌ์ง„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด POST ๋ฐฉ์‹์ด๋‹ค.
โญGET ๋ฐฉ์‹์ฒ˜๋Ÿผ ์ฃผ์†Œ๋ฅผ ํ†ตํ•ด (์ฟผ๋ฆฌ ์ŠคํŠธ๋ง) ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ!! http Body์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

ํ† ํฐ ๋ฐœ๊ธ‰ ์š”์ฒญ ์ฃผ์†Œ (POST)
MIME : application/x-www-form-urlencoded;charset=utf-8 -> (key=value) ํ˜•ํƒœ
https://kauth.kakao.com/oauth/token

grant_type = authorization_code
client_id = d5526e3b2a4169a3d9f2b7a6f9a12cdf
redirect_uri = http://localhost:8000/auth/kakao/callback
code = {๋™์ }

< UserController >

    @GetMapping("/auth/kakao/callback")
    public @ResponseBody String kakaoCallback(String code) { // @ResponseBody : Data๋ฅผ ๋ฆฌํ„ดํ•ด์ฃผ๋Š” ์ปจํŠธ๋กค๋Ÿฌ ํ•จ์ˆ˜

        // ์นด์นด์˜ค API ์„œ๋ฒ„์—๊ฒŒ POST ๋ฐฉ์‹์œผ๋กœ key=value ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญ
        // ์š”์ฒญ ๋ฐฉ๋ฒ• -> ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ  : HttpsURLConnection, Retrofit2(์ฃผ๋กœ ์•ˆ๋“œ๋กœ์ด๋“œ), OkHttp, RestTemplate
        RestTemplate rt = new RestTemplate();

        // HttpHeader ๊ฐ์ฒด ์ƒ์„ฑ
       	HttpHeaders headers = new HttpHeaders();
        headers.add("Content-type", "application/x-www-form-urlencoded;charset=utf-8"); // key=value ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ผ๋Š” ๊ฒƒ์„ ์•Œ๋ ค์ฃผ๋Š” ๋ถ€๋ถ„

        // HttpBody ๊ฐ์ฒด ์ƒ์„ฑ
        MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
        params.add("grant_type", "authorization_code");
        params.add("client_id", "d5526e3b2a4169a3d9f2b7a6f9a12cdf");
        params.add("redirect_uri", "http://localhost:8000/auth/kakao/callback");
        params.add("code", code);

        // HttpHeader์™€ HttpBody๋ฅผ ํ•˜๋‚˜์˜ ๊ฐ์ฒด์— ๋‹ด๊ธฐ -> ๋งŒ๋“  ์ด์œ  : ์•„๋ž˜์˜ exchange ํ•จ์ˆ˜์— HttpEntity๋ฅผ ๋„ฃ์–ด์•ผ ํ•ด์„œ..
        HttpEntity<MultiValueMap<String, String>> kakaoTokenRequest =
                new HttpEntity<>(params, headers); // body ๋ฐ์ดํ„ฐ์™€ headers ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” Entity

        // ์นด์นด์˜ค์—๊ฒŒ Http ์š”์ฒญํ•˜๊ธฐ (POST ๋ฐฉ์‹) -> response๋ผ๋Š” ๋ณ€์ˆ˜์— ์‘๋‹ต์„ ๋ฐ›์Œ
        ResponseEntity<String> response = rt.exchange(
                "https://kauth.kakao.com/oauth/token",
                HttpMethod.POST,
                kakaoTokenRequest,
                String.class
        );

//        return "์นด์นด์˜ค ์ธ์ฆ ์™„๋ฃŒ : ์ฝ”๋“œ๊ฐ’ : " + code;
        return "์นด์นด์˜ค ํ† ํฐ ์š”์ฒญ ์™„๋ฃŒ : ํ† ํฐ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต : " + response;
    }

์œ„์˜ ์ฝ”๋“œ๋Š” ์š”์ฒญ ๋ฐฉ๋ฒ•์ด๋‹ค.
RestTemplate ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ–ˆ๊ณ , HttpHeader ๊ฐ์ฒด ์ƒ์„ฑ, HttpBody ๊ฐ์ฒด ์ƒ์„ฑ, Http ์š”์ฒญ๊นŒ์ง€ ์ฐจ๋ก€๋Œ€๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค.

์‘๋‹ต์ด ์ด๋ ‡๊ฒŒ ์™”๋‹ค!!

๐Ÿ“ขํ† ํฐ ์‘๋‹ต

์œ„์—์„œ ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต ๋‚ด์šฉ์„ ๋œฏ์–ด๋ณด์ž!

์นด์นด์˜ค ํ† ํฐ ์š”์ฒญ ์™„๋ฃŒ : ํ† ํฐ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต : <200,{"access_token":"0gFpYkxJJHa3BNFx1ZZn3XvKjCHjJHYBpHxh2go9dJcAAAF_J7AhMA","token_type":"bearer","refresh_token":"Esq-jTYjpVt_R5_gRWAR04ZVoqewddpfbMyZ2Ao9dJcAAAF_J7AhLg","expires_in":21599,"scope":"account_email profile_image profile_nickname","refresh_token_expires_in":5183999},[Date:"Wed, 23 Feb 2022 17:45:28 GMT", Content-Type:"application/json;charset=utf-8", Transfer-Encoding:"chunked", Connection:"keep-alive", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-XSS-Protection:"1; mode=block", X-Frame-Options:"DENY", X-Content-Type-Options:"nosniff", Kakao:"Talk", Access-Control-Allow-Origin:"*", Access-Control-Allow-Methods:"GET, POST, OPTIONS", Access-Control-Allow-Headers:"Authorization, KA, Origin, X-Requested-With, Content-Type, Accept"]>

200์€ ์š”์ฒญ์„ฑ๊ณต ์ด๋‹ค !

  • token_type : bearer
  • access_token : 0gFpYkxJJHa3BNFx1ZZn3XvKjCHjJHYBpHxh2go9dJcAAAF_J7AhMA
  • expires_in : 21599
  • refresh_token : Esq-jTYjpVt_R5_gRWAR04ZVoqewddpfbMyZ2Ao9dJcAAAF_J7AhLg
  • refresh_token_expires_in : 5183999
  • scope : account_email profile_image profile_nickname

scope ๋Š” ๋‚ด๊ฐ€ ๊ฐœ์ธ์ •๋ณด ๋™์˜ ํ•ญ๋ชฉ์„ ์„ค์ •ํ•  ๋•Œ, ํ”„๋กœํ•„ ์ •๋ณด(๋‹‰๋„ค์ž„/ํ”„๋กœํ•„์‚ฌ์ง„) ๊ณผ ์นด์นด์˜ค๊ณ„์ •(์ด๋ฉ”์ผ) ๋งŒ ๋™์˜๋ฅผ ํ•ด๋†จ๊ธฐ ๋•Œ๋ฌธ์— ์œ„์ฒ˜๋Ÿผ ์‘๋‹ต์ด ๋œ๋‹ค.

์‘๋‹ต์ด json ๊ฐ์ฒด๋กœ ์™”์œผ๋‹ˆ ์ด๋ฅผ ์‰ฝ๊ฒŒ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด Parser๋กœ ๋ณด์•˜๋‹ค.

-> access_token ์„ ๋ฐ›์•˜์œผ๋‹ˆ, ์ด ํ† ํฐ์„ ์ด์šฉํ•˜์—ฌ ๋ฐฉ๊ธˆ ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๊ฐ€ ์ €์žฅ๋œ ์นด์นด์˜ค์˜ ์ž์›์„œ๋ฒ„์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์ด ์ƒ๊ฒผ๋‹ค.

-> ์ด์ œ ์นด์นด์˜ค๋กœ ๋กœ๊ทธ์ธํ•œ ํšŒ์›์˜ ๊ฐœ์ธ์ •๋ณด๋ฅผ ์š”์ฒญํ•˜๋ฉด ๋œ๋‹ค.


<์ด๋ฒˆ ๊ฒŒ์‹œ๊ธ€์—์„œ ์‚ฌ์šฉํ•œ ์ •๋ณด๋“ค>

profile
๐Ÿ“š

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