
아래 글은 RFC 7519 를 기반으로 작성되었습니다.
서론
지난 포스팅에서 JWT의 구조에 대해서 알아보았습니다. 어떻게 생겼는지를 알았으니, JWT를 만들고 검증하는 법을 알아보죠. 숟가락 구조를 알고 있다고 해서 숟가락을 만드는 방법을 다 알고 있는 것은 아니니까요!
RFC에 따라 JWT를 만들고 검증하는 법
RFC 공식 문서에 JWT를 만들고 검증하는 법이 나열이 되어 있습니다. 암호화나 서명이 되지 않은(Unsecured) 경우와 암호화나 서명명이 된 경우의 2가지로 나누어져 있습니다.
암호화나 서명이 되지 않은 경우
이 경우는 쉽습니다. 헤더 내용을 다음와 같이 채워주면 됩니다.
{
"alg" : "none"
}
위 헤더 내용은 말그대로 알고리즘(alg)이 없다(none)는 뜻을 가지고 있는 JSON입니다. 이 헤더 내용을 `Base64URL` 인코딩 형식으로 인코딩을 하면 `eyJhbGciOiJub25lIn0` 와 같은 모양이 나옵니다.
물론 정해진 알고리즘이 없기 때문에, 맨 뒤의 배(서명) 내용이 없습니다! 그래서 다음과 같은 모양으로 나오는 경우가 암호화나 서명이 되지 않은 경우의 JWT가 되겠습니다. (분리된 형태를 보이기 위해 점 사이에 임의로 줄바꿈을 넣어주었습니다.)
eyJhbGciOiJub25lIn0
.
eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ
.
암호화된 경우(일반적인 경우)
위의 경우는 암호화가 안된 경우기 때문에 사실 특수한 경우라고 볼 수 있습니다. 이제부터 알아보는 방법이 진짜 사용법입니다! RFC 문서에서는 암호화된 경우의 JWT를 다루기 위해 JWT를 만드는 방법과 JWT를 검증하는 방법 두가지를 설명하고 있습니다. 또, JWS(서명)와 JWE(암호화)에 따라 방법이 또 다르면서 각각의 RFC 문서가 있긴 합니다만(...), 보통의 경우 JWS를 많이 사용하기 때문에 JWS로 설명을 하겠습니다.
(암호화된) JWT - JWS를 만드는 방법
사실 요약하자면, 바디-헤더-서명 순으로 JWT를 만드는 방법을 나열하는 레시피나 다름이 없긴 합니다. 라면 레시피처럼
그래도 나열을 쭉 해보겠습니다.
- 일단 원하는 클레임 내용을 정하고 JSON을 만듭니다. (빈칸 허용)
- 메세지를 UTF-8 인코딩 표현의 바이트로 메세지를 만듭니다. 여기까지가 페이로드 내용입니다.
- 헤더를 알고리즘과 타입(JWT)의 내용을 포함한 JSON을 만듭니다.
- JWS 방식으로 서명 + 암호화 + 압축을 진행합니다. 자세한 내용은 RFC를 참고하거나 아래 식을 참고하시면 됩니다.
\[BASE64URL(UTF8(JWS Protected Header)) || '.' || BASE64URL(JWS Payload) || '.' || BASE64URL(JWS Signature)\]
(암호화된) JWT - JWS를 검증하는 방법
검증하는 방법은 사실 라이브러리의 도움을 받으면 쉽고 편합니다만.. 서명이나 암호화에 대한 내용이 아닌, 검증의 절차만을 두고 나열해 보겠습니다.
- JWT에 마침표('.')가 하나 포함되었는지 확인
- 마침표('.')의 문자 앞 부분을 헤더라고 가정하고, `Base64URL` 인코딩 방식으로 디코딩합니다. 디코딩하면 헤더가 JSON 형태로 짠!하고 나올 것입니다.
- JSON 형태의 헤더가 올바른 형태의 JSON인지 검증합니다.
- 검증 후 헤더의 내용을 확인해서 알고리즘과 JWT의 타입(JWS인지 JWE인지)을 확인합니다.
- JWS라고 가정했으니 서명을 사용했을 것입니다. 디코딩(공개키 사용)하여 JWT 내용을 풀어내어 Claim의 내용을 알아냅니다.
'Study' 카테고리의 다른 글
| (3) JSON Web Token - JJWT 토큰 라이브러리를 사용해 보자 (0) | 2024.01.17 |
|---|---|
| (1) JSON Web Token - 토큰의 구조 (1) | 2024.01.15 |