저는 지금까지 로그인 처리를 모두 전통적인 session으로만 다뤘습니다.
하지만 이제 백과 프론트를 나눔에 따라 토큰이 반드시 필요하다는 걸 느껴 이렇게 공부합니다.
JWT 란?
조금 정의하기 어려웠습니다. (조금 더 공부해서 틀린 게 있다면 수정하겠습니다.)
Json을 사용해 사용자의 표명(assert), 클레임(claim)를 처리하는 json을 보관하는 웹 표준(RFC 7519),
암호화 된 토큰입니다. (위키백과 참고)
여기서 클레임(정보의 한조각)이라는 것은 예를 들어 ‘나는 일반 유저다’라는 걸 담았을 때
서버에서는 암호화된 정보를 해석해 통과된다면 일반 유저라는 걸 인증 완료된 것입니다.
사실 뜻 자체는 엄청 어려웠지만 사실
Stateless인 http통신에서 session없이 인증을 거치고
인가를 (어떻게 유저인지, 어드민 인지 구분해야 할까) 어떻게 줄지 생각해보면
쉽게 접근할 수 있었습니다.
한마디로 서버에게 인증 받기 위해 해당 사용자의 정보를 담은 암호화된 토큰!
이라고 생각하시면 될 것 같습니다.
토큰을 이용한 과정을 그려봤습니다.
JWT 구조를 보여줍니다.
앞서 말씀 드린 클레임을 담는 부분입니다.
기본적인 클레임 들은
iss : 토큰 발급자 (issuer)
sub : 토큰 제목 (subject)
aud : 토큰 대상자 (audience)
exp : 토큰 만료시간 (expiration) 토큰 만료시간입니다.
nbf : 토큰이 언제부터 유효한지 (Not Before)
iat : Issude At , 토큰 발행시간입니다.
jti : JWT ID : 토큰 자체의 아이디
등등 다양한 클레임 들이 있습니다.
Header 는 어떤 알고리즘인지와 어떤 타입인지를 담아주고있습니다.
마지막 서명 부분은 위에 말했던 구조의
Header + payload + 비밀번호를 합쳐
주어진 비밀키로 해쉬, 암호화 합니다.
이렇게 크게 구조 세가지를 알아봤습니다.
JWT 토큰은 이론적으로는
클라이언트에만 저장되는 것이 맞지만
보안을 위해서 redis, hazelcast등을 이용해서 이용 DB에 저장시키는 방법도 있습니다.
참고 :
스프링부트 Java/Spring 웹 개발 마스터 초격차 패키지 ,
https://velog.io/@syoung125/JWT-토큰이란