이 애플리케이션의 기존 Spring Security 코드는 Spring Security OAuth 2 Client 모듈을 사용한다.
본인 또한 Spring Security에 대한 공부가 미진하여 Spring Security OAuth 2 Client를 정확히 어떻게 활용해야 하는지는 잘 모르지만,
내가 알기로는 Spring Security OAuth 2 Client는 Spring 애플리케이션을 통해 로그인을 수행하기 위해 사용하는 걸로 알고 있다.
그러나 내가 생각하는 Spring Security를 통한 OAuth 2.0 구조는 다음과 같다.
클라이언트에서 카카오/구글 로그인을 수행한다.
Redirect URI (Spring 백엔드 서버)로 이동
Redirect URI에서 매핑된 컨트롤러에서 Authorization Server에서 받아온 3rd party 정보를 데이터베이스에 저장하고, Access Token (과 Refresh Token)을 반환한다.
이후 클라이언트에서 Resource Server (Spring 백엔드 서버)로 접근할 때 Authorization Server에서 발급받은 Access Token으로 Authentication과 Authorization을 수행한다.
Access Token을 통해 Authorization Server에서 이메일 등 사용자 ID를 가지고 오면 ID를 Search Key로 하여 데이터베이스에서 우리 서비스에 저장된 회원 정보를 가져온다. 회원 정보의 인가 권한을 확인하여 허용된 리소스에 대한 접근인지 검증한다.
이는 Spring Security OAuth2 Resource Server 모듈로 구현할 수 있다. 미리 이 모듈을 사용해 연습 삼아 카카오 로그인을 구현해 보았다.
이 레포지토리에서 확인할 수 있다 (아 맞네, 이 레포지토리 private으로 해 놨네)
내가 생각한 구조를 구현하기 위해 다음을 수행한다.
[x] spring-boot-starter-oauth2-client dependency를 삭제하고 spring-boot-starter-oauth2-resource-server dependency 추가
[x] OAuth 2.0 Login을 위한 Redirect URI end point 구현, 이때 사용자 데이터베이스에 저장
이때 생성되는 Access Token은 구글 로그인인지 카카오 로그인인지 알 수 있도록 Access token 앞에 Issuer를 붙이고 CSV로 구분한다.
[x] OAuth 2.0 Login 요청을 보내는 OpaqueTokenIntrospector 인터페이스 구현 및 Spring Security 설정에 등록
DelegatingOpaqueTokenIntrospector 클래스를 정의함으로써 카카오 로그인, 구글 로그인 등 여러 Opaque Token에 대응할 수 있도록 한다.
[x] 차후 자체 회원가입 기능을 구현할 가능성이 있으므로 JWT 기반 인증/인가 로직도 구현한다.
이 애플리케이션의 기존 Spring Security 코드는 Spring Security OAuth 2 Client 모듈을 사용한다. 본인 또한 Spring Security에 대한 공부가 미진하여 Spring Security OAuth 2 Client를 정확히 어떻게 활용해야 하는지는 잘 모르지만, 내가 알기로는 Spring Security OAuth 2 Client는 Spring 애플리케이션을 통해 로그인을 수행하기 위해 사용하는 걸로 알고 있다. 그러나 내가 생각하는 Spring Security를 통한 OAuth 2.0 구조는 다음과 같다.
이는 Spring Security OAuth2 Resource Server 모듈로 구현할 수 있다. 미리 이 모듈을 사용해 연습 삼아 카카오 로그인을 구현해 보았다. 이 레포지토리에서 확인할 수 있다 (아 맞네, 이 레포지토리 private으로 해 놨네)
내가 생각한 구조를 구현하기 위해 다음을 수행한다.
OpaqueTokenIntrospector
인터페이스 구현 및 Spring Security 설정에 등록DelegatingOpaqueTokenIntrospector
클래스를 정의함으로써 카카오 로그인, 구글 로그인 등 여러 Opaque Token에 대응할 수 있도록 한다.아직 백엔드 팀원이 오지 않았으므로 일단 컨벤션은 임의로 한다.