[Spring] ๋„ค์ด๋ฒ„ ๋กœ๊ทธ์ธ API ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

2024. 2. 7. 14:48ใ†Spring/[2024] Spring Boot

728x90

 

 

https://hyejin.tistory.com/1290

 

[Spring] ์นด์นด์˜ค ๋กœ๊ทธ์ธ API ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

์š”์ฆ˜์€ ์นด์นด์˜ค, ๋„ค์ด๋ฒ„๋ฅผ ์ด์šฉํ•œ Login Api ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ์‹ค์ œ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ์ƒ˜ํ”Œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์–ด kakao login api ๋™์ž‘ ๋ฐฉ์‹์„ ์•Œ์•„๋ณผ ๊ฒƒ์ด๋‹ค. REST API๋ฅผ ์‚ฌ์šฉํ•œ ์นด์นด์˜ค ๋กœ๊ทธ์ธ์€ PC ๋ฐ

hyejin.tistory.com

-> ์นด์นด์˜ค ๋กœ๊ทธ์ธ api ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• 

 

์นด์นด์˜ค ๋กœ๊ทธ์ธ api๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋กœ๊ทธ์ธ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณธ ๋‹ค์Œ, 

์ด์ œ ๋„ค์ด๋ฒ„ ๋กœ๊ทธ์ธ api๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณผ ๊ฒƒ์ด๋‹ค. 

ํ•œ๋ฒˆ ํ•ด๋ณด๋ฉด ๋‘˜๋‹ค ํ”Œ๋กœ์šฐ๋Š” ๋น„์Šทํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธˆ๋ฐฉํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

Naver ๋กœ๊ทธ์ธ ๋„์ž… ๋ฐฉ๋ฒ• 

https://developers.naver.com/main/

 

NAVER Developers

๋„ค์ด๋ฒ„ ์˜คํ”ˆ API๋“ค์„ ํ™œ์šฉํ•ด ๊ฐœ๋ฐœ์ž๋“ค์ด ๋‹ค์–‘ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋„๋ก API ๊ฐ€์ด๋“œ์™€ SDK๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ œ๊ณต์ค‘์ธ ์˜คํ”ˆ API์—๋Š” ๋„ค์ด๋ฒ„ ๋กœ๊ทธ์ธ, ๊ฒ€์ƒ‰, ๋‹จ์ถ•URL, ์บก์ฐจ๋ฅผ ๋น„๋กฏ ๊ธฐ๊ณ„๋ฒˆ์—ญ, ์Œ

developers.naver.com

 

1๏ธโƒฃ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋“ฑ๋ก 

naver๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋„ค์ด๋ฒ„ ๊ฐœ๋ฐœ์ž ์„ผํ„ฐ์— ๋“ค์–ด๊ฐ€์„œ ๋กœ๊ทธ์ธ ํ›„ ๋ณธ์ธ์˜ ์„œ๋น„์Šค ํ™˜๊ฒฝ ํŒŒ์•… ํ›„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋“ฑ๋กํ•ด์•ผ ํ•œ๋‹ค. 

[Application - ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋“ฑ๋ก] 

https://developers.naver.com/docs/common/openapiguide/appregister.md

 

์‚ฌ์ „ ์ค€๋น„ ์‚ฌํ•ญ - Open API ๊ฐ€์ด๋“œ

์‚ฌ์ „ ์ค€๋น„ ์‚ฌํ•ญ ๋„ค์ด๋ฒ„ ์˜คํ”ˆAPI๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € ๋„ค์ด๋ฒ„ ๊ฐœ๋ฐœ์ž ์„ผํ„ฐ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋“ฑ๋กํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ ์•„์ด๋””์™€ ํด๋ผ์ด์–ธํŠธ ์‹œํฌ๋ฆฟ์„ ๋ฐœ๊ธ‰๋ฐ›์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ ์•„์ด๋””์™€ ํด๋ผ

developers.naver.com

-> ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋“ฑ๋ก ๊ฐ€์ด๋“œ

 

