
1. JWT란?
JWT(JSON 웹 토큰)는 당사자 간에 정보를 JSON 개체로 안전하게 전송하기 위한 간결하고 독립적인 방법을 정의하는 개방형 표준(RFC 7519)이다. 이 정보는 디지털 서명이 되어 있으므로 확인하고 신뢰할 수 있다. JWT는 비밀(HMAC 알고리즘 사용) 또는 RSA나 ECDSA를 사용하는 공개/개인 키 쌍을 사용해서 서명할 수 있다.
서명된 토큰은 그 안에 포함된 청구의 무결성을 확인할 수 있는 반면, 암호화된 토큰은 이러한 청구를 다른 당사자로부터 숨겨준다. 공개/개인 키 쌍을 사용해서 토큰에 서명하는 경우, 서명은 개인 키를 보유하고 있는 당사자만이 서명한 사람임을 인증해준다.
멍청한 나는 도통 무슨말인지 알 수 없다.. 그래서 정말 깊게 공부를 진행해 보기로 마음먹었다.
2. JWT 구조
JWT는 . 을 구분자로 나누어지는 세 가지의 문자열의 조합인데, 아래 그림에서 보이는 것과 같이 세개로 나뉘어있다. 보기 편하도록 색깔로 구분해 두었다.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.deyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
그리고 .을 기준으로 좌측부터 Header, Payload, Signature을 의미한다고 생각하면 된다.
1) Header
Header는 JWT 토큰에서 사용할 타입을 나타내며, 해시 토큰이 담겨있다.
- alg : 서명 암호화 알고리즘이고, 해당 jwt가 어떤 알고리즘을 통해 알고리즘이 되었는지 나타낸다.
- typ : 토큰의 유형을 나타낸다.
{
"alg" : "HS256"
"typ" : "JWT"
}
2) Payload
페이로드는 토큰의 클레임(Claims)을 포함한다. 클레임은 엔티티(일반적으로 사용자)에 대한 정보와 추가 데이터를 포함할 수 있다. 클레임에는 세 가지 유형이 있다.
- Registered claims : 미리 정의된 클레임
- Public claims : 충돌을 방지하기 위해 IANA JSON Web Token Registry를 통해 정의되거나 URI 형식으로 정의된 클레임
- Private claim : 발행자와 수신자 간에 사용하기 위해 정의된 클레임
3) Payload
서명은 헤더와 페이로드를 인코딩한 후, 주어진 알고리즘을 사용하여 서명된 부분이다. 서명은 토큰의 진위 여부를 확인하는 데 사용되고, 서명을 생성하기 위해, 다음과 같은 문자열을 만든다.
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret
)
3. JWT 디코딩
생성한 jwt 토큰의 상세 내용(디코딩)을 해볼 수 있는 방법으로는 jwt 공식 사이트에서 간단하게 가능하다.
해당사이트의 Encoded 부분에 생성한 jwt 토큰을 붙여넣어보자.
4. JWT 인증과정
생각보다 Client <-> Server 의 jwt 인증과정은 복잡하지 않다. 이미지와 함께 천천히 읽어 나가보자.
1) 로그인 Request
- 사용자가 로그인을 시도한다.
2) JWT AccessToken / RefreshToken 발급
- 사용자로부터 인증 요청을 받으면, 위에서 언급했던 것처럼 서버에서 Header, PayLoad, Signature를 정의한다.
- 정의한 Header, PayLoad, Signature 를 Base64 Encoder로 암호화를 한번 더 진행하고, 이를 클라이언트에 발급한다.
3) AccessToken으로 API 요청
- Authorization header에 Access Token을 담아서 서버에 API 요청을 보낸다.
4) AccessToken 인증이 되면 정보 Response
- 클라이언트에서 받은 AccessToken가 서버에서 발급한 토큰인지 확인하고, 확인이 되면 정보들을 반환해준다.
5) RefreshToken으로 AccessToken 재발급 Request
- AccessToken 유효시간이 만료되었으면 RefreshToken으로 AccessToken을 재발급 요청한다.
6) AccessToken 재발급
- RefreshToken이 서버에서 발급한 토큰인지 확인하고, 확인이 되면 AccessToken을 재발급 해준다.
'개발 지식 > web' 카테고리의 다른 글
OAuth의 개념을 그림과 함께 이해해보기 (0) | 2024.06.12 |
---|---|
REST API 는 뭘까? (0) | 2024.05.24 |
쿠키와 세션의 차이? (0) | 2024.05.21 |