[Spring Security] 네이버 로그인하기

2022. 6. 6. 22:16· BE/Spring
목차
  1. 1. 네이버 로그인 준비
  2. 2. Spring Boot 설정
반응형

이 포스팅은 아래의 강의를 참고하였으니 여기에서 공부하시는 것을 추천드립니다.

https://inf.run/tcLk

 

[무료] 스프링부트 시큐리티 & JWT 강의 - 인프런 | 강의

스프링부트 시큐리티에 대한 개념이 잡힙니다., - 강의 소개 | 인프런...

www.inflearn.com


이전 포스팅과 이어지는 내용입니다.

https://ajdahrdl.tistory.com/247

 

 

1. 네이버 로그인 준비

더보기

1) Google에서 '네이버 개발자 센터' 검색 후 네이버 개발자 센터.. 클릭

 

 

2) 로그인 후 상단의 Application - 애플리케이션 등록 메뉴로 이동

 

 

3) 초기 인증 후 API 신청 시, 자신의 상황에 맞게 설정 후 등록하기 클릭

 

 

4) client id와 client secret을 볼 수 있음

 

 

 

2. Spring Boot 설정

1) application.yml 네이버 관련 설정 추가

  security:
    oauth2:
      client:
        registration:
          # 구글 설정
          google:
            client-id: 발급받은 ID
            client-secret: 발급받은 secret
            scope:
              - email
              - profile
              
          # 페이스북 설정
          facebook:
            client-id: 발급받은 ID
            client-secret: 발급받은 secret
            scope:
              - email
              - public_profile
              
          # 네이버 설정
          naver:
            client-id: 발급받은 ID
            client-secret: 발급받은 secret
            scope:
              - name
              - email
            #- profile_image
            client-name: Naver
            authorization-grant-type: authorization_code                  # oauth2의 동작 방식은 여러가지가 있는데, 코드를 응답받는 방식으로 진행한다는 의미
            redirect-uri: http://localhost:8080/login/oauth2/code/naver   # naver의 경우 redirect-uri를 설정해줘야함. (google, facebook의 경우 디폴트로 설정되어 있음)

        # 네이버의 경우, 따로 provider 설정을 추가해줘야 한다.
        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라는 키 값으로 네이버가 리턴해줄 것이다.

 

 

2) 네이버 로그인 시점에 사용할 NaverUserInfo.java 추가

package com.cos.security1.config.oauth2.provider;

import java.util.Map;

public class NaverUserInfo implements OAuth2UserInfo {

    private Map<String, Object> attributes;         // oauth2User.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");
    }
}

 

 

3) PrincipalOauth2UserSerivce에 Naver 로직 추가

package com.cos.security1.config.oauth2;

import com.cos.security1.Repository.UserRepository;
import com.cos.security1.config.auth.PrincipalDetails;
import com.cos.security1.config.oauth2.provider.FacebookUserInfo;
import com.cos.security1.config.oauth2.provider.GoogleUserInfo;
import com.cos.security1.config.oauth2.provider.NaverUserInfo;
import com.cos.security1.config.oauth2.provider.OAuth2UserInfo;
import com.cos.security1.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.oauth2.client.userinfo.DefaultOAuth2UserService;
import org.springframework.security.oauth2.client.userinfo.OAuth2UserRequest;
import org.springframework.security.oauth2.core.OAuth2AuthenticationException;
import org.springframework.security.oauth2.core.user.OAuth2User;
import org.springframework.stereotype.Service;

import java.util.Map;

@Service
public class PrincipalOauth2UserSerivce extends DefaultOAuth2UserService {

    @Autowired
    private BCryptPasswordEncoder bCryptPasswordEncoder;

    @Autowired
    private UserRepository userRepository;

    // 구글 로그인 작동 방식
    // 구글로그인버튼 클릭 > 구글로그인 > code 리턴(OAuth-Client Library) > AccessToken 요청
    // userRequest 정보 > loadUser함수 호출 > 구글로부터 회원 프로필을 받아줌