-> API ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋“ฑ๋กํ•˜๋Š”๋ฐ ์ด๋ฒˆ์—๋„ ๋‚˜๋Š” TEST ์šฉ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ƒฅ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ด๋ฆ„์€ test๋กœ ์„ค์ •ํ–ˆ๋‹ค. ์‚ฌ์šฉ api์œผ๋กœ๋Š” ๋กœ๊ทธ์ธ api๋ฅผ ์ด์šฉํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋„ค์ด๋ฒ„ ๋กœ๊ทธ์ธ์„ ์„ ํƒํ•ด์ค€๋‹ค. 

๊ทธ๋ฆฌ๊ณ  ๋กœ๊ทธ์ธ ํ•  ๋•Œ ์‚ฌ์šฉ์ž ์ œ๊ณต ์ •๋ณด๋ฅผ ๋ณ„๋ช…, ํ”„๋กœํ•„ ์‚ฌ์ง„, ์ด๋ฉ”์ผ, ํœด๋Œ€์ „ํ™”๋ฒˆํ˜ธ ์ •๋„๋งŒ ๊ฐ€์ ธ์˜ค๋„๋ก ์„ค์ •ํ–ˆ๋‹ค. 

 

์นด์นด์˜ค์™€ ๋™์ผํ•˜๊ฒŒ ํด๋ผ์ด์–ธํŠธ์—์„œ ๋„ค์ด๋ฒ„ ๋กœ๊ทธ์ธ ์š”์ฒญํ•˜๋ฉด ์ธ์ฆ ๋ฐ ์ •๋ณด ๋™์˜ ํ™”๋ฉด์„ ๋ณด์—ฌ์ฃผ๊ณ , ์ด์— ๋Œ€ํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ๋™์˜ํ•˜๋ฉด ์ฝœ๋ฐฑํ•ด์ค„ Redirect Uri๋ฅผ ์ž‘์„ฑํ•œ๋‹ค. 

ํ…Œ์ŠคํŠธ์ด๊ธฐ ๋Œ€๋ฌธ์— ์„œ๋น„์Šค url ์€ http://localhost:8080 ์ด๊ณ ,

๋„ค์ด๋ฒ„ ๋กœ๊ทธ์ธ Callback url ์€ http://localhost:8080/login/naver/code๋กœ ์ง€์ •ํ•ด์คฌ๋‹ค. 

 

 

2๏ธโƒฃ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋“ฑ๋ก ํ™•์ธ ๋ฐ ํด๋ผ์ด์–ธํŠธ ์•„์ด๋””์™€ ์‹œํฌ๋ฆฟ ํ™•์ธ 

-> ๋‚ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ€๋ฉด ์ด๋ ‡๊ฒŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋“ฑ๋ก๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ณ , Client ID์™€ Client Secret์ด ์žˆ๋‹ค. 

์ด ์ •๋ณด๊ฐ€ ์žˆ์–ด์•ผ ์ธ๊ฐ€ ์š”์ฒญ, ์•ก์„ธ์Šค ํ† ํฐ, ์‚ฌ์šฉ์ž ์ •๋ณด ์กฐํšŒ ๋“ฑ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

Client ID์™€ Client Secret์€ ๋‚ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ๋ถ„ํ•ด์ฃผ๋Š” ์ค‘์š”ํ•œ ์ •๋ณด์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋“œ์‹œ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณด๊ด€ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.
๋˜ํ•œ ๋„ค์ด๋ฒ„ ๋กœ๊ทธ์ธ ์—ฐ๋™ ๊ณผ์ •์—์„œ ํ™œ์šฉ๋˜๋Š” ์ •๋ณด์ž…๋‹ˆ๋‹ค. ์ž˜๋ชป๋œ Client ID / Client Secret ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์—ฐ๋™์ด ์‹คํŒจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ•œ ๋ฒˆ ๋ฐœ๊ธ‰์ด ๋œ Client ID๋Š” ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Client Secret ์ •๋ณด๋Š” ๊ฐœ๋ฐœ์ž์„ผํ„ฐ๋ฅผ ํ†ตํ•ด ์žฌ๋ฐœ๊ธ‰ ๋ฐ›๋Š”๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
Client Secret์˜ ์œ ์ถœ์ด ์˜์‹ฌ๋˜๋ฉด ์žฌ๋ฐœ๊ธ‰์„ ํ†ตํ•ด ๋„์šฉ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

* ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ ์‚ฌ์šฉ ๊ฐ€์ด๋“œ 

https://developers.naver.com/docs/login/bi/bi.md

 

๋กœ๊ทธ์ธ ๋ฒ„ํŠผ ์‚ฌ์šฉ ๊ฐ€์ด๋“œ - LOGIN

๋„ค์ด๋ฒ„ ๋กœ๊ทธ์ธ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋„ค์ด๋ฒ„ ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ ๊ธฐ๋ณธ ์ด๋ฏธ์ง€๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํ™ฉ์— ๋งž๊ฒŒ ๋ฒ„ํŠผ ์ด๋ฏธ์ง€์˜ ๋””์ž์ธ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋„ค์ด๋ฒ„ ๊ณ ์œ ์˜ ์•„์ด๋ด

developers.naver.com

 

 

 

๋„ค์ด๋ฒ„ ๋กœ๊ทธ์ธ ์ƒ˜ํ”Œ ํ”„๋กœ์ ํŠธ ๋งŒ๋“ค๊ธฐ 

๋„ค์ด๋ฒ„ ๋กœ๊ทธ์ธ ๊ณผ์ • โœ”
1. ๋„ค์ด๋ฒ„ ๋กœ๊ทธ์ธ ์—ฐ๋™ URL ์ƒ์„ฑํ•˜๊ธฐ 
2. ์ ‘๊ทผ ํ† ํฐ ๋ฐœ๊ธ‰ ์š”์ฒญ 
3. ์ ‘๊ทผ ํ† ํฐ์„ ์ด์šฉํ•˜์—ฌ ํ”„๋กœํ•„ API ํ˜ธ์ถœํ•˜๊ธฐ 

 

1๏ธโƒฃ ๋„ค์ด๋ฒ„ ๋กœ๊ทธ์ธ ์—ฐ๋™ URL ์ƒ์„ฑํ•˜๊ธฐ 

 

๋„ค์ด๋ฒ„ ๋กœ๊ทธ์ธ ์—ฐ๋™์„ ์ง„ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋„ค์ด๋ฒ„ ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ ์ด๋™ํ•  ๋„ค์ด๋ฒ„ ๋กœ๊ทธ์ธ url ์„ ๋จผ์ € ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค. ์ด ๊ณผ์ •์—์„œ ์‚ฌ์šฉ์ž๋Š” ๋„ค์ด๋ฒ„์— ๋กœ๊ทธ์ธ ์ธ์ฆ์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ๋„ค์ด๋ฒ„ ๋กœ๊ทธ์ธ ์—ฐ๋™ ๋™์˜ ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. 

๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ ์—ฐ๋™์— ๋™์˜ํ•˜๋ฉด ๋™์˜ ์ •๋ณด๋ฅผ ํฌํ•จํ•˜์—ฌ Callback url ๋กœ ์ „์†กํ•œ๋‹ค. 

 

์š”์ฒญ๋ฌธ ์ƒ˜ํ”Œ

https://nid.naver.com/oauth2.0/authorize?response_type=code&client_id=CLIENT_ID&state=STATE_STRING&redirect_uri=CALLBACK_URL

 

 

application-private.yml 

naver:
  client_id: 
  redirect_uri : 
  client_secret:

kakao ์ •๋ณด์™€ ๋™์ผํ•˜๊ฒŒ naver๋„ client_id , client_secret, redirect_uri ์ •๋ณด๋“ค์„ ์ž…๋ ฅํ•ด์„œ ๋„ฃ์–ด์ค€๋‹ค. 

 

NaverApi

@Slf4j
@Getter
@Component(value = "naverApi")
public class NaverApi
{
    @Value("${naver.client_id}")
    private String naverClientId;
    
    @Value("${naver.redirect_uri}")
    private String naverRedirectUri;
    
    @Value("${naver.client_secret}")
    private String naverClientSecret;
}

-> ๊ทธ๋ฆฌ๊ณ  yml ์— ์ €์žฅํ•œ ์ •๋ณด๋“ค์„ ๋ฐ›๋Š” vo ๊ฐ์ฒด๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์ค€๋‹ค. 

 

