JWT(Json Web Token)란 인증에 필요한 정보들을 암호호시킨 JSON 토큰을 의미한다. 보통 JWT와 같은 토큰기반 인증 방식은 토큰을 HTTP 헤더에 실어 서버가 클라이언트를 식별하는 방식이다.
JWT 데이터는 BASE-64URL를 통해 인코딩하여 직렬화한것이다.
토큰 내부의 위변조 방지를 위하여 개인키 암호화 방식을 사용한 전자 서명도 들어 있다.
직렬화란? 데이터를 저장하거나 전송할 수 있도록 문자열과 같은 형식으로 변환하는 과정을 말한다.
따라서 서버는 로그인 등의 인증 과정에서 사용자에게 JWT를 발급해준다.
사용자는 이후 요청 시 이 JWT를 함께 전송하고, 서버는 토큰의 유효성을 검증한 뒤 요청을 처리하고 응답을 반환한다.
사용자가 로그인에 성공하면 서버는 인증 수단으로 JWT를 발급한다. 이 토큰은 자격 증명 역할을 하기 때문에 보안에 특히 주의해야 하며, 브라우저의 로컬스토리지나 세션스토리지에 민감한 정보를 장기간 저장하는 것은 권장되지 않는다.
JWT 구조
JWT는 "."을 구분자로 직렬화된 세가지 문자열의 조합이다.
"."을 기준으로 Header, Payload, Signature을 의미한다.

Header에는 JWT에서 사용할 타입과 알고리즘 종류가 담겨져 있다.
alg:서명 암호화 알고리즘 종류(HAMC,RSA,ECDSA 등)
typ: 토큰 유형
Payload는 사용자 권한 정보와 데이터(Claim)가 들어있다.
Clam이란? key-value 형식으로 이루어진 한쌍의 정보
클레임은 Registered claims, Public claims, Private claims으로 세가지로 나뉜다.
Registered claims(미리 정의된 클레임): sub(제목), name(발행자),iat(발행시간), exp(만료시간)등이 있다.
Public claims: 사용자가 정의할 수 있는 클레임
Private claims: 동의한 당사자들 간에 정보를 공유하기 위해 작성된 클레임으로
등록되지도 않고, 공개되지도 않는다.
Signature 는 Header, Payload를 Base64-URL로 인코딩한 후 헤더에서 지정된 알고리즘을 가져와서 서명한다.
Signature 구조는 인코딩된 Header와 Payload외 개인키(secret)을 합쳐서 암호화한 값이다.
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
서명은 메시지가 전송 중에 변경되지 않았는지 확인하는 데 사용되며, 개인 키로 서명된 토큰의 경우 JWT를 보낸 사람이 본인인지 확인할 수도 있습니다.
Header와 Payload는 단순히 인코딩된 값이기 때문에 제 3자가 복호화 및 조작할 수 있지만, Signature는 서버 측에서 관리하는 비밀키가 유출되지 않는 이상 복호화할 수 없다. 따라서 Signature는 토큰의 위변조 여부를 확인하는데 사용된다.

만약 ACCESS TOKEN의 시간이 만료되었다면 서버는 401 Unauthorized 로 응답한다.
클라이언트가 REFRESH TOKEN을 통해 서버에게 새로운 ACCESS TOKEN을 발급받고 요청을 보내야 한다.
JWT
https://jwt.io/introduction
https://inpa.tistory.com/entry/WEB-%F0%9F%93%9A-JWTjson-web-token-%EB%9E%80-%F0%9F%92%AF-%EC%A0%95%EB%A6%AC#jwt_%EA%B5%AC%EC%A1%B0