• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

Principal 인터페이스와 User 클래스의 관계

23.03.08 14:28 작성 23.03.08 14:29 수정 조회수 470

0

안녕하세요. 강의를 듣던 중 해결되지 않는 의문이 생겨 질문드립니다.

강의에서 Principal 은 인터페이스이며 UserDetailsService에서 반환한 User 클래스가 구현체로 사용된다고 말씀해주셨는데 여기서 의문이 생겼습니다.

확인해보니 PrincipalUser 클래스의 인터페이스가 아닌 Authentication 의 구현체로 사용되는 UsernamePasswordAuthenticationToken 의 최상위 인터페이스였습니다.

하지만 Authentication에서 User 객체를 받아오는 메서드의 이름도 getPrincipal() 입니다. 그렇다면, 위 그림에서 나타난 Principal 인터페이스와 User 객체를 반환하는 getPrincipal()principal은 서로 다른 의미로 쓰이는 건가요?

디버깅을 해봐도 아래와 같이 Principal 인터페이스를 구현하는 XxxAuthenticaionToken 객체가 Authentication 타입으로 받아지고 User 객체는 그냥 Object 타입으로 받아져서 혼동이 되어 질문드립니다.

답변 1

답변을 작성해보세요.

0

어.. 이 부분은 제가 잘못 설명드린거 같네요. Principal은 User의 인터페이스가 아니고 말씀하신 구조가 맞습니다.

Authentication에서 정의한 getPrincipal()에서의 Principal이 그려주신 Principal 인터페이스였다면, 굳이 Object 타입으로 리턴할 필요는 없었겠죠.

제가 설계한게 아니라서 확신은 없지만, 제 생각엔 getPrincipal()이 리턴하는 객체를 사용자가 직접 정의한 임의의 클래스 타입이라고 가정한 것 같습니다. 가령, User를 확장해서 만든 커스텀 타입이요. 그런 타입이 Principal이라는 인터페이스를 구현할 필요까지는 없고, 또 강제하고 싶지 않았을 것 같아요. (스프링은 비침투성을 추구하니까요.) 아마도 그래서 그런 혼란스런움 점이 생긴것 같습니다. 어디까지나 추측이지만요.

현상혁님의 프로필

현상혁

질문자

2023.07.10

아하 넵 정확하게 잘 이해한 것 같습니다!!

답변 감사합니다 :)