JWT는 서버 측에 인증된 사용자의 정보를 세션 형태로 세션 저장소에 저장하는 방식이다.
세션 기반 인증방식으로는 생기는 서버의 부담을 "클라이언트에게 넘겨줄 수는 없을까?"하는 생각에서 토큰 기반 인증이 고안되었다.
- 클라이언트 측에 인증된 사용자의 정보를 토큰 형태로 저장하는 방식
- 토큰 : 인증된 사용자의 자격을 증명하는 동시에 접근 권한을 부여해 접근 권한이 부여된 특정 리소스에만 접근할 수 있게 해주는 역할.
🤔 로그인을 할 수 있는 열쇠?라고 하면 이해가 쉬울까...?
✔ 가장 범용적으로 사용되는 토큰 인증 방식이다.
✔︎ JSON 포맷의 토큰 정보를 인코딩 후, 인코딩된 토큰 정보를 Secret Key로 서명(Sign)한 메시지를 Web Token으로써 인증과정에서 사용하는 것이다.
원하는 비밀 키(Secret Key)
+ Header에서 지정한 알고리즘
을 사용하여 Header와 PayLoad에 대해서 단방향 암호화 수행(사용자 로그인 성공 후, JWT가 클라이언트에게 전달되는 과정)
1️⃣ 클라이언트가 서버측에 로그인 인증 요청(Username/Password)
📢 Client
서버야, Username/Password 인증 부탁해
2️⃣ 로그인 인증을 담당하는 Security Filter(JwtAuthenticationFilter)가 클라이언트의 로그인 인증 정보를 수신 후
AuthenticationManager에게 인증처리를 위임
💬 Security Filter(JwtAuthenticationFilter)
오케이 내가할게.
📢 Security Filter(JwtAuthenticationFilter)
AuthenticationManager, 로그인 인증 정보 줄테니까 네가 대신 인증 처리해.
3️⃣ AuthenticationManagerk CustomUserDetailsService에게 사용자의 UserDetails조회를 위임
💬 AuthenticationManager
오케이 내가할게.
📢 AuthenticationMaanger
CustomUserDetailsService, 받은 사용자 UserDetails조회 좀 해줘
4️⃣ CustomUserDetailsServce가 사용자의 Credential을 DB에서 조회한 후, AuthenticationManager에게 사용자의 UserDetails 전달
💬 CustomUserDetailsServcie
오케이 기다려 조화해줄게
📢 CustomUserDetailsServcie
자 결과 보내줄게 받아.
5️⃣ AuthenticationManager가 로그인 인증정보와 UserDetails의 정보를 비교해 인증 처리
💬 AuthenticationManager
고마워, 너가 준거랑 Security Filter(JwtAuthenticationFilter)가 준 거랑 같은 사용자인지 확인해볼게
6️⃣ JWT 생성후, 클라이언트의 응답으로 전달
💬 AuthenticationManager
클라이언트야 인증 성공했어. JWT생성해서 Response해줄게