SpringBoot Security 없이 Oauth2.0 로그인 Naver편

 

Naver Developers 방문

 

Naver Developers에 방문해서 애플리케이션 등록을 해준다.

 

애플리케이션 등록을 하면 Client ID와 Client Secret을 얻을 수 있다.

 

https://developers.naver.com/docs/login/devguide/devguide.md#2-2-1-%EC%86%8C%EC%85%9C-%EB%A1%9C%EA%B7%B8%EC%9D%B8

 

네이버아이디로그인 개발가이드 - LOGIN

네이버아이디로그인 개발가이드 1. 개요 4,200만 네이버 회원을 여러분의 사용자로! 네이버 회원이라면, 여러분의 사이트를 간편하게 이용할 수 있습니다. 전 국민 모두가 가지고 있는 네이버 아

developers.naver.com

 

서비스 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://developers.naver.com/docs/login/devguide/devguide.md#2-2-1-%EC%86%8C%EC%85%9C-%EB%A1%9C%EA%B7%B8%EC%9D%B8

 

네이버아이디로그인 개발가이드 - LOGIN

네이버아이디로그인 개발가이드 1. 개요 4,200만 네이버 회원을 여러분의 사용자로! 네이버 회원이라면, 여러분의 사이트를 간편하게 이용할 수 있습니다. 전 국민 모두가 가지고 있는 네이버 아

developers.naver.com

 

예제 코드가 담긴 레포지토리이다.

 

https://github.com/DWL5/springboot-oauth/tree/auth_login_naver

 

DWL5/springboot-oauth

Contribute to DWL5/springboot-oauth development by creating an account on GitHub.

github.com

 

댓글



Designed by JB FACTORY