oauth2Login() - API 커스텀 OAuth2AuthorizationRequestResolver

OAuth2AuthorizationRequestResolver

  • Authorization Code Grant 방식에서 클라이언트가 인가 서버로 권한 부여 요청할 때 실행되는 클래스

  • OAuth2AuthorizationRequestResolver는 OAuth 2.0 인가 프레임워크에 정의된 표준 파라미터 외에 다른 파라미터를 추가하는 식으로 인가 요청을 할 때 사용한다.

  • DefaultOAuth2AuthorizationRequestResolver 가 디폴트 구현체로 제공되며 Consumer<> 속성에 커스텀할 내용을 구현한다.

img_33.png

예제 코드

home.html

application.yml

  • client-authentication-methodnone으로 설정하면 PKCE 방식으로 동작하며 클라이언트 인증을 사용하지 않는다.

  • 클라이언트 ID 만 사용하고, 클라이언트 시크릿은 사용하지 않는다.

  • 하지만 액세스 토큰 교환 요청을 위해서는 클라이언트 시크릿이 필요한데, 액세스 토큰 교환 요청을 위해 만들어지는 객체를 보면 클라이언트 시크릿이 포함되지 않는다. 그래서 오류가 발생한다.

img_87.png

  • 만약 none이 아닌 다른 방식으로 사용하면 PKCE 방식으로 동작하기 위한 code_challengecode_challenge_method가 포함되지 않기 때문에 오류가 발생한다.

이럴 때 커스텀 OAuth2AuthorizationRequestResolver를 사용할 수 있다.

  • 커스텀 클래스를 만들어보기 전에 기존에 DefaultOAuth2AuthorizationRequestResolver는 어떻게 처리를 하는지 살펴보자.

  • 다음은 DefaultOAuth2AuthorizationRequestResolver 내부의 일부 코드이다.

  • 코드를 보면 권한 부여 유형authorization_code 방식이 아니면 예외를 발생시키고, 클라이언트 자격 증명 전송 방식none일 때만 PKCE에 대한 설정을 해주고 있다.

img_88.png
img_89.png
  • 그럼 커스텀 클래스를 만들어서 반드시 none 방식이 아니더라도 PKCE에 대한 속성이 추가되도록 해보자.

CustomOAuth2AuthorizationRequestResolver

  • 스프링 시큐리티에 기존에 정의된 기능을 최대한 활용했다.

  • delegate.resolve(request);는 위에서 본 것처럼 권한 부여 유형authorization_code 방식인지를 검사하고 있기 때문에 authorization_code 방식은 그대로 사용해야 한다.

SecurityConfig

  • 최종 액세스 토큰을 교환하기 위한 만들어진 요청 객체를 보면 커스텀 속성과 PKCE 관련 속성들이 정상적으로 설정된 것을 확인할 수 있다.

img_91.png
img_90.png

사실 PKCE 방식은 인가 서버에서 인증을 해제하고 클라이언트 시크릿을 사용하지 않아도 충분히 안전한 방식이다(기본적인 PKCE 방식이면서). 하지만 위와 같이 설정하여 PKCE 방식에 클라이언트 시크릿까지 더하여 더욱 강력한 보안을 구축할 수 있는 것이다.


이전 ↩️ - OAuth 2.0 Client(oauth2Login) - API 커스텀 Authorization BaseUrl & Redirection BaseUrlarrow-up-right

메인 ⏫arrow-up-right

Last updated