카테고리 없음

스프링시큐리티,JWT,OAuth2.0으로 카카오 소셜 로그인 구현하기-1

_hanbxx_ 2023. 7. 11. 12:40
728x90

서비스 등록(네이버,카카오, 구글 등이 존재하지만 현재 나는 카카오로만 구현해보았다)

  1. 카카오 소셜 로그인 등록      

              https://developers.kakao.com/console/app

 

카카오계정

 

accounts.kakao.com

전체적인 동작 과정

 

  1. 소셜 로그인 요청
  2. 백엔드로 GET “/oauth2/authorization/{provider-id}?redirect_uri=http://localhost:3000/oauth/redirect”으로 OAuth 인가 요청(여기서 provider-id는 kakao나 naver같은 말그대로provider이름)
  3. Provider별로 Authorization Code 인증을 할 수 있도록 Redirect
  4. 리다이렉트 화면에서 provider서비스에 로그인
  5. 로그인이 완료된 후, Authorization Server로부터 백엔드로 Authorization코드 응답
  6. 백엔드에서 인가 코드를 이용하여 Authorization Server에 엑세스 토큰 요청
  7. 엑세스 토큰 획득
  8. 엑세스 토큰을 이용하여 Resource Server에 유저 데이터 요청
  9. 획득한 유저 데이터를 DB(MySQL사용)에 저장 후, JWT 엑세스 토큰과 리프레시 토큰을 생성
  10. 리프레시 토큰은 수정 불가능한 쿠키에 저장하고, 엑세스 토큰은 프론트엔드 redirect_URI에 쿼리스트링에 토큰을 담아 리다이렉트(GET http://localhost:3000/oauth/redirect?token={jwt-token})
  11. 프론트엔드에서 토큰을 저장 후, API요청 시 헤더에 Authorization: Bearer {token}을 추가하여 요청
  12. 백엔드에서는 토큰을 확인하여 권한 확인
  13. 토큰이 만료된 경우, 쿠키에 저장된 리프레시 토큰을 이용하여 엑세스 토큰과 리프레시 토큰을 재발급

전체적인 과정 다이어그램

클래스 설명

config 파일

  • AppProperties:
    • OAuth2.class: application.yml에 있는 redirecturi와 프론트엔드 클라이언트가 지정한 redirect uri가 같은지 지정하는 클래스
  • ExpireTime:Refresh token과 access Token의 유효 기간을 상수로 설정해놓음
  • WebConfigure:cors를 설정할 때 사용
  • WebSecurityConfigure:백엔드의 전반적인 보안 설정

controller파일

  • AuthController

cookie파일

  • cookieAuthorizationRequestRepository
    • 이 클래스는 OAuth2 프로토콜에서 CSRF 공격을 방지하기 위해 사용되는 state 매개 변수를 처리하는 데 도움을 준다.

      OAuth2 프로토콜은 보안을 강화하기 위해 CSRF(Cross-Site Request Forgery) 공격을 방지하기 위한 조치를 권장한다. 이를 위해 OAuth2 인증 요청 중에 애플리케이션은 state 매개 변수를 생성하여 인증 요청과 함께 전송한다. OAuth2 공급자는 이 매개 변수를 변경하지 않고 OAuth2 콜백에서 반환한다.

      애플리케이션은 OAuth2 공급자에서 반환된 state 매개 변수의 값을 초기에 보낸 값과 비교하여 일치하지 않으면 인증 요청을 거부한다. 이를 통해 악의적인 공격자가 CSRF 공격을 시도할 때 애플리케이션이 이를 탐지하고 방어할 수 있다.

      `cookieAuthorizationRequestRepository` 클래스는 이 흐름을 구현하기 위해 사용된다. 이 클래스는 state와 redirect_uri 값을 단기(short-lived) 쿠키에 저장하고, 인증 요청 시에 쿠키에서 해당 값을 검색하여 사용한다.

      `cookieAuthorizationRequestRepository` 클래스는 `AuthorizationRequest`를 쿠키에 저장하고 검색하는 기능을 제공한다. 이를 통해 애플리케이션은 OAuth2 공급자에서 반환된 state와 redirect_uri를 나중에 비교할 수 있게 된다.

dto파일

  • userResponseDto:응답을 반환하기 위한 DTO클래스

entity파일

  • BaseDateEntity
  • User:DB의 유저 테이블

enum파일

  • AuthProvider:Kakao인지 Naver 등등인지
  • Role:GUEST인지 USER인지

jwt파일

  • JwtAuthenticationFilter: Request Header에서 Authorization을 가져다가 JWT인증 토큰을 읽어 인증하고 토큰이 유효한 경우 Spring Security의 Security Context를 설정하는 데 사용된다
  • JwtTokenProvider:JWT를 생성하고 인증하는 코드가 포함되어 있다

lib파일

  • CookieUtils:쿠키 저장,삭제를 담당하는 클래스이다

oauth2파일

  • KakaoOAuth2User:카카오에 요청하여 유저정보를 응답받는 클래스
  • OAuth2AuthenticationFailureHandler:로그인 과정 중 실패할 때 처리하는 클래스
    • 에러 메시지를 query 에 담아 redirect_uri 쿠키에 담겨져있던 곳으로 리다이렉트 된다
      -> http://localhost:3000/oauth2/redirect?error={errorMessage}
  • OAuth2AuthenticationSuccessHandler:OAuth2 로그인 과정이 성공했을 때 처리하는 클래스
  • OAuth2UserInfo:여러 플랫폼을 사용하기 위한 추상클래스
  • OAuth2UserInfoFactory: 각 플랫폼 클래스를 생성하기 위한 Factory패턴을 사용한 클래스
  • UserPrincipal:Security에서 인증 객체로 사용할 클래스

repository파일

  • UserRepository:DAO클래스(Data Access Object Class)

service파일

  • CustomOAuth2UserInfoService:
    • Spring OAuth2에서 제공하는 OAuth2User을 가공하여 OAuth2UserInfo로 만들어주고 이 Info에 Email이 있는지 검사, A라는 플랫폼으로 가입되어있는데 B플랫폼으로 가입하는  경우 검사를 진행하여 이미존재하는 계정에 경우에는 Update를 진행하고 없는 경우에는 새로 Insert하며, UserPrincipal을 리턴한다

 

728x90