Develop/java,spring

JWT(Json Web Token) 이란?

kudl 2020. 12. 15. 20:56

JSON Web Token (JWT) 은 웹표준 (RFC 7519) 으로서 두 개체에서 JSON 객체를 사용하여 가볍고 자가수용적인 (self-contained) 방식으로 정보를 안전성 있게 전달해준다.
Base 64로 인코딩시 = 문자가 나올때가 있는데 URL safe 하지 않으므로 삭제 해야한다. 삭제해도 디코딩은 정상적으로 수행된다.

JWT - JSON Web Token 으로 토큰의 형태이다.

Cookie - 사용자 컴퓨터에 방문 기록, 로그인 정보 등과 같은 데이터를 기록할 수 있는 작은 파일 형태를 나타낸다.

XSS - Cross Site Scripting 으로 사용자의 정보(쿠키, 세션)를 탈취하는 것이 목적인 공격 기법이다.(document.cookie를 사용한 정보 탈취)

CSRF - Cross Site Request Forgery 으로 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위를 하는 공격 기법이다. (로그인후 글작성)

JWT 토큰 인증은 stateless이고 Cookie 인증은 서버와 클라이언트가 session-id를 통해 인증을 하게되며 sateful 이다.
JWT 토큰은 쿠키에 저장하는게 일반적이며 쿠키의 httpOnly, secure 속성을 사용하면 XSS 공격을 막을수있다. 쿠키는 CSRF 공격에 취약하므로 Referer 체크, CSRF 토큰 사용 등 방어책이 필요하다.

JWT 는 . 을 구분자로 3가지 문자열로 되어있다.
Header.Payload.Signature

Header

typ: 토큰의 타입
alg: 해싱 알고리즘을 지정한다. 보통 SHA256, RSA 사용된다. 토큰을 검증 할 때 사용되는 signature 부분에서 사용한다.

{
   "alg" : "HS256",
   "typ" : "JWT"
}

 

Payload


토큰에 담을 등록된 (registered) 클레임, 공개 (public) 클레임, 비공개 (private) 클레임 정보가 있다.
클레임은 name/value 한쌍으로 이루어진다.

등록된클레임(Registered Claim)

iss: 토큰 발급자(issuer)
sub: 토큰 제목(subject)
aud: 토큰 대상자(audience)
exp: 토큰 만료 시간(expiration), NumericDate 형식으로 되어 있어야 함 ex) 1480849147370
nbf: 토큰 활성 날짜(not before), 이 날이 지나기 전의 토큰은 활성화되지 않음
iat: 토큰 발급 시간(issued at), 토큰 발급 이후의 경과 시간을 알 수 있음
jti: JWT 토큰 식별자(JWT ID), 중복 방지를 위해 사용하며, 일회용 토큰(Access Token) 등에 사용

공개클레임(Public Claim) 충돌 방지된 이름으로 있어야한다. 충돌을 방지하기 위해 URL 형식으로 짓는다.

비공개클레임(Private Claim)은 서버 클라이언트 간에 합의된 클레임이다. 충돌이 될수도 있다.

Signature


헤더의 인코딩값과, 정보의 인코딩값을 합친후 주어진 비밀키로 해쉬를 하여 생성한다.