질문
블로그들 보면 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를 간단하게 구현하겠습니다.
답변감사합니다
일부 블로그 보면 authenticationpriovider 조차 구현을 안하고 jwtauthenticatuonfilter에서 Authentication authentication = jwtprovider.getAuthentication해서 받아오은데 이때 jwtprovider가 authenticationprovider를 대체했다고 생각하면 되겠습니까
링크 줘보실래요?
딱히 jwtprovider를 authentication manager한테 위임을 안하는 것 같은 블로그도 있어서 글 남깁니다
제가 링크 블로그를 너무 많이봐서 해당 블로그가 어떤 블로그였는지 찾기힘들 거 같습니다 기억이나서 질문드린거라
https://velog.io/@jkijki12/Spirng-Security-Jwt-로그인-적용하기
이 블로그 였덩거 같기더한데 이분은 userdetailsService를 구현했네여
저건 이름만 프로바이더지 프로바이더로 쓴게 아닙니다.. 이상한거 만들어서 이상하게 썼네요 컨텍스트에도 직접 세팅을 해버리고 있네요;; 저런식으로 쓰면 스프링 시큐리티를 제대로 쓰는게 아닙니다
아 그렇군여,,,
제가 또 잘 몰라서,, 저기 블로그는 매니저빈을 등록만 하고 무슨 구현체들을 사용할지 셋팅도 안했는데 저게 의미가 있나 싶어요 매니져가 알아서 userdetailsSevice userdetails가 걸린 클래스를 찾아가나요?
매니저는 UserDetailsService를 모르죠 JwtTokenProvider에서 알아서 DI 받아서 사용하는 형태네요 그냥 저 사이트는 무시하세요
핵노답임
대기님 마지막으로 질문드립니디, 이번엔 블로그가 아닌 책을 참조하면서 하고 있는데 스프링 시큐리티 인 액션, 스프링부크 핵심가이드에 jwt예시를 보면 필터가 매니저에서 Authenticationtoken객체를 받아서 직접 getcontext.setAuthenticion해주는데 이것도 잘못된 방식인건가요?
그것만 가지고는 잘못됐다고 하기 어렵습니다 예시라서 그런건지도 모르겠구요 spring security에서 제공하는 AuthenticationFilter를 안쓰겠다는건데, 굳이 그래야할 이유를 모르겠네요
AuthenticationFilter, AbstractAuthenticationProcessingFilter 봐보세요
님 그냥 오카방 들어오세요 개답답하네
https://open.kakao.com/o/s13NHEQe
개추