이전 포스팅에서 서버 기반 인증과 토큰 기반 인증을 비교해보고 토큰 기반 인증의 장점에 대해서 알아보았습니다. 이번 포스팅에서는 JWT의 개념 및 구조 그리고 어떠한 전략으로 JWT가 구현될 수 있는지 알아보겠습니다.
JWT(Json Web Token) 이란?
JWT(Json Web Token)란 인터넷 표준 인증 방식으로 Json 포맷을 이용하는 Claim 기반(사용자에 대한 속성을 저장)의 Web Token이다. 다시 말해, JWT는 인증에 필요한 정보들을 토큰에 담아 암호화시켜 사용하는 토큰이다. JWT는 대표적으로 HMAC(SHA) 이나 RSA 암호화 알고리즘을 통해 서명된다. 서버에서 발급된 토큰을 클라이언트 영역에 저장해놓고 HTTP 통신을 할 때마다 JWT를 HTTP 헤더에 담아서 서버로 전송하게 되고 서버는 허가된 JWT인지 검사하게 된다. 자세한 검증과정은 아래에서 자세히 다뤄보도록 하겠다.
JWT의 구조
JWT는 (.)를 구분자로 세 가지의 문자열인 Header, Payload, Signature 로 이루어져 있으며, Json 형태인 각 부분은 Base64Url로 인코딩 되어 표현되어 있습니다.
1. Header(헤더)
토큰의 헤더 부분은 alg와 typ로 이루어져 있다. 먼저 typ은 토큰의 타입(JWT)을 나타내고, alg는 Signature를 어떠한 알고리즘 방식(HS256, RSA 등)으로 해싱할지 나타낸다.
2. Payload(페이로드)
토큰의 페이로드는 토큰에서 사용할 정보들의 조각인 클레임(Claim)을 가지고 있다. Paylaod는 다음과 같이 크게 세 가지 유형으로 나눌 수 있습니다.
- 등록된(registered) 클레임
- 공개(public) 클레임
- 비공개(private) 클레임
2-1. 등록된(registered) 클레임
등록된 클레임들은 서비스에서 필요한 정보들이 아닌, 토큰에 대한 정보들을 담기 위하여 이름이 이미 정해진 클레임들입니다. 표준 스펙상 key의 이름은 세 글자로 되어있다.
- iss(Issuer) : 토큰 발급자
- sub(Subject) : 토큰 제목
- aud(Audience) : 토큰 대상자
- exp(Expiration Time) : 토큰 만료 시간
- nbf(Not Before) : 토큰 활성 날짜
- iat(Issued At) : 토큰 발급 시간
- jti(JWT Id) : JWT 토큰 식별자
등록된 클레임의 표준 스펙으로 위의 7가지가 존재한다는 것이지 모두 포함해야 한다는 것은 아니다. 상황에 맞게 해당 서버가 가져야 할 인증 체계에 따라 선택적으로 사용하면 된다.
2-2. 공개(Public) 클레임
공개 클레임은 사용자 정의 클레임으로, 공개용 정보를 위해 사용된다. 충돌 방지를 위해 URI 포맷을 이용한다.
2-3. 비공개(private) 클레임
비공개 클레임은 사용자 정의 클레임으로, 서버와 클라이언트 사이에 임의로 지정한 정보를 저장한다.
비공개 클레임에서는 이후에 다뤄볼 access token과 refresh token 중 어떠한 타입을 전송할 것인지에 대한 정보도 포함할 수 있다. 여기서 주의해야 할 점은 페이로드에는 절대 민감한 정보를 담지 않는 것이다. 위의 헤더 부분과 마찬가지로 페이로드 부분은 Base64Url로 인코딩 되어있을 뿐 특별한 암호화가 되어 있지 않아서 JWT를 디코딩하면 헤더와 페이로드에 담긴 값을 알 수 있다. 그러므로 페이로드에는 단순히 식별하기 위한 정보만을 담아야 한다. 여기서 알 수 있듯 JWT는 데이터를 암호화하여 전송하는 목적보다는 해당 토큰이 정상적으로 서명되어 발급된 토큰임을 인증받는 것이 목적이다.
3. Signature(서명)
서명은 Base64Url로 인코딩 된 헤더와 페이로드 값을 헤더에서 정의한 알고리즘 방식으로 암호화하고 그 값을 다시 Base64Url 방식으로 인코딩하여 생성된다. 위에서 대표적인 암호화 알고리즘 방식으로 HMAC(SHA)과 RSA가 있다고 언급했다. HMAC 방식에서는 Secret 값을 사용하고 RSA 방식에서는 개인키를 사용하여 서명을 생성한다.
마무리
이번 포스팅에서는 JWT의 개념 및 구조에 대해서 알아보았습니다. 더 나아가 우리는 클라이언트의 요청으로 서버에서 발급된 JWT를 언제까지 사용할 수 있을지에 대한 궁금증이 생길 수 있습니다. 다음 포스팅에서는 다양한 JWT의 보안 전략과 각각의 장단점에 대해 알아보도록 하겠습니다.
이전 포스팅
서버 기반 인증과 토큰 기반 인증에 대해 알아보자!
최근 진행한 프로젝트에서 Spring Security와 JWT를 이용한 로그인을 구현하였습니다. 구현했던 내용을 정리해보고자 글을 작성하게 되었습니다. 이번 포스팅에서는 서버 기반 인증과 토큰 기반 인
cms02.tistory.com
참고
'Web' 카테고리의 다른 글
캐시(로컬 캐시 & 글로벌 캐시)에 대해 알아보자! (0) | 2023.05.21 |
---|---|
JWT의 다양한 보안 전략에 대해 알아보자! (0) | 2022.09.04 |
서버 기반 인증과 토큰 기반 인증에 대해 알아보자! (1) | 2022.07.24 |