JWT(Json Web Token)는 당사자 간에 정보를 JSON 개체로 안전하게 전송하기 위한 개방형 표준(RFC 7519)입니다.
JWT는 토큰 자체를 정보로 사용하는 Self-Contained 방식으로 HMAC, RSA, ECDSA등으로 서명되어 있어서 신뢰할 수 있습니다.
JWT의 구성 요소
JWT는 Header, Payload, Signature로 구성되며 각 부분은 Base64Url로 인코딩 되어 표현됩니다. 또한, 각 부분을 . 구분자를 사용해 구분해줍니다.
참고로, Base64Url은 암호화된 문자열을 반환하는 것이 아니라 같은 문자열에 대해 항상 같은 인코딩된 문자열을 반환해줍니다.
Header
헤더는 2개의 key -value로 구성되어 있습니다.
typ는 어떤 타입의 토큰인가를 나타내는 것이고, alg는 Signature를 해싱하기 위한 알고리즘을 지정한다.
- alg : HS256,RSA 등
Payload
Payload 안에는 토큰에서 사용할 정보의 조각들인 Claims가 있습니다.
Claims에는 일반적으로 사용자에 대한 데이터가 들어있으며, Json(Key : value)형태로 다수의 정보를 넣을 수 있습니다.
JWT의 Registered Claim은 아래와 같습니다.
- iss (Issuer) : 토큰 발급자
- sub (Subject) : 토큰 제목 - 토큰에서 사용자에 대한 식별 값이 됨 (Unique한 값이 사용되는 데 사용자의 이메일을 주로 사용한다.)
- aud (Audience) : 토큰 대상자
- exp (Expiration Time) : 토큰 만료 시간 - NumericDate 형식
- nbf (Not Before) : 토큰 활성 날짜 (이 날짜 이전의 토큰은 활성화되지 않음을 보장)
- iat (Issued At) : 토큰 발급 시간 - 토큰 발급 이후의 경과시간을 알 수 있다
- jti (JWT Id) : JWT 토큰 식별자
"aud" 속성에 대해서 좀 더 자세히 살펴보자면,
토큰 대상자는 JWT가 발행되는 대상, 즉 JWT를 받을 응용 프로그램 또는 서비스의 식별자를 나타냅니다.
따라서, "aud"를 사용하여 특정한 수신자나 시스템만이 토큰을 수락할 수 있도록 제한할 수 있습니다.
다음으로, "jti" 속성에 대해서 좀 더 자세히 살펴보자면,
이는 JWT의 식별성을 제공하고, 중복된 토큰의 사용을 방지하는 데 사용할 수 있습니다.
예를 들어서, 토큰의 중복 사용 방지, 토큰의 무효화(로그아웃) 등에 이용할 수 있습니다.
(jti 값을 서버 또는 데이터베이스에 저장하고 클라이언트에서 토큰을 제출할 때마다 확인할 수 있다.)
JWT에는 Public Claim과 Private Claim도 있습니다.
- 공개 클레임 (Public Claim) : 사용자 정의 클레임으로, 공개용 정보를 위해 사용됩니다.
- 비공개 클레임 (Private Claim) : 사용자 정의 클레임으로, 일반적으로 서버 내부에서 사용되며 클라이언트에게 공개되지 않습니다.(서버 내부 통신 등에 사용, 토큰의 유형을 지정할 때 사용)
여기서 가장 중요한 것은 Header와 Payload에 민감한 정보를 담지 않는 것입니다.
왜냐하면, Header와 Payload에는 특별한 암호화가 걸려있는 것이 아니기때문에 누구나 디코딩을 한다면 Header와 Payload에 있는 값을 알 수 있습니다.
Signature
Signature(서명)은 토큰을 인코딩하거나 유효성 검증을 할 때 사용하는 고유한 암호화 코드이다.
이는 Header와 Payload의 값을 각각 Base64Url로 인코딩하고, 인코딩한 값을 비밀 키를 이용에 헤더에서 정의한 알고리즘으로 해싱을 하고, 이를 다시 Base64Url로 인코딩하여 생성한다.
마지막으로, 생성된 토큰으로 HTTP 통신을 할 때 다음과 같이 사용된다.
{
"Authorization" : "Bearer {생성된 토큰 값}"
}
지금까지 JWT에 대해서 알아보는 포스팅이이었습니다!!
'Web' 카테고리의 다른 글
토큰을 사용하는 이유 (0) | 2023.07.03 |
---|---|
Postman에서 토큰 자동 설정하는 방법 (1) | 2023.05.14 |
HTTP 란 무엇일까? (0) | 2022.11.14 |
Rest와 Rest API에 관하여 (0) | 2022.10.30 |
쿠키와 세션 (0) | 2022.05.09 |