login.html 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Kakao & Naver Login API TEST</title>
</head>
<body>
<div class="text-center">
    <a href="https://kauth.kakao.com/oauth/authorize"
       th:href="@{https://kauth.kakao.com/oauth/authorize(client_id=${kakaoApiKey}, redirect_uri=${kakaoRedirectUri}, response_type='code')}">
        <img src="/images/kakao_login_medium_narrow.png">
    </a>

    <p> </p>
    <a href="https://nid.naver.com/oauth2.0/authorize"
        th:href="@{https://nid.naver.com/oauth2.0/authorize(client_id=${naverClientId}, redirect_uri=${naverRedirectUri}, response_type='code', state=${state})}">
       <img src="/images/btnG.png" style="width: 100px; height: 35px" >
    </a>
</div>
</body>
</html>

-> kakao login button ์žˆ๋Š” login ํŽ˜์ด์ง€์— ๋„ค์ด๋ฒ„ ๋กœ๊ทธ์ธ ์ •๋ณด๋„ ๋„ฃ์–ด์ค€๋‹ค. 

 

TestController 

    @GetMapping("/login")
    public String loginForm(Model model)
    {
       model.addAttribute("kakaoApiKey", kaKaoApi.getKakaoApiKey());
       model.addAttribute("kakaoRedirectUri", kaKaoApi.getKakaoRedirectUri());
       model.addAttribute("naverClientId", naverApi.getNaverClientId());
       model.addAttribute("naverRedirectUri",naverApi.getNaverRedirectUri());
       model.addAttribute("state", "STATE_STRING");
       return "login";
    }

-> login ์ฝ”๋“œ์— naverClientId, naverRedirectUri ์ •๋ณด๋ฅผ ๋‹ด์•„์„œ login ํŽ˜์ด์ง€์— ์ „๋‹ฌํ•œ๋‹ค. 

 

์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ ํ•˜๊ณ  ์ •๋ณด ์š”์ฒญ์— ๋™์˜ํ•˜๋ฉด ๊ทธ ๋‹ค์Œ์—” Callback url๋กœ ์•ก์„ธ์Šค ํ† ํฐ ๋ฐœ๊ธ‰์„ ์œ„ํ•œ code๋ฅผ ์ „๋‹ฌํ•œ๋‹ค. 

 

 

2๏ธโƒฃ ์ ‘๊ทผ ํ† ํฐ ๋ฐœ๊ธ‰ ์š”์ฒญ 

์ด์ œ Callback ์œผ๋กœ ์ „๋‹ฌ๋ฐ›์€ ์ •๋ณด๋ฅผ ์ด์šฉํ•˜์—ฌ ์ ‘๊ทผ ํ† ํฐ์„ ๋ฐœ๊ธ‰๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. 

์ด๋•Œ ์ ‘๊ทผ ํ† ํฐ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ฆ์„ ์™„๋ฃŒํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์ธ์ฆ ์ •๋ณด์ด๋‹ค. ์ด ์ ‘๊ทผ ํ† ํฐ์„ ์ด์šฉํ•ด ํ”„๋กœํ•„ api๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ์˜คํ”ˆ api๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. 

'code' ๊ฐ’์„ ์ด์šฉํ•œ APIํ˜ธ์ถœ์€ ์ตœ์ดˆ 1๋ฒˆ๋งŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ ‘๊ทผ ํ† ํฐ ๋ฐœ๊ธ‰์ด ์™„๋ฃŒ๋˜๋ฉด ์‚ฌ์šฉ๋œ 'code'๋Š” ๋” ์ด์ƒ ์žฌ์‚ฌ์šฉํ• ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

 

์š”์ฒญ๋ฌธ ์ƒ˜ํ”Œ

https://nid.naver.com/oauth2.0/token?grant_type=authorization_code&client_id=jyvqXeaVOVmV&client_secret=527300A0_COq1_XV33cf&code=EIc5bFrl4RibFls1&state=9kgsGTfH4j7IyAkg  

 

 

NaverApi 

