SpringBoot Security 없이 Oauth2.0 로그인 Naver편
- 우아한테크코스
- 2021. 7. 6. 10:16
Naver Developers 방문
Naver Developers에 방문해서 애플리케이션 등록을 해준다.
애플리케이션 등록을 하면 Client ID와 Client Secret을 얻을 수 있다.
서비스 URL과 네이버아이디로그인 Callback URL을 설정해 준다. 애플리케이션의 API 설정에서 설정 가능하다.
인가 코드 받기
먼저 네이버로 로그인 버튼을 눌렀을 때 이동 할 URL을 생성해야 한다. 이 과정에서 사용자는 네이버에 로그인 인증을 수행하고, 네아로 연동 동의과정을 수행 할 수 있다. 사용자가 로그인 연동에 동의하였을 경우 동의 정보를 포함하여 Callback URL로 전송된다.
아래 요청문 샘플을 사용해서 URL을 만들어 보자.
https://nid.naver.com/oauth2.0/authorize?response_type=code&client_id=CLIENT_ID&state=STATE_STRING&redirect_uri=CALLBACK_URL
리다이렉트 요청을 받도록 Controller를 구현한다. 현재 리다이렉트 URL은 http://localhost:8080/naver/auth이다.
@RestController
@RequestMapping("/naver")
public class NaverController {
@GetMapping("/auth")
public String authNaver(@RequestParam String code) {
return "code : " + code;
}
}
인가코드를 얻는데 성공하였다. 네이버는 AccessToken을 얻기 위해 state값도 필요하므로 저장해둔다.
Access Token 받기
위의 Callback으로 전달받은 정보를 이용하여 접근 토큰을 발급받을 수 있다. 접근 토큰은 사용자가 인증을 완료했다는 것을 보장할 수 있는 인증 정보이다. 이 접근 토큰을 이용하여 프로필 API를 호출하거나 오픈 API를 호출하는것이 가능하다.
Callback으로 부터 전달받은 'code'값을 이용하여 '접근토큰발급API'를 호출하게 되면 API 응답으로 접근토큰에 대한 정보를 받을 수 있다. 'code'값을 이용한 API호출은 최초 1번만 수행할 수 있으며 접근 토큰 발급이 완료되면 사용된 'code'는 더 이상 재사용할수 없다.
아래는 요청문의 샘플이다. 아래는 GET요청을 보낼때의 예시이다.
https://nid.naver.com/oauth2.0/token?grant_type=authorization_code&client_id=jyvqXeaVOVmV&client_secret=527300A0_COq1_XV33cf&code=EIc5bFrl4RibFls1&state=9kgsGTfH4j7IyAkg
이번 포스팅에서는 이전 카카오 oauth를 사용할 때와 마찬가지로 POST형식으로 요청을 보낼 것이다.
아래와 같이 request 객체를 만들어 준다.
private HttpEntity<MultiValueMap<String, String>> generateAuthCodeRequest(String code, String state) {
HttpHeaders headers = new HttpHeaders();
headers.add("Content-type", "application/x-www-form-urlencoded;charset=utf-8");
MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
params.add("grant_type", "authorization_code");
params.add("client_id", CLIENT_ID);
params.add("client_secret", CLIENT_SECRET);
params.add("code", code);
return new HttpEntity<>(params, headers);
}
RestTemplate를 사용해서 요청을 보낸다.
private ResponseEntity<String> requestAccessToken(HttpEntity request) {
RestTemplate restTemplate = new RestTemplate();
return restTemplate.exchange(
"https://nid.naver.com/oauth2.0/token",
HttpMethod.POST,
request,
String.class
);
}
여기까지 마친다면 access token을 얻어오는데 성공했다!! 👏
Access Token으로 사용자 허용 프로필 API 호출
이제 얻는 AccessToken으로 사용자의 프로필을 얻어보자. 아래 표를 참고하여 RestTemaple으로 요청을 날려보자.
accessToken은 AccessToken API를 통해 얻어온 JSON응답을 파싱하여 전달하였다.
private ResponseEntity<String> requestProfile(HttpEntity request) {
RestTemplate restTemplate = new RestTemplate();
return restTemplate.exchange(
"https://openapi.naver.com/v1/nid/me",
HttpMethod.POST,
request,
String.class
);
}
private HttpEntity<MultiValueMap<String, String>> generateProfileRequest(String accessToken) {
HttpHeaders headers = new HttpHeaders();
headers.add("Authorization", "Bearer "+ accessToken);
headers.add("Content-type", "application/x-www-form-urlencoded;charset=utf-8");
return new HttpEntity<>(headers);
}
최종 Controller의 형태이다.
@GetMapping("/auth")
public String authNaver(@RequestParam String code, @RequestParam String state) {
String accessToken = extractAccessToken(requestAccessToken(generateAuthCodeRequest(code, state)).getBody());
return requestProfile(generateProfileRequest(accessToken)).getBody();
}
응답이 성공적으로 들어온 것을 확인하였다...!
>>>>> 오잉 Gmail.................................?
>>>>>>>>>>>> 홀리.......
위의 모든 것은 네이버 개발자 페이지의 로그인 개발가이드를 참고하였다.
예제 코드가 담긴 레포지토리이다.
https://github.com/DWL5/springboot-oauth/tree/auth_login_naver
'우아한테크코스' 카테고리의 다른 글
[팀프로젝트] 2주차 (0) | 2021.07.13 |
---|---|
[팀프로젝트] 1주차 (5) | 2021.07.09 |
SpringBoot Security 없이 Oauth2.0 로그인 Kakao편 (0) | 2021.07.05 |
배포를 해보자 AWS, nginx, HTTPS 그리고 Spring #1 (2) | 2021.06.10 |
자동차 경주 피드백 (0) | 2021.06.09 |