JWT(Json Web Token)은 인증에 필요한 정보들을 암호화시킨 JSON 토큰을 의미한다.
JWT 기반 인증은 JWT 토큰(Access Token)을 HTTP 헤더에 실어 서버가 클라이언트를 식별하는 방식이다.
사용자가 JWT를 서버로 전송하면 서버는 검증하는 과정을 통해 검증이 완료되면 요청한 응답을 알려준다.
jwt 인증 프로세스에 대해서는
[Spring] 인증과 인가 & 쿠키와 세션 에 간략하게 나와있다.
HTTP 특성상 Stateless
Connectionless
이기 때문에 로그인을 한 유저는 JWT를 헤더에 넣어줘야한다.
하지만 로그인에도 영원한 법은 없는 것이다.
인증된 사용자가 어느 정도 시간동안 재인증 하지 않아도 되도록 만든 것이 Access Token
이다.
만약 기간이 만료되면 다시 인증을 하던지, Refresh Token
을 통해 인증을 하는 방법이 있다.
(해당 내용은 추후..)
JWT 구조에는 Header
, Payload
, Signature
3개가 있다.
alg : Signature 암호화 알고리즘을 의미한다.
typ : 토큰 유형을 의미한다.
Register claims : 미리 정의된 클레임
sub : 토큰 제목(subject)
aud : 토큰 대상자(audience)
iat: 토큰이 발급된 시각(issued at)
exp : 토큰의 만료 시각(expired)
Pulbic claims : 사용자가 정의할 수 있는 클레임
Private claims : 해당하는 당사자들 간에 정보를 공유하기 위해 만들어진 사용자 지정 클레임
헤더와 페이로드의 문자열을 합친 후, 헤더에서 선언한 알고리즘과 key를 이용해 암호화 한 값을 의미한다.
이 Signature는 key가 없으면 복호화가 불가능하기 때문에 보안상 안전하다
는 특성이 있다.
헤더와 페이로드를 가지고 Signature를 생성하므로 데이터 위조와 변조를 막을 수 있다.
http 헤더나 url 파라미터를 통해 전송되기 때문에 네트워크 부하가 적다.
쿠키와 세션처럼 인증 정보에 대한 별도의 저장소가 필요가 없다.
모바일 앱에서 사용하기 적합하다.
토큰의 크기가 커질수록 트래픽에 영향을 미칠 수 있다.
토큰이 발급되면 만료 기간 변경이 불가능하기에, 토큰 만료 처리를 구현해야한다.