[Spring Boot] 스프링 시큐리티, 네이버 OAuth 2.0 로그인

2020. 9. 17. 21:51Spring/Spring Boot

1. 네이버 로그인

1) 네이버 오픈 API

네이버 오픈 API에 필요한 항목을 채운다.(developers.naver.com/apps/#/register?api=nvlogin)

네이버 오픈 API

2) application-oauth.properties

발급받은 클라이언트 ID와 비밀 보안 키를 등록한다. 네이버에서는 스프링 시큐리티를 공식 지원하지 않기 때문에 CommonOAuth2Provider에서 해주던 값들도 전부 수동으로 입력해주어야 한다.

어노테이션 및 코드 설명
user_name_attribute=response 기준이 되는 user_name의 이름을 네이버에서는 response로 지정해야한다. 그 이유는 네이버의 회원 조회 시 반환되는 JSON 결과의 응답값 최상위 필드가 resultCode, message, response이며, response가 본문을 담고 있기 때문이다.
# registration
spring.security.oauth2.client.registration.naver.client-id=[클라이언트 ID]
spring.security.oauth2.client.registration.naver.client-secret=[클라이언트 비밀 키]
spring.security.oauth2.client.registration.naver.redirect-uri={baseUrl}/{action}/oauth2/code/{registrationId}
spring.security.oauth2.client.registration.naver.authorization-grant-type=authorization_code
spring.security.oauth2.client.registration.naver.scope=name,email,profile_image
spring.security.oauth2.client.registration.naver.client-name=Naver

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

3) OAuthAttributes.java

기존에 생성한 클래스에 네이버인지 판단하는 코드와 네이버 생성자만 추가해주면 된다.

package com.springbook.biz.config.auth.dto;

import com.springbook.biz.domain.user.Role;
import com.springbook.biz.domain.user.User;
import lombok.Builder;
import lombok.Getter;

import java.util.Map;

@Getter
public class OAuthAttributes {

    ...

    public static OAuthAttributes of(String registrationId, String userNameAttributeName, Map<String, Object> attributes) {
        // 추가될 내용
        if("naver".equals(registrationId)) {
            return ofNaver("id", attributes);
        }
        return ofGoogle(userNameAttributeName, attributes);
    }

    ...

    private static OAuthAttributes ofNaver(String userNameAttributeName, Map<String, Object> attributes) {
        Map<String, Object> response = (Map<String, Object>) attributes.get("response");
        
        return OAuthAttributes.builder()
                .name((String) response.get("name"))
                .email((String) response.get("email"))
                .picture((String) response.get("profile_image"))
                .attributes(response)
                .nameAttributeKey(userNameAttributeName)
                .build();
    }
    
    ...
}

4) index.mustache

네이버 로그인 버튼에 해당하는 네이버 로그인 URL은 application-oauth.properties에 등록한 redirect-uri 값에 맞춰 자동으로 등록된다. /oauth/authorization/ 까지는 고정이며 마지막 Path만 각 소셜 로그인 코드를 사용하면된다. 현재 진행된 프로젝트의 마지막 Path는 naver 이다.

5) 구현 화면

구현 화면


[참고] 스프링 부트와 AWS로 혼자 구현하는 웹 서비스

728x90