스프링 시큐리티 OAuth2/OAuth 2.0 Client Fundamentals

ClientRegistration 이해 및 활용

webmaster 2023. 1. 15. 13:28
728x90

ClientRegistration

  • OAuth 2.0 또는 OpenID Connect 1.0 Provider 에서 클라이언트의 등록 정보를 나타낸다
  • ClientRegistration 은 OpenID Connect Provider의 설정 엔드포인트나 인가 서버의 메타데이터 엔드포인트를 찾아 초기화할 수 있다.
  • ClientRegistrations의 메소드를 사용하면 아래 예제처럼 편리하게 ClientRegistration 을 설정할 수 있다
    • ClientRegistration clientRegistration = ClientRegistrations.fromIssuerLocation(“https://idp.example.com/issuer”).build();
    • 위 코드는 200 응답을 받을 때까지 https://idp.example.com/issuer/.well-known/openid-configuration, https://idp.example.com/.well-known/oauth-authorization-server 에 차례대로 질의해본다

ClientRegistration 자세히 살펴 보기

  • registrationId : ClientRegistration을 식별할 수 있는 유니크한 ID.
  • clientId : 클라이언트 식별자.
  • clientSecret : 클라이언트 secret.
  • clientAuthenticationMethod : provider에서 클라이언트를 인증할 때 사용할 메소드로서 basic, post, none (public 클라이언트) 을 지원한다.
  • authorizationGrantType : OAuth 2.0 인가 프레임워크는 네 가지 권한 부여 타입을 정의하고 있으며 지원하는 값은 authorization_code, implicit, client_credentials, password.
  • redirectUriTemplate : 클라이언트에 등록한 리다이렉트 URL로, 사용자의 인증으로 클라이언트에 접근 권한을 부여하고 나면, 인가 서버가 이 URL로 최종 사용자의 브라우저를 리다이렉트시킨다.
  •  
    Scopes : 인가 요청 플로우에서 클라이언트가 요청한 openid, 이메일, 프로필 등의 scope.
  • clientName : 클라이언트를 나타내는 이름으로 자동 생성되는 로그인 페이지에서 노출하는 등에 사용한다.
  • authorizationUri : 인가 서버의 인가 엔드포인트 URI.
  • tokenUri : 인가 서버의 토큰 엔드포인트 URI.
  • jwkSetUri : 인가 서버에서 JSON 웹 키 (JWK) 셋을 가져올 때 사용할 URI. 이 키 셋엔 ID 토큰의 JSON Web Signature (JWS) 검증할 때 사용할 암호키가 있으며, UserInfo 응답을 검증할 때도 사용할 수 있다.
  • configurationMetadata : OpenID Provider 설정 정보로서 application.properties 에 spring.security.oauth2.client.provider.[providerId].issuerUri를 설정했을 때만 사용할 수 있다.
  • (userInfoEndpoint)uri : 인증된 최종 사용자의 클레임/속성에 접근할 때 사용하는 UserInfo 엔드포인트 URI
  • (userInfoEndpoint)authenticationMethod : UserInfo 엔드포인트로 액세스 토큰을 전송할 때 사용할 인증 메소드. header, form, query 지원한다.
  • userNameAttributeName : UserInfo 응답에 있는 속성 이름으로, 최종 사용자의 이름이나 식별자에 접근할 때 사용한다

CommonOAuth2Provider

CommonOAuth2Provider

  • OAuth 2.0 공급자 정보를 제공하는 클래스로서 글로벌 서비스 제공자 일부는 기본으로 제공되어진다
  • Client ID 와 Client Secret 는 별도로 application.properties 에 작성해야 한다. -> 사용자마다 다르기 때문
  • Naver 나 Kakao 와 같은 국내 공급자 정보는 위의 모든 항목을 수동으로 작성해서 사용해야 한다
  • 클라이언트 기준인 Registration 항목과 서비스 제공자 기준인 Provider 항목으로 구분하여 설정한다
  • application.properties 가 아닌 Java Config 방식으로 ClientRegistration 등록을 설정 할 수 있다
  • ClientRegistration 객체를 생성할 수 있는 빌더 클래스를 반환한다

ClientRegistration 동작 과정

ClientRegistration

    • fromIssuerLocation을 통해 인증 서버에서 user값을 가지고 온다.
      • OIDC 방식 : /.well-known/openid-configuration 에서 값을 가지고 온다.
      • AUTH 방식  : /.well-known/oauth-authorization-server 에서 값을 가지고 온다.
      • 둘중 하나의 방식을 선택해서 값을 가지고 오기만 하면 된다.
  • 얻어온 값을 기반으로 ClientRegistration 객체로 변경하여 사용한다.
  • 만약 application.yml에 읽어온 값과 같은 값이 있다면 우선순위는 application.yml에 작성한 값이 높기 떄문에 읽어온 값을 버리게 된다.

 

728x90