티스토리 뷰

기타/Web

[Web]JWT(Json Web Token)이란 ?

꼬마우뇽이(원종운) 2022. 4. 17. 17:56

JWT(Json Web Token)이란?

JWT란 Json Web Token의 약어, Json을 이용하여 사용자 정보(Claims)를 표현하는 Web Token입니다. JWT는 토큰 그 자체가 해당 사용자에 대한 정보로 사용하는 Self-Contained 방식으로 서버와 클라이언트 사이에 전달되어 사용자 인증에 많이 사용되어지고 있는 표준입니다.

 

JWT 구조

JWT는 Header, Payload, Signature로 구분되며, "." 구분자를 사용하여 구분합니다.  각 부분은 URL-Safe 하게 Base64 Encoding 된 JSON 형태를 가집니다.

 

 

위 사진처럼 JWT.IO 사이트를 통해서 더욱 쉽게 살펴보실 수 있습니다.

 

각 구성요소는 어떠한 정보를 가지고 있는지에 대해서 살펴보도록 하겠습니다.

 

헤더(Header)

토큰의 헤더는 아래와 같이 크게 algtyp 2개의 정보로 구성되어있습니다.

 

{ 
	"alg": "HS256", 
    	"typ": JWT 
}
  • alg : 토큰 서명(Signature)에 사용한 알고리즘을 의미합니다. e.g) HS256, RSA,...
  • typ : 해당 토큰의 타입을 의미합니다. e.g) JWT,...

 

페이로드(payload)

페이로드는 말 그대로 토큰에 담고자 한 정보들을 의미합니다. 이러한 정보들을 각각 클레임(Claim)이라고 부르며, 이러한 클레임(Claim)은 크게 등록된 클레임, 공개 클레임, 비공개 클레임으로 구분됩니다.

 

등록된 클레임

등록된 클레임은 모두 필수 값이 아닌 선택 값입니다.

 

클레임 명 설명 비고
iss(issuer) 토큰을 발행한 주체에 대한 정보  
sub(subject) 토큰의 제목, Unique한 값을 주로 사용합니다.  
aud(audience) 토큰 대상자입니다.   
exp(expiration) 토큰이 만료되는 시간입니다.  Numeric한 날짜형식이여야하며, 현재보다 이후여야합니다.
nbf(not before) 토큰이 활성화되는 날짜입니다. 해당 일 이전에는 토큰이 활성화되지 않으며, exp 클레임과 동일하게 Nuemric한 날짜형식이여야합니다.
iat(issued at) 토큰이 발급된 시간입니다.  
jti(jwt id) JWT 고유 식별자입니다.  

 

공개 클레임(사용자 정의 클레임)

공개 클레임은 충돌 방지(Collision-Resistant)하여야 하며, 충돌되지 않도록 아래와 같이 일반적으로 URI 포맷을 사용합니다.

{
	"https://jongwoon.tistory.com" : true
}

 

비공개 클레임(사용자 정의 클레임)

아래와 같이 클라이언트와 서버 사이에서 정의하여 사용할 정보(Claim)입니다. 보안상 취약할 수 있는 사용자 개인 정보는 담지 않은 것이 좋으며, 최소한의 정보를 담는 것이 좋습니다.

 

{
	"user_name" : "jongwoon"
    	"age" : 100
}

 

서명(Signature)

서명(Signature)은 해당 토큰이 올바르게 생성되었는지를 위한 서명을 위하여 생성된 HMAC입니다. HMAC 부분을 이용하여 토큰이 유효한 토큰인지 확인할 수 있습니다. 서명은 헤더와 페이로드를 각각 base64 UrlEcnode 후, 구분자 "."로 연결한 후, 시크릿 키를 기반으로 생성된 HMAC입니다.

 

일반적으로 비공개 시크릿 키(비공개키)를 사용하여 서명되며, 공개(Public-Private) 키를 사용하여 서명되어질 수도 있습니다.

JWT의 장점

  • Stateless 하고 Self-Contained 하기 때문에, 분산 마이크로 서비스 환경에서 중앙 집중식 인증 서버와 데이터베이스에 의존하지 않는 쉬운 인증 및 인가 방법을 제공합니다. 따라서 MSA 환경에서 더욱 빛을 보고 있습니다.

 

JWT의 단점

  • Payload, Self-Contained 하여, 토큰 자체에 정보를 담고 있으므로, 보안상 취약할 수 있기 때문에 Claim에는 최소한의 정보만을 담는 것이 좋습니다. 중요한 정보는 해당 사용자를 식별할 수 있는 식별자로 추가적으로 서버에 요청하여 사용하는 방법이 좋습니다.

 

  • 토큰의 페이로드에 저장되는 정보(Claim)에 대한 제약사항이 없기 때문에, 많은 정보를 담게 될 경우 JWT는 매 서버와 클라이언트 Request에 담겨 전송되기 때문에 많은 네트워크 자원을 소모할 수 있습니다.

 

  • Stateless: 한번 생성된 토큰을 만료시킬 방법이 존재하지 않기때문에, 위에서 살펴보았듯이 토큰의 만료시간 등을 지정하는 것이 좋습니다.

 

  • 이렇게 생성된 토큰은 브라우저에 쿠키 또는 로컬 스토리지로 관리되기때문에, 보안에 취약할 수 있습니다.

 

참고 문헌

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함