본문 바로가기
3th Party Util

Spring에서 카카오 로그인 사용하기 - Spring Security 5, OAuth 2

by kakao-TAM kakao-TAM 2021. 1. 27.

OAuth2의 이해

oauth.net/2/

 

OAuth 2.0 — OAuth

OAuth 2.0 OAuth 2.0 is the industry-standard protocol for authorization. OAuth 2.0 focuses on client developer simplicity while providing specific authorization flows for web applications, desktop applications, mobile phones, and living room devices. This

oauth.net

OAuth 2.0은 인증을 위한 업계 표준 프로토콜로 클라이언트 개발자의 단순성에 초점을 맞추면서 다양한 장치에 대한 특정 인증 흐름을 제공합니다. 이 사양은 2012년 10월 IETF OAuth 워킹 그룹 내에서 개발되었습니다.

<OAuth2 인증 흐름>

OAuth 2 인증 흐름은 리소스 소유자에게 인가 요청을 하여 Code를 받고, Code를 이용하여 인증 서버에서 액세스 토큰을 받은 후, 액세스 토큰을 이용하여 자원 서버에서 필요한 리소스를 조회하는 간단한 개념입니다. 

 

Spring Social의 지원 종료 

Spring Security 5가 출시됨(2018년 03월 06일)에 따라 기존에 사용하던 Spring Social은 Spring Security의 일부가되었습니다. Spring Social은 2019년 7월 3일에 종료되었습니다.

 

Spring Security 5에서 OAuth2 사용하기

SpringToolSuite4의 Spring Stater Project 기능을 이용해서 프로젝트를 생성합니다.

spring.io/tools

 

Spring Tools 4 is the next generation of Spring tooling

Largely rebuilt from scratch, Spring Tools 4 provides world-class support for developing Spring-based enterprise applications, whether you prefer Eclipse, Visual Studio Code, or Theia IDE.

spring.io

File > New > Spring Starter Project

java 소스 코드 폴더에 SecurityConfig.java 파일과 KakaoOAuth2UserService.java 파일

resources 폴더에 application.yml 파일을 생성합니다.

▶ application.yml

spring:
  security:
    oauth2:
      client:
        registration:
          kakao:
            authorization-grant-type: authorization_code
            client-id: 444444444444444479e933556a21e8
            client-secret: QQQQQQQQQQQQQQQQuOfOLzjZMc5q1U
            redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
            scope:
              - profile
              - account_email
            client-authentication-method: POST
            client-name: Kakao

        provider:
         
          kakao:
            authorization-uri: https://kauth.kakao.com/oauth/authorize
            token-uri: https://kauth.kakao.com/oauth/token
            user-info-uri: https://kapi.kakao.com/v2/user/me
            user-name-attribute: id

※ client-id에는 REST-API-KEY를 세팅합니다.

@RequiredArgsConstructor 어노테이션 사용을 위해 build.gradle파일에 annotationProcessor도 추가합니다.

annotationProcessor 'org.projectlombok:lombok'

 

▶ SecurityConfig.java

package com.example.demo;

import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
	private final KakaoOAuth2UserService kakaoOAuth2UserService;

	@Override
    protected void configure(HttpSecurity http) throws Exception {
        http.oauth2Login().userInfoEndpoint().userService(kakaoOAuth2UserService); 
    }
	
}

KakaoOAuth2UserService.java

package com.example.demo;

import java.util.Collections;
import java.util.Map;

import javax.servlet.http.HttpSession;

import org.springframework.security.core.authority.SimpleGrantedAuthority;
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.DefaultOAuth2User;
import org.springframework.security.oauth2.core.user.OAuth2User;
import org.springframework.stereotype.Service;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@RequiredArgsConstructor
@Service
public class KakaoOAuth2UserService extends DefaultOAuth2UserService{

    private final HttpSession httpSession;

    @Override
    public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {
    	OAuth2User oAuth2User = super.loadUser(userRequest);
    	Map<String, Object> attributes = oAuth2User.getAttributes();

        log.info("attributes :: "+attributes);    	
    	
        httpSession.setAttribute("login_info", attributes);

        return new DefaultOAuth2User( Collections.singleton(new SimpleGrantedAuthority("ROLE_USER")), attributes, "id" );
    }
}

Spring Security5를 이용하여 카카오 로그인 OAuth2를 구현하기 위한 가장 간단한 소스코드를 위해 많은 부분을 생략 하고 인증 부분만 구현 하였습니다. Spring을 구동하여 http://localhost:8080/login 으로 접근하면 Default 로그인 페이지가 표시됩니다. 

링크는 application.yml에 정의된 authorization-uri에 다음과 같이 파라메터를 구성하여 세팅됩니다.

kakao에서 로그인 이후 호출된 CallBack URI에서 리턴받은 code를 이용하여 토큰 요청을 하고 받은 토큰을 이용하여 DefaultOAuth2UserService를 상속받은 KakaoOAuth2UserService의 loadUser 함수 호출로 프로필 정보를 조회합니다.

 

로그인 성공 이후 리다이렉트 페이지를 구성하지 않았지만, Console 로그에 프로필을 정상적으로 조회 했음을 확인할 수 있습니다. 

 

 

댓글2