카테고리 없음
스프링시큐리티,JWT,OAuth2.0으로 카카오 소셜 로그인 구현하기-1
_hanbxx_
2023. 7. 11. 12:40
728x90
서비스 등록(네이버,카카오, 구글 등이 존재하지만 현재 나는 카카오로만 구현해보았다)
- 카카오 소셜 로그인 등록
https://developers.kakao.com/console/app
카카오계정
accounts.kakao.com
전체적인 동작 과정
- 소셜 로그인 요청
- 백엔드로 GET “/oauth2/authorization/{provider-id}?redirect_uri=http://localhost:3000/oauth/redirect”으로 OAuth 인가 요청(여기서 provider-id는 kakao나 naver같은 말그대로provider이름)
- Provider별로 Authorization Code 인증을 할 수 있도록 Redirect
- 리다이렉트 화면에서 provider서비스에 로그인
- 로그인이 완료된 후, Authorization Server로부터 백엔드로 Authorization코드 응답
- 백엔드에서 인가 코드를 이용하여 Authorization Server에 엑세스 토큰 요청
- 엑세스 토큰 획득
- 엑세스 토큰을 이용하여 Resource Server에 유저 데이터 요청
- 획득한 유저 데이터를 DB(MySQL사용)에 저장 후, JWT 엑세스 토큰과 리프레시 토큰을 생성
- 리프레시 토큰은 수정 불가능한 쿠키에 저장하고, 엑세스 토큰은 프론트엔드 redirect_URI에 쿼리스트링에 토큰을 담아 리다이렉트(GET http://localhost:3000/oauth/redirect?token={jwt-token})
- 프론트엔드에서 토큰을 저장 후, API요청 시 헤더에 Authorization: Bearer {token}을 추가하여 요청
- 백엔드에서는 토큰을 확인하여 권한 확인
- 토큰이 만료된 경우, 쿠키에 저장된 리프레시 토큰을 이용하여 엑세스 토큰과 리프레시 토큰을 재발급
전체적인 과정 다이어그램
클래스 설명
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를 나중에 비교할 수 있게 된다.
- 이 클래스는 OAuth2 프로토콜에서 CSRF 공격을 방지하기 위해 사용되는 state 매개 변수를 처리하는 데 도움을 준다.
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}
- 에러 메시지를 query 에 담아 redirect_uri 쿠키에 담겨져있던 곳으로 리다이렉트 된다
- 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