본문 바로가기
프로젝트/SpringSecurity

[Spring Security] 9. OAuth 네이버로그인

by dantriss 2023. 7. 7.

유튜브에서 스프링시큐리티를 심화교육하면서 조금더 레벨업 하고자 한다.

IDE : IntelliJ

언어 : Java 8

스프링부트 버전 : 2.7.13

DB : MySQL

빌드관리 도구 : Maven

OS : iOS

참고유튜브 : 메타코딩


 

 

구글, 페이스북에 이어서 네이버 OAuth 로그인을 진행해보자

네이버 개발자 센터로 이동

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

 

application -> 애플리케이션 등록 선택

 

애플리케이션 이름을 설정해준 후 회원이름과 이메일에 체크

 

서비스 Url에 http://localhost:portnumber 입력

callback url에는 http://localhost:portnumber/login/oauth2/code/naver 입력

 

아이디와 비밀번호는 application.yml에 작성을 해야하기 때문에 메모장에 적어놓거나 페이지 유지

 

loginForm에서 네이버 로그인 a태그 추가

 

application.yml에 다음과 같이 작성 해준다.

구글과 페이스북은 정식으로 지원해주기 때문에 provider를 작성해줄 필요 없지만 네이버는 지원을 해주지 않기 때문에

우리가 직접 설정을 해줘야 한다.

client-id 와 client-secret 에 아까 애플리케이션 정보에 있던 아이디와 비밀번호를 입력해준다.

naver:
    client-id: 아이디
    client-secret: 비밀번호
    scope:
      - name
      - email
      - profile_image
    client-name: Naver
    authorization-grant-type: authorization_code
    redirect-uri: http://localhost:8088/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

 

provider에 왜 해당 주소들을 넣어야 하는지 개발가이드를 보면 확인할 수 있다.

https://developers.naver.com/docs/login/devguide/devguide.md#3-1-1-%EC%84%9C%EB%B9%84%EC%8A%A4-%ED%99%98%EA%B2%BD-%ED%99%95%EC%9D%B8

 

application.yml을 설정 후 provider패키지에서 GoogleUserInfo클래스를 복사해서 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");
    }
}

 

서버를 실행해서 네이버로 로그인을 시도를 해서 해당 유저의 정보를 확인해보기 위해서 /user로 접근을 시도하면 서버에선 에러가 발생하고 콘솔에선 해당 유저의 정보를 확인할 수 있다.

여기서 중요한점은 response에 아이디와 이메일, 이름이 담겨져서 값이 넘어온다는 점이다.

 

그렇기 때문에 PrincipalOauth2UserService로 이동해서 아래와 같이 수정해준다.

NaverUserInfo에 response에 담겨진 정보들을 Map타입으로 형변환을 한 후 값을 db에 저장해주면 된다.

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) oAuth2User.getAttributes().get("response"));

}

 

그 후 다시 네이버로 로그인을 시도해보면 네이버로 로그인을 해도 값이 db에 잘 저장된것을 확인할 수 있다.

댓글