public String getAccessToken(String code, String state)
{
    String reqUrl = "https://nid.naver.com/oauth2.0/token";
    RestTemplate restTemplate = new RestTemplate();
    
    // HttpHeader Object
    HttpHeaders headers = new HttpHeaders();
    
    // HttpBody Object
    MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
    params.add("grant_type", "authorization_code");
    params.add("client_id", naverClientId);
    params.add("client_secret", naverClientSecret);
    params.add("code", code);
    params.add("state", state);
    
    // http body params ์™€ http headers ๋ฅผ ๊ฐ€์ง„ ์—”ํ‹ฐํ‹ฐ
    HttpEntity<MultiValueMap<String, String>> naverTokenRequest = new HttpEntity<>(params, headers);
    
    // reqUrl๋กœ Http ์š”์ฒญ, POST ๋ฐฉ์‹
    ResponseEntity<String> response = restTemplate.exchange(reqUrl,
                                              HttpMethod.POST,
                                              naverTokenRequest,
                                              String.class);
    
    String responseBody = response.getBody();
    JsonObject asJsonObject = JsonParser.parseString(responseBody).getAsJsonObject();
    return asJsonObject.get("access_token").getAsString();
}

 

-> https://nid.naver.com/oauth2.0/token url๋กœ ์ด์ œ code ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์•ก์„ธ์Šค ์ •๋ณด๋ฅผ ์š”์ฒญํ•œ๋‹ค. 

grant_type์€ ์•ก์„ธ์Šค ํ† ํฐ ์ •๋ณด ๋ฐœ๊ธ‰์ด๊ธฐ ๋•Œ๋ฌธ์— "authorization_code"๋กœ ๊ณ ์ •ํ•œ๋‹ค. 

client_id, client_secret ์€ yml ์—์„œ ๊ฐ€์ ธ์˜จ ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๊ณ  code๋Š” ์ฝœ๋ฐฑํ•  ๋•Œ ๋ฐ›์€ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•ด์ค€๋‹ค. 

 

-> ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์ •๋ณด๋กœ access_token์„ ๋ฐ›์•„์„œ ์ด์ œ ์ด๊ฑธ ํ†ตํ•ด ์‚ฌ์šฉ์ž ํ”„๋กœํ•„ api๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

3๏ธโƒฃ ์ ‘๊ทผ ํ† ํฐ์„ ์ด์šฉํ•˜์—ฌ ํ”„๋กœํ•„ API ํ˜ธ์ถœํ•˜๊ธฐ 

-> ์ ‘๊ทผ ํ† ํฐ์„ ์ด์šฉํ•˜๋ฉด ํ”„๋กœํ•„ ์ •๋ณด ์กฐํšŒ API๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ์˜คํ”ˆ API๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. 

๊ทผ๋ฐ ์‚ฌ์šฉ์ž ๋กœ๊ทธ์ธ ์ •๋ณด๋ฅผ ํš๋“ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์šฐ์„  ํ”„๋กœํ•„ ์ •๋ณด ์กฐํšŒ API๋ฅผ ๋จผ์ € ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค. 

์—ฌ๊ธฐ์„œ ๊ฐ€์ ธ์˜จ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์ด์ œ ์šฐ๋ฆฌ ์„œ๋น„์Šค์— ๋“ฑ๋ก๋œ ํšŒ์›์ธ์ง€ ์•„๋‹Œ์ง€ ํŒ๋‹จ ํ›„ ์—†์œผ๋ฉด ํšŒ์›๊ฐ€์ž… ์ง„ํ–‰ํ•˜๊ณ , ์žˆ์œผ๋ฉด ๋กœ๊ทธ์ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋ฉด ๋œ๋‹ค. 

 

NaverApi 

public NaverProfile getUserInfo(String accessToken)
{
    String reqUrl = "https://openapi.naver.com/v1/nid/me";
    
    RestTemplate restTemplate = new RestTemplate();
    
    // HttpHeader ์˜ค๋ธŒ์ ํŠธ
    HttpHeaders headers = new HttpHeaders();
    headers.add("Authorization", "Bearer " + accessToken);
    
    HttpEntity<MultiValueMap<String, String>> naverProfileRequest = new HttpEntity<>(headers);
    
    ResponseEntity<String> response = restTemplate.exchange(reqUrl,
                                              HttpMethod.POST,
                                              naverProfileRequest,
                                              String.class);
    
    System.out.println("response = " + response);
    NaverProfile naverProfile = new NaverProfile(response.getBody());
    
    return naverProfile;
}

