질문


궁금한게 jwt만 사용하는데 왜 userdetailsServiec를
왜 구현함, 머 다른 로직이나 있으면 모르겠는데

블로그들 보면 10에 8은 규현을 하네?

왜 계속 모든 요청마다 loadbyusername에서 db유저정보를 조회하는지 모르겠네,,
최초 로그인할 때 앵간한 거 다 token에 넣어주잖아



답변


질문을 정리해보면 총 2가지 같네요.

1. jwt 쓰는데 왜 DB를 조회하는지?

2. DB 조회하지도 않는데 왜 UserDetailsService를 사용하는지?


1. jwt 쓰는데 왜 DB를 조회하는지?

jwt는 토큰에 저장된 정보만 사용할수도 있지만, 때로는 그것만으로 부족해서 추가로 저장해둔 정보를 읽어와야합니다.

DB를 조회하는 이유는 jwt는 인증 서비스에서 발급해주는 것이고, 각 서비스별로 추가 유저 데이터를 가지고있을 수 있기 때문입니다.

인증 서비스와 비즈니스 서비스가 하나이더라도 토큰에 저장하기엔 너무 민감한 정보들이 있어서 DB를 추가로 조회할수도 있습니다.

서비스가 하나인데 왜 jwt를 쓰느냐? 나중에 분리될수도 있으니까요.


2. DB 조회하지도 않는데 왜 UserDetailsService를 사용하는지?

jwt 토큰을 UserDetails 객체로 변환하는 방법은 여러가지가 있을 수 있고, 변할 수 있습니다.

토큰을 바로 UserDetails로 변환할수도 있고, DB에서 읽어올수도 있고, 외부 API를 통할수도, 캐시에서 읽어올수도 있습니다.

변할 수 있는 부분을 따로 분리해둔 것 뿐이고, 필요 없다면 안써도 됩니다.


다만, 안쓸거면 AuthenticationProvider를 직접 구현해줘야합니다.

AuthenticationProvider 구현체들을 보면 알겠지만, 그걸 베껴서 재구현하느니 저라면 그냥 UserDetailsService를 간단하게 구현하겠습니다.