JWT란?
JWT 란 JSON Web Token 의 약자로 말 그대로 웹에서 사용되는 JSON 형식의 토큰에 대한 표준 규격이다. 정보를 안전하게 전송하기 위한 토큰 형식이다. JWT 는 자가 수용적(Self-contained)이다. 자가 수용적이란 토큰 자체에 필요한 모든 정보가 담겨 있어 별도의 저장소가 필요하지 않다는 의미이다. JWT는 JSON 객체를 사용하여 정보를 저장하고 디지털 서명을 통해 검증한다
JWT 토큰은 주로 인증과 정보교환에 사용된다.
인증(Authentication) : 사용자가 로그인하면, 서버는 사용자의 정보를 담은 JWT 토큰을 발급한다. 사용자는 이 토큰을 쿠키나 로컬 스토리지에 저장하고, 서버에 요청할 때마다 토큰을 함께 보낸다. 서버는 토큰을 검증하여 사용자를 인증한다.
정보 교환(Information Exchange) : 두 개체가 안전하게 정보를 주고받을 수 있다. 토큰에 담긴 정보는 디지털 서명에 의해 보호되므로, 정보의 신뢰성을 보장할 수 있다.
웹에서 Authorization HTTP 헤더를 Bearer <JWT토큰> 의 형태로 설정하여 클라이언트에서 서버로 전송된다. 서버에서는 받은 JWT 토큰에 서명확인은 통해서 위변조 여부를 검증한다.
JWT 구조
JWT 토큰은 헤더(header), 페이로드(payload), 서명(signature) 이렇게 세 부분으로 이루어져 있다. JWT 는 네트워크에서 전송이 되어야 하기 때문에 용량을 적게 차지하는 것이 좋기에 JSON key를 3글자로 줄여뒀다.
header
JWT의 유형(typ) 및 사용하는 암호화 알고리즘(alg) 등에 대한 정보를 포함한다. 또한 헤더는 Base64 로 인코딩되어 있다.
{
"alg": "HS256",
"typ": "JWT"
}
위는 헤더의 알고리즘은 HMAC SHA-256 을 사용했고, 타입은 JWT라는 것을 보여준다
payload
JWT 에서 payload는 실제로 전달하고자 하는 정보를 포함하고 있다. 예를 들어 사용자의 ID, 이름, 닉네임 등이 포함될 수 있다. 여기에 담긴 정보단위를 클레임(claim)이라고 하며, key / name 한 쌍으로 이루어져 있다. 토큰에는 여러 개의 클레임을 넣을 수 있으며 주로 발급자, 만료시간, 사용자 식별자 등의 정보나, 사용자의 권한, 역할, 선호도 등과 같은 사용자에 관한 정보를 담는다.
클레임은 세가지로 이루어져 있다.
- Registered Claims ( 등록된 클레임)
- Public Claims(공개 클레임)
- Private Claims(비공개 클레임)
Registered Claims(등록된 클레임)
토큰에 대한 정보를 표현하기 위해 미리 정의된 클레임이다. 등록된 클레임은 토큰의 기본적인 정보를 제공하고, 토큰의 유효성 검사에 사용될 수 있다
- iss (Issuer): 토큰 발급자를 나타낸다. 보통은 토큰을 발급한 서버의 도메인이나 식별자이다.
- sub (Subject): 토큰의 주제를 나타낸다. 주로 토큰을 발급받는 사용자의 식별자나 ID이다.
- aud (Audience): 토큰의 대상(받는 사람)을 나타낸다. 토큰이 발행되는 서비스나 애플리케이션을 나타내는 보통의 문자열이 될 수 있다.
- exp (Expiration Time): 토큰의 만료 시간을 나타낸다. 이 시간 이후에는 토큰이 더 이상 유효하지 않다.
- nbf (Not Before): 토큰이 사용될 수 있는 시간을 나타낸다. 이 시간 이전에는 토큰을 사용할 수 없다.
- iat (Issued At): 토큰이 발급된 시간을 나타낸다.
- jti (JWT ID): JWT의 고유 식별자를 나타낸다. 토큰의 중복 사용을 방지하기 위해 사용될 수 있다.
Public Claims(공개 클레임)
Public Claims(공개 클레임)은 JWT의 페이로드에 포함되는 사용자 정의 클레임이다. 공개된 클레임은 충돌을 방지하기 위해 URI 형식으로 이름을 지정해야 한다
{
"https://doppelgoer.tistory.com" : true
}
Private Claims(비공개 클레임)
비공개 클레임은 사용자가 직접 정의하는 클레임이다. 비공개 클레임을 사용해서 사용자의 권한등을 추가할 수 있다.
signature
JWT의 서명은 JWT의 무결성을 보장하고, 변조를 방지하기 위한 부분이다. 헤더와 페이로드를 base64 로 인코딩하고, 비밀키나 공개키/비밀키 쌍을 사용하여 암호화 한 값이다.
개인 기록용입니다. 만약 잘못된 부분이 있다면 댓글로 알려주신다면 감사하겠습니다!