JWT(Json Web Token) : 클라이언트와 서버 사이에서 통신을 할 때 권한을 위해 사용하는 사용자 인증 정보를 담은 토큰
기존의 세션 기반 인증에서는 서버가 로그인한 사용자의 정보를 세션에 저장하고, 이후 요청마다 세션을 조회하여 인증을 처리한다.
하지만 이 방식은 서버가 상태를 유지해야 하기 때문에 확장성이 떨어진다는 단점이 있다.
반면 JWT 방식은 서버가 토큰을 생성하여 클라이언트에게 전달하고, 클라이언트는 요청마다 해당 토큰을 함께 전송한다.
서버는 토큰을 검증하여 인증을 처리하며, 필요에 따라 추가적인 DB 조회를 수행할 수도 있다.

JWT는 세 부분으로 나뉘어져있다. 각 파트는 . 으로 구분하여 aaaaa.bbbbb.ccccc로 표현된다.
또한 url 파라미터로 사용할 수 있도록 하기 위해 url safe한 base64 인코딩을 사용한다.
어떤 알고리즘으로 서명했는지, 어떤 타입의 토큰인지 정의한다.
{
"alg": "HS256",
"typ": "JWT"
}
alg : Signature에서 사용하는 알고리즘typ : 토큰 타입토큰을 담는 데이터 영역이다.
이 안에 담긴 정보의 단위를 Claim이라고 하며, key-value 형태로 구성된다.
{
"sub": "1", // userId
"iat": 1710000000,
"exp": 1710003600
}
토큰에는 여러개의 claim을 넣을 수 있으며, 크게 세 종류로 나뉜다.
1. 등록된 클레임 (registered) : 토큰 정보를 표현하기 위해 이미 정해진 종류의 데이터들
2. 공개 (public) : 사용자 정의 클레임. 공개용 정보를 위해 사용된다.
3. 비공개 (private) : 서버와 클라이언트 간 약속된 데이터
Payload는 암호화되어 있지 않고 base64로 인코딩된 상태이기 때문에,
민감한 정보는 포함하지 않아야 한다.
Header와 Payload를 합친 후, 서버의 비밀키와 알고리즘을 사용하여 생성된 값이다.
HS256( base64UrlEncode(header) +
"." +base64UrlEncode(payload), Secret key)
Signature는 토큰을 복호화하기 위한 것이 아니라,
토큰이 서버에서 생성된 것인지, 위변조되지 않았는지를 검증하기 위해 사용된다.
JWT 토큰 인증방식은 비밀키로 암호화를 하기 때문에 JWT 토큰을 사용해서 클라이언트와 서버는 안전하게 통신한다.

1. 사용자가 로그인을 시도한다.
2. 서버는 사용자 정보를 검증한 후 JWT를 생성한다.
3. 생성된 JWT를 클라이언트에게 전달한다.
4. 클라이언트는 이후 요청마다 Authorization 헤더에 토큰을 담아 전송한다.
5. 서버는 JWT의 Signature를 검증하고, Payload의 정보를 기반으로 인증을 수행한다.
JWT는 서버가 상태를 저장하지 않고도 인증을 처리할 수 있는 토큰 기반 인증 방식이다.
토큰 내부에 사용자 정보를 담고 있으며, Signature를 통해 위변조 여부를 검증한다.