스프링 시큐리티 OAuth2/OAuth2LoginConfigurer 초기화 이해

OAuth2 로그인 구현 - Spring MVC 인증 객체 참조하기

webmaster 2023. 1. 24. 10:56
728x90

Authentication

public void dashboard(Authentication authentication) {}

  • oauth2Login() 로 인증을 받게 되면 Authentication 은 OAuth2AuthenticationToken 타입의 객체로 바인딩된다
  • principal 에는 OAuth2User 타입 혹은 OidcUser 타입의 구현체가 저장된다.
  • DefaultOAuth2User 는 /userInfo 엔드포인트 요청으로 받은 User 클레임 정보로 생성된 객체이다
  • DefaultOidcUser 는 OpenID Connect 인증을 통해 ID Token 및 클레임 정보가 포함된 객체이다

@AuthenticationPrincipal

public void dashboard(@AuthenticationPrincipal OAuth2User principal or OidcUser principal) {}

  • AuthenticationPrincipalArgumentResolver 클래스에서 요청을 가로채어 바인딩 처리를 한다.
  • Authentication를 SecurityContex로부터 꺼내어 와서 Principal 속성에 OAuth2User 혹은 OidcUser 타입의 객체를 저장한다

Test

파라미터 

@GetMapping("/user")
public OAuth2User user(Authentication authentication) {
  //파라미터를 통해 받아오는 경우
  //OAuth2AuthenticationToken authentication1 = (OAuth2AuthenticationToken) SecurityContextHolder.getContext().getAuthentication();
  OAuth2AuthenticationToken authentication2 = (OAuth2AuthenticationToken) authentication;
  OAuth2User oAuth2User = authentication2.getPrincipal();
  return oAuth2User;
}
  • 2가지 방식으로 받을 수 있다.
    • SecurityContextHolder에 Authentication을 참조해서 가지고 올 수 있다.
    • 파라미터로 받아 가지고 올 수 있다.
  • 받아온 값을 OAuth2User 타입으로 변경하여 반환한다.

애노테이션

@GetMapping("/oauth2User")
public OAuth2User oAuth2User(@AuthenticationPrincipal OAuth2User oAuth2User) {
  System.out.println("oAuth2User = " + oAuth2User);
  return oAuth2User;
}

@GetMapping("/oidcUser")
public OidcUser oidcUser(@AuthenticationPrincipal OidcUser oidcUser) {
  //기본적으로 OidcUser 같은 경우에도 OAuth2User를 상속받기 떄문에 OAuth2User 로 받을 수 있지만 명확하게 oidc를 받는다는것을 명시하기 위해 사용하는것이다.
  System.out.println("oidcUser = " + oidcUser);
  return oidcUser;
}
  • 애노테이션을 통해 2가지 방식으로 받을 수 있다.
    • Openid 방식일 경우에는 2가지 모두 가능하지만, 아닐 경우 oauth2User URI로 받는 방식만 가능하다(null 반환)
  • OAuth2User 같은 경우 OidcUser을 부모타입이기 때문에 OAuth2User로 둘 다 받을 수 있지만 명시적이지 않다.
728x90