현재 개발 중인 프로젝트에 카카오 로그인 연동이 필요해 약 한 달 정도의 긴 기간 동안 Spring Security + OAuth 2.0 Client와 힘든 싸움을 했었다.
연동을 하기까지 많은 공부가 필요했고 시간도 많이 잡아먹으면서 힘들게 연동에 성공했지만, 지금 프로젝트에는 적합하지 않은 몇가지 이유가 생겨서 현재는 라이브러리를 제거하고 직접 구현한 코드로 전부 교체해둔 상황이다. 그렇지만 OAuth2.0 Client를 사용하면서 배운 점이 많고, 또 무엇보다 구현하면서 참고할 레퍼런스가 많지 않아 어려움을 겪었기 때문에 누군가에게 도움이 되길 바라며 기록으로 남겨보고자 한다.
(1)에서는 OAuth2.0 Client에 대한 개념적 이해
(2)에서는 OAuth2.0 Client를 사용했을 때 필터체인의 동작 흐름 및 각 필터의 역할
(3)에서는 OAuth2.0 Client를 사용해서 카카오 로그인을 연동한 실제 코드
(4)에서는 라이브러리를 사용하지 않고 직접 카카오 로그인을 연동한 코드
총 네번에 나눠 기록하고자 하고, (1)에서는 간단히 라이브러리를 이해한 내용을 작성해보았다.
Spring Security는 HTTP 요청을 처리하는 여러 필터의 체인으로 구성된다. 각 필터는 특정한 보안 작업을 수행하게 되는데, OAuth 2.0 Client 라이브러리는 이 체인에 OAuth2와 관련된 필터들을 추가하여 클라이언트의 인증 과정을 처리하는데 도움을 준다.
OAuth2와 관련된 대표적인 필터로는 OAuth2LoginAuthenticationFilter
가 있는데, 여기서는 간단히 언급만 하고 필터에서 처리하는 동작이나 전체적인 흐름에 대해서는 (2)편에서 자세히 녹여보고자 한다.
The OAuth 2.0 Client features provide support for the Client role as defined in the OAuth 2.0 Authorization Framework.
공식문서에서 OAuth2.0 Client
는 OAuth2.0 인증 프레임워크에 정의된 클라이언트의 역할을 지원한다고 소개되고 있다. OAuth에서 정의하고 있는 역할을 이해하고자 개략적으로 그렸던 그림이 있어 함께 첨부한다.
Resource Owner
: 자원(여기서는 사용자 정보)에 대한 접근권한을 가지고 있는 소유자를 말한다. 카카오 사용자인 홍길동이 여기 해당한다. Resource Server
: 카카오 계정 정보와 같은 보호된 자원를 가지고 있는 주체로 access token이 유효한 경우에 이 자원을 제공한다. 카카오 API 서버가 여기 해당한다.Client
: Resource Owner의 승인을 받아 카카오 계정 정보에 접근하고자 하는 외부 어플리케이션을 말한다. 우리는 여기 해당한다. Authorization Server
: Resource Owner가 카카오 계정에 로그인 했는지 여부를 확인하고, Resource Owner의 승인을 받아 access token을 Client에 제공하는 역할을 한다. 카카오 인증 서버가 여기 해당한다.OAuth 2.0 Client 라이브러리는 Client
의 역할을 지원한다고 했는데, Client가 해야 할 역할은 아래와 같이 크게 세가지로 구분된다.
즉, Spring Security의 OAuth2 Client 라이브러리를 사용하면 Spring Security 필터 체인에서 동작하는 여러 필터를 통해 위와 같은 OAuth 2.0 인증 프로세스를 전부 도맡아 처리해준다고 이해하면 된다.
라이브러리를 사용해보고 느낀 장단점은 다음과 같다.
장점
provider
정보만 추가하는 등 간단한 설정만 하면 된다.단점
예를 들면, 인가 코드 요청/받기는 클라이언트에서 직접 수행한 뒤에 서버에 인가코드와 함께 로그인 요청을 보내서 서버는 토큰 요청하기/받기 부터 수행하겠다와 같이 흐름을 직접 제어하는 것이 불가능해진다.
(2)편에서는 실제로 OAuth2.0 Client를 사용했을 때 필터체인이 어떻게 동작하는지 그 흐름을 이해해보고자 한다!