스프링 시큐리티는 자신만의 세션을 들고있다. Security Session 내에 들어갈 수 있는 타입은 Authentication 객체밖에 없다.
이 Authentication 객체는 의존성 주입이 되어 서버측에서 접근하여 다룰 수 있다. 이 때, Authentication 객체 내부의 사용자 정보를 빼내기 위해 다운캐스팅을 진행한다.
Authentication이 다운캐스팅 될 수 있는 두가지 타입은 UserDetails와 OAuth2User이다. PrincipalDetails 객체는 UserDetails를 implement 하니, PrincipalDetails 객체와 OAuth2User 타입으로 캐스팅이 될 수 있다.
사용자가 일반 로그인을 했을 땐 UserDetails 객체가 Authentication 객체 내부에 polymorphism으로 들어가게 되고, OAuth 로그인을 했을 땐 OAuth2User 객체가 들어가게 된다.
이는 유저 정보를 불러와 서비스 하는 도메인을 구성할 때, 서로 다른 두가지 타입에 대해 따로 파라미터를 받아와야 하니 번거로운 일이 된다.
이에 대한 해결책은 간단하다. UserDetails와 OAuth2User 두개의 타입을 implement하고 모든 메소드를 오버라이딩 하면 된다.