Spring Security + OAuth2 Client로 카카오 로그인 연동하기 (1)

리리·2024년 9월 1일
1

현재 개발 중인 프로젝트에 카카오 로그인 연동이 필요해 약 한 달 정도의 긴 기간 동안 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 + OAuth 2.0 Client

Spring Security는 HTTP 요청을 처리하는 여러 필터의 체인으로 구성된다. 각 필터는 특정한 보안 작업을 수행하게 되는데, OAuth 2.0 Client 라이브러리는 이 체인에 OAuth2와 관련된 필터들을 추가하여 클라이언트의 인증 과정을 처리하는데 도움을 준다.

OAuth2와 관련된 대표적인 필터로는 OAuth2LoginAuthenticationFilter가 있는데, 여기서는 간단히 언급만 하고 필터에서 처리하는 동작이나 전체적인 흐름에 대해서는 (2)편에서 자세히 녹여보고자 한다.

OAuth2.0 Client의 역할은?

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가 해야 할 역할은 아래와 같이 크게 세가지로 구분된다.

출처 카카오 로그인 REST API 문서
  1. 인가 코드 요청 및 받기
  2. 인가 코드와 함께 엑세스토큰 요청 및 받기
  3. 엑세스토큰과 함께 사용자 정보 요청 및 받기

즉, Spring Security의 OAuth2 Client 라이브러리를 사용하면 Spring Security 필터 체인에서 동작하는 여러 필터를 통해 위와 같은 OAuth 2.0 인증 프로세스를 전부 도맡아 처리해준다고 이해하면 된다.


OAuth2.0 Client의 장단점

라이브러리를 사용해보고 느낀 장단점은 다음과 같다.

장점

  • 인가 코드 받기, 엑세스 토큰 받기, 사용자 정보 조회 등 일련의 과정을 수행하기 위해 Kakao API Server, Kakao Authorization Server로 API 요청을 직접 보낼 필요가 없다. 따라서 HTTP 요청을 보내기 위한 별도의 라이브러리(ex: WebFlux)를 추가할 필요도 없다.
  • application.yml 등의 파일에 provider 정보만 추가하는 등 간단한 설정만 하면 된다.

단점

  • 일련의 인증 과정이 Spring Security와 밀접하게 엮여서 필터 단위로 동작하는데, Spring Security를 사용해본 적이 없다면 초반엔 이 개념과 흐름을 이해하기 어렵고 디버깅이 쉽지 않다.
  • 인증 과정에서 제어권을 라이브러리가 가지며, 인증 흐름을 커스터마이징 할 수 없다.

마지막 문장에 대한 부연설명을 하자면 /oauth2/authorization/kakao로 인증 흐름이 시작됨과 동시에 인가 코드 요청, 토큰 요청, 사용자 정보 조회가 라이브러리에 의해 자동으로 진행되며, 이 인증 흐름에서 read only 파일로 구성된 시큐리티 필터 체인을 연속적으로 통과하게 되기 때문에 인증 흐름 중간에 끼어들거나 커스터마이징 하는 것이 불가능하다고 이해하면 될 것 같다.

예를 들면, 인가 코드 요청/받기는 클라이언트에서 직접 수행한 뒤에 서버에 인가코드와 함께 로그인 요청을 보내서 서버는 토큰 요청하기/받기 부터 수행하겠다와 같이 흐름을 직접 제어하는 것이 불가능해진다.


(2)편에서는 실제로 OAuth2.0 Client를 사용했을 때 필터체인이 어떻게 동작하는지 그 흐름을 이해해보고자 한다!

0개의 댓글