oauth2Login() - API 커스텀 OAuth2AuthorizationRequestResolver
OAuth2AuthorizationRequestResolver
Authorization Code Grant 방식에서 클라이언트가 인가 서버로 권한 부여 요청할 때 실행되는 클래스
OAuth2AuthorizationRequestResolver는 OAuth 2.0 인가 프레임워크에 정의된 표준 파라미터 외에 다른 파라미터를 추가하는 식으로 인가 요청을 할 때 사용한다.DefaultOAuth2AuthorizationRequestResolver가 디폴트 구현체로 제공되며Consumer<>속성에 커스텀할 내용을 구현한다.

예제 코드
home.html
application.yml
client-authentication-method를none으로 설정하면 PKCE 방식으로 동작하며 클라이언트 인증을 사용하지 않는다.즉 클라이언트 ID 만 사용하고, 클라이언트 시크릿은 사용하지 않는다.
하지만 액세스 토큰 교환 요청을 위해서는 클라이언트 시크릿이 필요한데, 액세스 토큰 교환 요청을 위해 만들어지는 객체를 보면 클라이언트 시크릿이 포함되지 않는다. 그래서 오류가 발생한다.
만약
none이 아닌 다른 방식으로 사용하면 PKCE 방식으로 동작하기 위한code_challenge와code_challenge_method가 포함되지 않기 때문에 오류가 발생한다.이럴 때 커스텀 OAuth2AuthorizationRequestResolver를 사용할 수 있다.
커스텀 클래스를 만들어보기 전에 기존에
DefaultOAuth2AuthorizationRequestResolver는 어떻게 처리를 하는지 살펴보자.다음은
DefaultOAuth2AuthorizationRequestResolver내부의 일부 코드이다.코드를 보면 권한 부여 유형이
authorization_code방식이 아니면 예외를 발생시키고, 클라이언트 자격 증명 전송 방식이none일 때만 PKCE에 대한 설정을 해주고 있다.


그럼 커스텀 클래스를 만들어서 반드시
none방식이 아니더라도 PKCE에 대한 속성이 추가되도록 해보자.
CustomOAuth2AuthorizationRequestResolver
스프링 시큐리티에 기존에 정의된 기능을 최대한 활용했다.
delegate.resolve(request);는 위에서 본 것처럼 권한 부여 유형이authorization_code방식인지를 검사하고 있기 때문에authorization_code방식은 그대로 사용해야 한다.
SecurityConfig
최종 액세스 토큰을 교환하기 위한 만들어진 요청 객체를 보면 커스텀 속성과 PKCE 관련 속성들이 정상적으로 설정된 것을 확인할 수 있다.


사실 PKCE 방식은 인가 서버에서 인증을 해제하고 클라이언트 시크릿을 사용하지 않아도 충분히 안전한 방식이다(기본적인 PKCE 방식이면서). 하지만 위와 같이 설정하여 PKCE 방식에 클라이언트 시크릿까지 더하여 더욱 강력한 보안을 구축할 수 있는 것이다.
이전 ↩️ - OAuth 2.0 Client(oauth2Login) - API 커스텀 Authorization BaseUrl & Redirection BaseUrl
Last updated
