목표
OAuth2를 통한 소셜 인증을 한 사용자에게 ROLE_A 권한을 주어 DB에 저장한 후, JWTFilter에서 ROLE_A권한을 가진 유저는 Exception을 발생시켜 프론트가 백엔드의 추가 정보 기입 엔드포인트로 다시 요청을 보내게끔 유도하는 것이 목표이다.
구조도
첫번째 로직(빨간선)
/oauth2/authorization/서비스명 으로 소셜로그인 신청이 들어오면, Default로 설정된 필터를 거쳐 소셜 인증 서버가 제공하는 로그인 창으로 연결된다.
이후 로그인에 성공한다면 YML에 설정해둔 리다이렉트 URL로 연결되고, 성공 코드를 획득하게 된다.두번째 로직(파란선)
YML에서 설정한대로 /login/oauth2/code/서비스명 으로 로그인 성공 코드가 들어오고, 다시 Defualt로 설정된 필터를 거쳐 OAuth2LoginAuthenticationProvider가 코드를 사용하여 소셜 인증 서버가 Access 토큰을 발급한다.
세번째 로직(핑크선)
획득한 Access토큰으로 소셜 리소스 서버에 신청해둔 유저의 정보를 받고, 해당 정보를 (Custom)OAuth2Service에 넘겨 우리 서버의 DB에 저장한 후, (Custom)OAuth2User 객체의 형식으로 다시 Provider에 돌려준다.
네번째 로직(갈색선)
이제 로그인에 성공한 것이므로, (Custom)LoginSuccessHandler에서 (Custom)JWTUtil을 통하여 원하는 유저의 정보를 포함한 JWT를 발급한 후, 쿠키에 넣어 프론트(클라이언트)에게 반환한다.
다섯번째 로직(초록선)
이후 발급받은 JWT를 통하여 프론트는 백에게 API요청을 할 때, 헤더에 토큰을 넣어 보내고, 모든 요청에서 JWTFilter가 JWT의 유효성을 검사한 후, 유효하다면 통과시킨다.
이 과정에서 Role값이 ROLE_A라면 Exception을 발생시켜 프론트로 하여금 추가정보 기입 뷰로 넘어가게 유도하고, 추가적인 엔드포인트에서 추가 정보를 기입받은 유저의 Role값을 ROLE_B로 수정할 계획이다.
Reference