-> https://openapi.naver.com/v1/nid/me ์ด url ์„ ํ†ตํ•ด ์š”์ฒญ ํ—ค๋”์— Authorization์— ์ ‘๊ทผ ํ† ํฐ์„ ๋„ฃ์–ด ์ „๋‹ฌํ•˜๋ฉด ๋œ๋‹ค. 

 

์š”์ฒญ๋ฌธ ์˜ˆ์‹œ

curl  -XGET "https://openapi.naver.com/v1/nid/me" \
      -H "Authorization: Bearer AAAAPIuf0L+qfDkMABQ3IJ8heq2mlw71DojBj3oc2Z6OxMQESVSrtR0dbvsiQbPbP1/cxva23n7mQShtfK4pchdk/rc="

 

 

 

 

 TestController 

@ResponseBody
@GetMapping("/login/naver/code")
public Map<String, Object> naverLogin(@RequestParam(name = "code") String code, @RequestParam(name = "state") String state)
{
    Map<String, Object> map = new HashMap<>();
    // 1. ์ธ๊ฐ€ ์ฝ”๋“œ ๋ฐ›๊ธฐ -> @RequestParam String code
    
    // 2. ์ ‘๊ทผ ํ† ํฐ ๋ฐœ๊ธ‰ ์š”์ฒญ
    String accessToken = naverApi.getAccessToken(code, state);
    System.out.println("accessToken = " + accessToken);
    
    // 3. ์‚ฌ์šฉ์ž ์ •๋ณด ๋ฐ›๊ธฐ
    NaverProfile userInfo = naverApi.getUserInfo(accessToken);
    map.put("id", userInfo.getId());
    map.put("nickName", userInfo.getNickname());
    map.put("email", userInfo.getEmail());
    map.put("mobile", userInfo.getMobile());
    
    return map;
}

-> getUserInfo ์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋ฐ›์•„์„œ NaverProfile์— ์ƒ์„ฑ์ž๋กœ ์ „๋‹ฌํ•ด ๊ฐ์ฒด ์ƒ์„ฑํ•œ๋‹ค. 

 

NaverProfile 

@Getter
public class NaverProfile
{
    private String id;
    private String nickname;
    private String email;
    private String mobile;
    
    public NaverProfile(String jsonResponseBody)
    {
       JsonParser jsonParser = new JsonParser();
       JsonElement element = jsonParser.parse(jsonResponseBody);
       
       this.id = element.getAsJsonObject().get("response").getAsJsonObject().get("id").getAsString();
       this.nickname = element.getAsJsonObject().get("response").getAsJsonObject().get("nickname").getAsString();
       this.email = element.getAsJsonObject().get("response").getAsJsonObject().get("email").getAsString();
       this.mobile = element.getAsJsonObject().get("response").getAsJsonObject().get("mobile").getAsString();
    }
}

 

-> ์‹คํ–‰ํ™”๋ฉด์ด๊ณ  ์—ฌ๊ธฐ์„œ ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ๋กœ๊ทธ์ธ ์ˆ˜ํ–‰ํ›„ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ json์œผ๋กœ ์ถœ๋ ฅํ•˜๋Š” ํ™”๋ฉด์œผ๋กœ ์šฐ์„  ๋งˆ๋ฌด๋ฆฌ ํ–ˆ๋‹ค. 

-> ์ด ํ”„๋กœ์ ํŠธ?๋Š” ๋‹จ์ˆœํžˆ ๋„ค์ด๋ฒ„ ๋กœ๊ทธ์ธ api๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๋Š” ์ƒ˜ํ”Œ ํ”„๋กœ์ ํŠธ์ด๊ณ  ์ด์ œ ์—ฌ๊ธฐ์„œ ๋” ๋‚˜์•„๊ฐ€ ํšŒ์› ๊ฐ€์ž… ๋ฐ ๋กœ๊ทธ์ธ ์ฒ˜๋ฆฌ๋Š” ์ง์ ‘ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•ด์ฃผ๋ฉด ๋œ๋‹ค. 

 

 

 

 

 

 

 

 

 

 

 

 

728x90