페이지의 회원가입 및 로그인을 구현하는 과정에서(실제로 사용되지는 않았음.)의 궁금했던 개념들에 대해 정리해보았다.
JSON 객체를 사용하여 두 시스템 간에 정보를 안전하게 전송하기 위한 컴팩트하고 독립적인 방법을 제공한다. 주로 인증과 정보 교환 목적으로 사용된다.
- 헤더(Header)
- 페이로드(Payload)
- 서명(Signature)
토큰의 유형(JWT)과 사용할 서명 알고리즘(예: HMAC SHA256 또는 RSA)을 지정한다.
{
"alg": "HS256",
"typ": "JWT"
}
이러한 JSON 객체를 Base64Url로 인코딩하여 JWT의 첫 번째 부분을 만든다.
토큰의 클레임(claims)을 포함한다. 클레임은 정보의 조각을 나타내며, 크게 세 가지로 분류된다.
예시 페이로드:
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
이 JSON 객체 역시 Base64Url로 인코딩하여 JWT의 두 번째 부분을 만든다.
JWT의 무결성을 보호한다.
무결성: 데이터의 정확성, 일관성, 유효성이 유지되는 것
서명을 생성하려면 인코딩된 헤더, 인코딩된 페이로드, 그리고 비밀 키를 조합하여 서명 알고리즘을 통해 생성한다.
예를 들어 HMAC SHA256 알고리즘을 사용할 경우:
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret
)
서명 부분은 JWT의 세 번째 부분이 된다.
결국, JWT는 다음과 같이 구성된다.
header.payload.signature
한편, 앞에서 언급했듯이 JWT의 페이로드에는 토큰의 정보를 포함한 클레임이 들어있다. 페이로드에는 사용자가 인증된 후 서버가 클라이언트에게 전달하는 중요한 정보들이 들어있다.
이 정보는 주로 사용자의 세부 사항, 권한, 토큰의 기타 메타데이터들을 담고 있다.
페이로드에 포함된 정보는 Base64Url로 인코딩되어 토큰의 일부가 되지만, 암호화되지는 않는다. 이는 누구나 토큰을 디코딩하여 페이로드의 내용을 읽을 수 있다는 것을 의미한다. 따라서 민감한 정보(민감한 사용자 식별 정보나 사용자의 권한 여부 등)는 페이로드에 포함시키지 않는 것이 좋다. 민감한 정보를 페이로드에 포함시켜야 할 경우 추가적인 보안 조치가 필요하다.