스프링/스프링 시큐리티

OAuth - 네이버 로그인 (provider 직접 등록)

chanhee01 2024. 1. 10. 20:56

스프링에서 기본적으로 구글, 페이스북 같은 로그인을 할 때 각각의 provider를 넘겨준다.

 

하지만 우리나라에서만 사용되는 네이버, 카카오등은 제공되지 않는다.

 

getAttribute

구글 - sub :1234

페이스북 - id : 1234

 

이런 것과 같이 네이버에도 attribute가 있을 것이다.

 

네이버는 기본적으로 provider가 아니기 때문에 직접 등록해줘야 한다. 구글, 페이스북과 같은 방식으로 개발자 사이트에서 애플리케이션 등록을 한 다음에 application.yml에 추가해준다.

 

 

 

application.yml

spring:
  security:
    oauth2:
      client:
        registration:
          naver:
            client-id: g1U5lR4UnvavwMI5XS1Y
            client-secret: DKnleHE7mY
            scope:
              - name
              - email
            client-name: Naver
            authorization-grant-type: authorization_code # 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 # 회원 정보를 json으로 받는데 response라는 키값으로 네이버가 리턴

 

네이버는 oauth-client가 들고있는 라이브러리의 providerId에 포함되어 있지 않기 때문에 provider를 직접 넣어줘야 한다.

(yml 파일은 띄어쓰기를 주의해야 한다.)

 

 

provider의 정보는 naver developers 공식문서에 있으니 저 값들을 활용해주면 된다.

 

 

 

 

NaverUserInfo.class

public class NaverUserInfo implements OAuth2UserInfo {

    private Map<String, Object> attributes; // getAttributes

    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");
    }
}

네이버도 역시 구글, 로그인 등과 같이 UserInfo를 만들어준다.

 

 

 

PrincipalOauth2UserService.class

@Service
public class PrincipalOauth2UserService extends DefaultOAuth2UserService {
    ... (생략)
        OAuth2UserInfo oAuth2UserInfo = null;
        if(userRequest.getClientRegistration().getRegistrationId().equals("google")) {
            oAuth2UserInfo = new GoogleUserInfo(oAuth2User.getAttributes());
        } else if (userRequest.getClientRegistration().getRegistrationId().equals("facebook")) {
            oAuth2UserInfo = new FacebookUserInfo(oAuth2User.getAttributes());
        } else if (userRequest.getClientRegistration().getRegistrationId().equals("naver")) {
            oAuth2UserInfo = new NaverUserInfo((Map<String, Object>) oAuth2User.getAttributes().get("response"));
        }
    ... (생략)
}

네이버일 경우도 추가를 해줘야 하는데, Map을 사용해서 getAttributes().get("response")를 파라미터로 넣어준다.

 

그 이유는 네이버의 getAttributes()의 값이 위와 같기 때문이다.

 

getAttributes()에서 바로 id, email, name을 key-value 형태로 갖는게 아니라 response 안에서 갖기 때문이다.

 

 

직접 등록한 provider인 naver도 회원가입이 잘 된 것을 확인할 수 있다.