Spring Security Oauth 2.0 with naver

수정이·2022년 8월 20일
0

security-jwt

목록 보기
4/7
post-thumbnail

Naver API를 사용해서 로그인하기

OAuth2.0-Client가 제공하는 Provider는 "Google", "Facebook", "Twitter"가 있다.
이 3개를 제외하고 다른 포털사이트를 통해 로그인을 하려면 application.yml에 몇가지를 추가해야한다.

application.yml 설정하기

spring:
  security:
    oauth2:
      client:
        registration:
          naver:
            client-id: C8Y__XpYiQ588321H6do
            client-secret: pJWthHNMnZ
            scope:
              - name
              - email
  #              - profile-image
            client-name: Naver
            authorization-grant-type: authorization_code
            redirect-uri: http://localhost:8080/login/oauth2/code/naver

        provider:
          naver:
            authorization-uri: https://nid.naver.com/oauth2.0/authorize
            token-uri: https://nid.naver.com/oauth2.0/token
            user-info-uri: https://openapi.naver.com/v1/nid/me
            user-name-attribute: response 

기존 구글과 페이스북으로 로그인 할 때, 추가한 코드보다 훨씬 더 많이 추가했다.

authorization-grant-type : 권한 부여 방식의 종류를 선택하는 것이다. 우리는 "authorization_code" 방식을 사용한다.

redirect-uri : 소셜 로그인을 통해 인증 받고 우리 페이지로 돌아올 경로를 설정한다.

provider 전까지만 설정하면 네이버 로그인 창이 떠서 로그인은 가능하지만, OAuth2-client에 provider로 저장이 되어있지 않아 NPE가 발생한다.

이제 provider에 naver를 추가해보자.

authorization-uri : 네이버 로그인 인증 요청 URI이다.

token-uri : 네이버 로그인 인증이 완료되면 "code"값을 콜백해주는데, 콜백해준 "code"값을 통해 접근 토큰 발급 요청하는 URI이다.

user-info-uri : 접근 토큰을 이용하여 프로필 API를 호출하는 URI이다.

user-name-attribute : 이따가 보여주겠지만, 네이버 사용자의 정보가 "response"안에 들어있다.


네이버 로그인을 통해 회원가입하기

이제 설정을 완료했으니 회원가입을 해보겠다. 추가 코드는 별로 없다.

우선 NaverUserInfo 클래스를 만들어 주자.

public class NaverUserInfo implements OAuth2UserInfo{

    private Map<String, Object> attributes;

    public NaverUserInfo(Map<String, Object> attributes) {
        this.attributes = attributes;
    }

    @Override
    public String getProviderId() {
        return (String) attributes.get("id");
    }

    @Override
    public String getProvider() {
        return "naver";
    }

    @Override
    public String getEmail() {
        return (String) attributes.get("email");
    }

    @Override
    public String getName() {
        return (String) attributes.get("name");
    }
}

이제 PrincipalOauth2UserService 클래스에서 몇가지 코드만 추가하기 전에 response에 대해서 설명하고 추가하자.

OAuth2User oAuth2User = super.loadUser(userRequest);
System.out.println("oAuth2User.getAttributes() = " + oAuth2User.getAttributes());

PrincipalOauth2UserService 클래스 안에 위 코드가 들어있다.
oAuth2User.getAttributes()는 토큰을 통해 받은 사용자의 정보가 Map타입으로 구성되어 있는데, 이 정보를 가져오는 코드이다.
이 코드를 실행시키면 다음과 같다.

oAuth2User.getAttributes() = {
resultcode=00, 
message=success, 
response={id=5AOZZVMtYjR..., email=zz1996zz@naver.com, name=이정수}
}

출력결과를 보면 우리가 필요한 정보는 "response"라는 키의 값으로 들어가있다.
그래서 우리가 그렇게 설정한 것이다.

이제 "response" 안에 있는 정보를 NaverUserInfo 객체에 넘겨주면 된다.
다음 코드만 추가하면 끝이다.

else if (userRequest.getClientRegistration().getRegistrationId().equals("naver")) {
    System.out.println("네이버 로그인 요청");
    oAuth2UserInfo = new NaverUserInfo((Map) oAuth2User.getAttributes().get("response"));
}

"response"도 Map의 형태이기 때문에 Map으로 캐스팅해준 다음에 넘겨주었다.

이렇게 추가하면 네이버 로그인도 완성이다.


참고

스프링부트 시큐리티 & JWT 강의

0개의 댓글