    // 구글로부터 받은 userRequest 데이터에 대한 후처리 함수
    // 함수 종료 시, @AuthenticationPrincipal 어노테이션이 만들어진다.
    // OAuth2 로그인 시 사용
    @Override
    public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException{
        System.out.println("getClientRegistration: "+userRequest.getClientRegistration());  // registration: 어떤 매체에서 로그인했는지 확인 가능
        System.out.println("getAccessToken: "+userRequest.getAccessToken().getTokenValue());    // access token
        System.out.println("getAttributes: "+super.loadUser(userRequest).getAttributes());      // 프로필 정보

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

        String platform = userRequest.getClientRegistration().getRegistrationId();        // google, facebook, etc
        OAuth2UserInfo oAuth2UserInfo = null;

        if(platform.equals("google")){
            System.out.println("Google을 이용한 로그인");
            oAuth2UserInfo = new GoogleUserInfo(oAuth2User.getAttributes());
        }else if(platform.equals("facebook")){
            System.out.println("Facebook을 이용한 로그인");
            oAuth2UserInfo = new FacebookUserInfo(oAuth2User.getAttributes());
        }else if(platform.equals("naver")){
            System.out.println("naver를 이용한 로그인");
            oAuth2UserInfo = new NaverUserInfo((Map)oAuth2User.getAttributes().get("response"));    // response를 가져와서 넣어주는 이유: 우리가 필요한 건 naver측에서 보내줄 때 response 안에 담아서 보내주기 때문임
        }else{
            System.out.println("다른 플랫폼임. 지원 X");
        }
        String provider = oAuth2UserInfo.getProvider();
        String providerId = oAuth2UserInfo.getProviderId();

        // OAuth2 로그인 시, username과 password는 필요없지만 형식상 넣어줌
        String username = provider + "_" + providerId;
        System.out.println("username: "+username);
        String password = bCryptPasswordEncoder.encode("provider");
        String role = "ROLE_USER";
        String email = oAuth2UserInfo.getEmail();

        User findUser = userRepository.findByUsername(username);

        if(findUser == null){
            findUser = User.builder()
                    .username(username)
                    .password(password)
                    .email(email)
                    .role(role)
                    .provider(provider)
                    .providerId(providerId)
                    .build();

            userRepository.save(findUser);
        }

        return new PrincipalDetails(findUser, oAuth2User.getAttributes());
    }
}

 

반응형

'BE > Spring' 카테고리의 다른 글

[Spring Security] JWT - 2. JWT 필터 설정 및 필터 우선순위 적용 방법  (0) 2022.06.11
[Spring Security] JWT - 1. JWT를 공부하기 전에  (0) 2022.06.09
[Spring Security] 페이스북 로그인하기  (0) 2022.06.03
[Spring Security] oAuth2.0 - 구글로 로그인하기  (0) 2022.06.02
[Spring Security] 계정 생성, 로그인 및 권한 처리  (0) 2022.05.30
  1. 1. 네이버 로그인 준비
  2. 2. Spring Boot 설정
'BE/Spring' 카테고리의 다른 글
  • [Spring Security] JWT - 2. JWT 필터 설정 및 필터 우선순위 적용 방법
  • [Spring Security] JWT - 1. JWT를 공부하기 전에
  • [Spring Security] 페이스북 로그인하기
  • [Spring Security] oAuth2.0 - 구글로 로그인하기
멍목
멍목
개발 관련 새롭게 알게 된 지식이나 좋은 정보들을 메모하는 공간입니다.
반응형
멍목
김멍목의 개발블로그
멍목
전체
오늘
어제
  • 분류 전체보기 (514)
    • BE (190)
      • Spring (21)
      • Java (141)
      • Kotlin (6)
      • JPA (22)
    • FE (33)
      • Javascript (16)
      • Typescript (0)
      • React (5)
      • Vue.js (9)
      • JSP & JSTL (3)
    • DB (32)
      • Oracle (22)
      • MongoDB (10)
    • Algorithm (195)
    • Linux (8)
    • Git (6)
    • etc (42)
    • ---------------------------.. (0)
    • 회계 (4)
      • 전산회계 2급 (4)
    • 잡동사니 (2)

블로그 메뉴

  • 홈
  • 관리

공지사항

인기 글

태그

  • Java to Kotlin
  • Effective Java
  • JPA
  • MongoDB 공부
  • MongoDB with Node.js
  • 자기공부
  • 코테 공부
  • 이펙티브 자바
  • 알고리즘 공부
  • MongoDB 기초부터 실무까지
  • 자바 테스팅 프레임워크
  • 자바 공부
  • 프로젝트로 배우는 Vue.js 3
  • 알고리즘공부
  • 이펙티브자바
  • 자기 공부
  • 자기 개발
  • vue3 공부
  • 더 자바 Java 8
  • java 8
  • 자기개발
  • 더 자바 애플리케이션을 테스트하는 다양한 방법
  • JPA 공부
  • 전산회계 2급 준비
  • 코테공부
  • 자바공부
  • 코틀린
  • Oracle
  • 자바 개발자를 위한 코틀린 입문
  • junit5

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.0
멍목
[Spring Security] 네이버 로그인하기
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.