
Access Token 유형
- 식별자 타입 (Identifier Type) : 우리플랫폼에서 안씀
- 자체 포함 타입 (Self-contained Type)



클라이언트마다 아이디는 틀릴수가 있겠죠.
그 다음에 클라이언트 아이디와 동시에 클라이언트 시크릿도 생성됩니다.
이 두 값은 향후 클라이언트가 인가서버에 토큰을 요청할 때 사용이됩니다.
response_type은 우리 Authorization Code Grant Type 이므로 code 로 고정해서 사용한다고 보시면 됩니다.
scope : 대신에 인가서버는 클라이언트가 요청한 이런 스코프의 정보가 이미 그쪽에서는 정의가 돼있어야 합니다, 없으면 오류가 납니다.
그렇게 보시면 되고 나중에 스프링 시큐티가 이 스코프를 가지고 authority에 맵핑을 시킵니다
OAuth 2.0 Client 소개

application.yml

application.yml 초기화 및 인증에 필요한 정보들을 규칙에 따라 설정을 하면
초기화 때 이 설정된 정보들을 다 읽어서 OAuth2ClientProperties 먼저 여기 설정 클래스에 각 필드에 다 반영이 되고,
이 반영된 이 값을 사용해서 다시 ClientRegistration 이 클래스에 속성의 필드에 저장 됩니다.
spring:security:oauth2:client: 까지는 환경설정클래스 prefix
registration: 클라이언트 설정 / provider: 공급자 설정
registration
- facebook, facebook-move, google, line 등 : Client의 Registration 을 구분하기 위한 key값
OAuth2ClientProperties 에 Registration 속성(Map), Provider 속성(Map) 이 있는데 이게 Key로 들어가게 된다.
- authorization-grant-type : 클라이언트가 인가 서버로 권한 요청을 할 때 어떤 권한부 요청을 할 것인지 적어준다. (authorization_code)
- client-id : 서비스 공급자(인가 서버)에 등록된 클라이언트
- client-name : 클라이언트 이름
- client-secret : 서비스 공급자에 등록된 클라이언트의 비밀번호
- redirect-uri : 인가서버에서 권한 코드 부여 후 클라이언트로 리다이렉트 하는 위치 (application-production.yml)
우리 코드 api-gateway. / login/oauth2/code/OOO login~code까지는 이미 스프링 시큐리티에서 내부적으로 초기화 될 때 정해진 값이고, 우리가 수정 가능합니다
시큐리티 클라이언티 모듈은 이 URI를 받는 필터가 있으므로 이 값은 지켜줘야한다.
예를들어 authorization_code방식에서 클라이언트가 인가서버에 권한 부여 요청을 하게 되면 1차적으로 임시 코드를 발급받고 나서 그 다음에 인과서버는 임시 코드를 다시 클라이언트에 전달할 때 그 클라이언트의 URI 주소를 알아야하므로 콜백 주소 라고 보면 된다.
- clientAuthenticationMethod : 클라이언트의 자격증명을 위한 요청 방법을 말한다. - (우리플랫폼 : post) clientId,clientSecret 전송 방식 client_secret_post 면 클라이언트 시크릿 포스트는 포스트 방식으로 클라이언트 아이디어와 시크릿을 담아서 보내겠다
- scope : 리소스에 접근 제한 범위
provider
- authorization-uri: OAuth 2.0 권한 코드 부여 endpoint , 즉 코드를 요청할 때 이 endpoint로 보낸다.
- issuer-uri: 서비스 공급자 위치
- jwk-set-uri: OAuth 2.0 JwkSetUri 엔드 포인트 , 이 주소를 통해서 실제로 나중에 resource server에게 데이터를 요청할 때 이때 access-token을 전달하겠죠 그러면 resource server가 이 토큰을 검증합니다. 검증할 때 이 토큰은 이미 인가 서버에서 서명이 된 상태고 서명할 때 private key 로 서명을 했을 테고 이를 검증할 때는 이 private key에 해당하는 public key로 검증을 해야 하는데 해당 uri 엔드포인트로 요청이 되면 그 키의 정보를 받을 수 있음. 그래서 검증을 할 수 있습니다.
- token-uri: OAuth 2.0 토큰 엔드 포인트 , 클라이언트가 인가 서버에게 토큰을 요청할 때의 URI 입니다.
- user-info-uri: 사용자는 지금 클라이언트의 서비스를 이용하고 있는 상태고 클라이언트는 사용자의 정보를 가지고 와서 인증처리를 해줘야 사용자가 클라이언트의 서비스를 계속 이용할 수 있겠죠? 그러기 위해서 사용자의 정보를 가져와야 되는데 그 엔드 포인트 정보이다.
- user-name-attribute: OAuth 2.0 사용자명을 추출하는 클레임명 (우리 플랫폼 : sub)
그렇게 되면 클라이언트 레지스테이션 클래스의 객체가 생성한 동시에 이런 값들이 다 맵핑이 돼서 정리가 됩니다. 만약에 우리가 어플리케이션 프로포트스에 특별한 설정을 하지 않으면 이 값 그대로가
돼서 정리가 됩니다. 만약에 우리가 어플리케이션 프로포트스에 특별한 설정을 하지 않으면 이 값 그대로가사용됩니다. 근데 ApplicationProperties에 우리가 별도의 설정을 하게 되면ㅍ이 값이 일차적으로 맵핑이 되더라도 우리가 설정한 그 값이 다시 특수 설정이 되는 거에요.우리가 설정한 그 값이 우선적으로 설정이 됩니다.

Adapter 보면 이게 인가서버로 통신해서 가져오는 구문이고, 우리가 application.yml 에 설정한거는 2차적으로 아래 코드 통해 한다

..
ClientRegistrationRepository
우리가 등록하지 않으면 자동 설정에서 등록이 됩니다 +
자동설정에 의한 초기화 과정 이해 - OAuth2ImportSelector
가장 먼저OAuth2ImportSelector가 로드가 됩니다
그래서 OAuth2ImportSelector는 제가 앞서서 말씀드렸듯이 어떤 분기에 의해서 조건이 참이면 그 참에 맞는 참에 해당하는 설정 클래스를 로드합니다.
그래서 예를 들어서 지금 org.springframework.security.config.annotation.web.configuration.OAuth2ClientConfiguration
이 설정 클래스를 로드하고 있는데 이 전체 패키지 포함한 전체 이름이 문자열로 반환이 되면 실제로 이 설정 클래스가 로드가 됩니다
이 클래스 안에 들어가보면 OAuth2ClientWebMvcImportSelector 라는게 또 나옵니다. 이 클래스 로드되고 이 클래스는 또 OAuth2ClientWebMvcSecurityConfiguration 로드합니다. 그래서 어떻게 보면 위 과정은 결국은 이 OAuth2ClientWebMvcSecurityConfiguration 설정 클래스를 로드하기 위해서 과정이 있는것입니다,
이 클래스는 2개의 클래스를 생성하고 있죠. 하나가 DefaultOAuth2AuthorizedClientManager, 이건 우리가 후반에서 볼 건데 굉장히 중요한 클래스입니다.
그리고 HandlerMethodArgumentResolver 가 있다. (Spring MVC에서 사용할 수 있는 인터페이스입니다.