Spring Boot + OAuth 2.0

OAuth 란?

OAuth 는 사용자 인증 및 권한 부여을 위한 개방형 표준 프로토콜이다.

사용자의 정보가 있는 리소스 서버에서 제공하는 자원에 대한 접근 권한을 관리하고, 접근 인증을 해주는 기능을 수행한다. 사용자는 이용하고자 하는 서비스 시스템에 정보 제공하지 않고, 원하는 리소스 서버의 서비스를 통해 계정 정보를 사용하여 로그인하고 인증하는 등 서비스 이용 가능하다.

  • OAuth 1.0 : 최초의 OAuth 버전이지만, 현재 기준 사용되지 않는다.
  • OAuth 2.0 : 가장 많이 사용되는 OAuth 버전으로, 다양한 부가 기능을 제공한다.
  • OAuth 2.1 : OAuth 2.0 의 업데이트 버전으로, 보안 및 개인 정보 보호 기능 강화되었다.

OAuth 구조

OAuth 구성

  • Client : 사용자
  • Resource Owner : API DB 사용자
  • Resource Server : API 서버
  • AUthorization Server : OAuth 인증 서버

OAuth Flow

OAuth Flow
(A) Client 가 Social Login 요청
(B) Resource Owner 는 Social Login 할 수 있게 화면 이동
(C) Client 는 Social Login 완료
(D) 로그인이 성공하면 AUthorization Server 는 Client 에게 Access Token 발급
(E) Client 는 발급받은 Token 으로 Resource Server 에게 Resource 를 요청
(D) Resource Server 는 Token 유효한지 검증하고 응답 처리


Kakao Soical Login

Token 종류

  • Access Token : API 호출 권한 인증용 Token
  • Refresh Token : Access Token 갱신용 Token

Kakao Developer 관리

구현 순서

Kakao Login 구현 공통 가이드

RestTemplate Bean 등록

  • Main Application Class 에 RestTemplate Class Bean 등록
@Bean
public RestTemplate getRestTemplate() { return new RestTemplate(); }

GSON dependency 추가

implementation 'com.google.code.gson:gson'

Social Login 관련 설정 추가

spring.social.kakao.client_id=[앱생성시 받은 REST API Key]
spring.social.kakao.redirect=/social/login/kakao
spring.social.kakao.url.login=https://kauth.kakao.com/oauth/authorize
spring.social.kakao.url.token=https://kauth.kakao.com/oauth/token
spring.social.kakao.url.profile=https://kapi.kakao.com/v2/user/me

Social Login 처리 Controller 추가

  • Kakao Login 화면으로 Fowording 할 수 있는 Demo 페이지 연동 처리
  • Kakao 연동 후 redirect 처리

로그인 화면

  • /resource/templates/social/login.ftl
<button onclick="popupKakaoLogin()">KakaoLogin</button>
<script>
    function popupKakaoLogin() {
        window.open('${loginUrl}', 'popupKakaoLogin', 'width=700,height=500,scrollbars=0,toolbar=0,menubar=no');
    }
</script>

(만약 View Mapping 안된다면, Freemarker Bean 등록!)

User Entity 수정

  • provoider 필드 추가
  • Social Login 은 비밀번호가 필요없으므로 password 필드는 Null 허용으로 변경

User JPA Repository 수정

  • Uid 와 Provider 로 회원 정보 조회하는 Method 추가
Optional<User> findByUidAndProvider(String uid, String provider);

Social Login 에 필요한 Model 객체 생성

  • RetKakaoAuth.java
@Getter
@Setter
public class RetKakaoAuth {
    private String access_token;
    private String token_type;
    private String refresh_token;
    private long expires_in;
    private String scope;
}
  • KakaoProfile.java
@Getter
@Setter
@ToString
public class KakaoProfile {
    private Long id;
    private Properties properties;

    @Getter
    @Setter
    @ToString
    private static class Properties {
        private String nickname;
        private String thumbnail_image;
        private String profile_image;
    }
}

Kakao 연동 Service 생성

  • Kakao Token 조회 method 구현
  • Kakao profile 조회 method 구현

Social Login 연동할 REST API 추가

  • Kakao 와 연동 여부 확인한 후 JWT Token 발급 처리

Security Config 관련 설정 수정

  • “/social/**” API 권한 승인 처리

추가

Social Login TEST Flow

  1. /social/login 접속
  2. 소셜 로그인 요청
  3. 소셜 로그인 완료 후 access_token 발급
  4. /swagger-ui.html 접속
  5. /api/sign/signup/{provider} 사용자 가입
    1. 발급받은 Social Login access_token 필요
  6. /api/sign/singin 사용자 로그인하여 JWT Token 발급
  7. 발급받은 JWT Token 으로 API 테스트

Social Login 관련 기타 Class 및 Interface2

RestTemplate Class
  • Spring 에서 지원하는 REST API 를 호출하고 응답 받을 때까지 기다리는 동기 방식의 내장 Class (비동기식은 AsyncRestTemplate.class)
  • HTTP 프로토콜의 메서드들 제공

관련 Github Repository