[Spring Security] 8. OAuth2 Naver Login

개발자·2022년 5월 11일
0

Spring Security

목록 보기
8/11
post-thumbnail

OAuth2 네이버 로그인

네이버 로그인을 하기전에 우리가 구글,페이스북 로그인에 사용하던
OAuth2 client 에서 Google,Facebook 은 기본적으로 제공해 주지만,
네이버/카카오 등 나라마다 대형 포털사이트를 모두 제공해주진않는다.

그 이유는 getAttributes 값이 포털 사이트마다 너무 다양하기 때문이다.

구글과 페이스북만 보더라도 provider-id를 "sub" 와 "id" 이렇게 다르게 담아 주었다.

따라서 기본 제공해주지않는 포털사이트 로그인을 위해서는 사이트를 확인해보아야 한다.

순서는 다음과 같이 진행하겠다.

  1. 네이버 개발자 앱 등록
  2. application.yml 설정
  3. 소셜로그인 구분

네이버 개발자 앱 등록

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

다음 사이트에 접속하여 로그인을 진행하면 다음과 같은 화면이 나올 것이다.

여기서 Application > Application 등록 > 애플리케이션 이름 / API설정(네이버로그인) / API서비스환경(웹) > CallBack URL 설정(http://localhost:8080/login/oauth2/code/naver) 을 하면 앱이 생성된다.

생성된 앱을 이용하여 application.yml을 작성한다.

application.yml 설정

  security:
    oauth2:
      client:
        registration:
          google:
            client-id: /**자신의 client-id**/
            client-secret: /**자신의 client-secret**/
            scope: profile,email

          facebook:
            client-id: /**자신의 client-id**/
            client-secret: /**자신의 client-secret**/
            scope: public_profile,email

          naver:
            client-id: /**자신의 client-id**/
            client-secret: /**자신의 client-secret**/
            scope: name,email
            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 #회원 정보를 JSON으로 받는데 response라는 키값으로 네이버가 리턴해줌.
  • autorization-grant-type 은 어떤 방식으로 인증을 할 것인가 이다

  • 우리는 기존에 사용하던 권한 코드 부여 방식을 이용하기 때문에 authorization_code 를 입력해 준다

  • redirect-uri 는 로그인 주소를 적는것이다. 기존의 구글이나 페이스북 같은 경우는 고정이 되어있었기 때문에 적어주지 않았지만 네이버는 적어주어야 한다.

  • 이 경우 기존의 방식을 따르는것이 좋다.

  • provider를 작성하기 위해서는 사이트를 참고하여야한다고 했다.
    https://developers.naver.com/docs/login/devguide/devguide.md
    다음 사이트를 참고하면 이해 할 수 있다.

  • authorization-url : 이 주소로 요청을 하면 네이버 로그인이 뜬다

  • token-uri : 이 주소를 사용하여야 토큰을 받을 수 있다.

  • user-info-uri : 이 주소를 사용하여야 프로필 정보를 받을 수 있다.

  • 다음과 같이 설정한뒤 이제 기존에 했던것과 똑같이 구현하면 된다.

소셜 로그인 구분

PrincipalOauth2UserService

// 회원가입
OAuth2UserInfo oAuth2UserInfo = null;
if(userRequest.getClientRegistration().getRegistrationId().equals("google")){
    System.out.println("구글 로그인 요청");
    oAuth2UserInfo = new GoogleUserInfo(oauth2User.getAttributes());
}else if(userRequest.getClientRegistration().getRegistrationId().equals("facebook")) {
    System.out.println("페이스북 로그인 요청");
    oAuth2UserInfo = new FacebookUserInfo(oauth2User.getAttributes());
}else if(userRequest.getClientRegistration().getRegistrationId().equals("naver")){
    System.out.println("네이버 로그인 요청");
    oAuth2UserInfo = new NaverUserInfo((Map)oauth2User.getAttributes().get("response"));
}else{
    System.out.println("구글, 페이스북,네이버 로그인만 지원합니다.");
}
  • 네이버 로그인으로 들어 올시 NaverUserInfo 클래스를 이용하여 만든다.

  • 네이버로그인은 특이하게 attributes에서 response라는 attribute를 다시 준다. 그 이유는 네이버는 attributes안에 response라는 속성에 id,email등을 보관하기 때문이다.

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

다음과 같이 구현하여 소셜로그인 구글/페이스북/네이버 로그인을 해보았다.

0개의 댓글