로마
- JWT(Json Web Token)는 웹 표준(RFC 7519)으로 JSON 객체를 이용하여 정보를 안전하고 간결하게 전송할 수 있는 토큰을 의미합니다.
JWT 구조
xxxxx.yyyyy.zzzzz
이런 구조를 가지고 있습니다.- Header : 맨 앞 부분(x자리)에는 일반적으로 토큰의 유형(typ)과 SHA256, RSA와 같은 서명 알고리즘(alg) 두 부분으로 구성됩니다.
{
"alg": "HS256",
"typ": "JWT"
}
- Payload : 가운데 부분(y자리)에는 토큰에서 사용하 정보의 조각(Claim) 들이 담겨있다.
{ "sub": "1234567890", "name": "John Doe", "admin": true }
- 클레임의 종류 : Registered, public, private
- Registered Claims : 필수는 아니지만 추천되는 미리 정의된 클레임들을 의미한다. iss(발급자), exp(만료기간), sub(주제) 등이 있다.
- Public Claims : 공개 정보용 클레임, 충돌 방지를 위해 URI 포맷을 이용
- Private Claims : 비공개 클레임, 서버와 클라이언트 사이에 임의로 지정한 정보를 저장
- Signature : 마지막 부분(z자리)는 서명을 나타냅니다. 서명은 인코딩된 헤더, 페이로드, secret, 헤더에 적힌 알고리즘을 가져와서 만들게 됩니다.
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
- 서명을 통해 메세지가 도중에 변경되었는지 위변조를 판단하게 됩니다.
- Signature는 서버 측에서 관리하는 비밀키가 유출되지 않는 이상 복호화할 수 없다.
JWT 특징
- JWT의 가장 큰 특징은 서명된 토큰이라는 점 입니다. 서버에서 토큰에 시크릿키를 이용해 서명을 하고 클라이언트로 발행을 해주기 때문에 받은 토큰을 확인하고 이 토큰이 서버에서 발행한 토큰이 맞는지 검증할 수 있게 됩니다. 따라서 안전한 인증이 가능하죠.
- 발행한 토큰은 위변조로부터는 보호되지만 내부의 헤더와 페이로드를 누구나 디코딩할 수 있습니다. 그렇기 때문에 내부의 값에 프라이빗한 내용을 담으면 안됩니다.
- url-safe 한 인코딩을 합니다.(base64url) URL에서도 오류없이 사용할 수 있게 '+', '/' 와 같은 연산자를 각각 escape하여 다른 문자로 치환하여 인코딩합니다.
- 공식문서 : https://jwt.io/introduction
- 📚 JWT 토큰 인증 이란? - 💯 이해하기 쉽게 정리 : 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
- JSON Web Token 소개 및 구조 : https://velopert.com/2389