[Research] JWT(Json Web Token)

gimseonjin616·2021년 10월 18일
0

Research

목록 보기
3/8
post-thumbnail

JWT(Json Web Token)이란?

JSON 객체를 사용하여 가볍고 자가수용적인 (self-contained) 방식으로 정보를 안전성 있게 전달해주기 위한 토큰

장점

  • JWT 의 주요한 이점은 사용자 인증에 필요한 모든 정보는 토큰 자체에 포함하기 때문에 별도의 인증 저장소가 필요 없다.
  • 쿠키를 전달하지 않아도 되므로 쿠키를 사용함으로써 발생하는 취약점이 사라진다.
  • URL 파라미터와 헤더로 사용
  • 트래픽 대한 부담이 낮음
  • REST 서비스로 제공 가능
  • 내장된 만료
  • 독립적인 JWT

단점

  • Self-contained: 토큰 자체에 정보를 담고 있으므로 양날의 검이 될 수 있다.
  • 토큰 길이: 토큰의 페이로드(Payload)에 3종류의 클레임을 저장하기 때문에, 정보가 많아질수록 토큰의 길이가 늘어나 네트워크에 부하를 줄 수 있다.
  • Payload 인코딩: 페이로드(Payload) 자체는 암호화 된 것이 아니라, BASE64로 인코딩 된 것입니다. 중간에 Payload를 탈취하여 디코딩하면 데이터를 볼 수 있으므로, JWE로 암호화하거나 Payload에 중요 데이터를 넣지 않아야 한다.
  • Stateless: JWT는 상태를 저장하지 않기 때문에 한번 만들어지면 제어가 불가능합니다. 즉, 토큰을 임의로 삭제하는 것이 불가능하므로 토큰 만료 시간을 꼭 넣어주어야 한다.
  • Tore Token: 토큰은 클라이언트 측에서 관리해야 하기 때문에, 토큰을 저장해야 한다.

활용

  • 로그인
    서버는 유저의 세션을 유지할 필요가 없다.
    유저가 보낸 토큰만 확인하면 된다.
    서버의 자원을 아낄수 있다.

  • 정보교류
    JWT는 두 개체 사이에서 안정성있게 정보를 교환하기에 좋은 방법이다.
    그 이유는, 정보가 sign 이 되어있기 때문에 정보를 보낸이가 바뀌진 않았는지, 또 정보가 도중에 조작되지는 않았는지 검증할 수 있다.

JWT 구조

헤더

Header 는 두가지의 정보를 지니고 있다.

  • typ: 토큰의 타입을 지정한다.
    EX)JWT

  • alg: 해싱 알고리즘을 지정한다.
    EX) HMAC SHA256 or RSA

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

페이로드

Payload 부분에는 토큰에 담을 정보가 들어있다. 정보는 클레임(claim)이라는 단위로 다뤄지며 name / value 의 한 쌍으로 이뤄져있다.

클레임은 3가지로 구분된다.

  • 등록된 (registered) 클레임,
    토큰에 대한 정보들을 담기위하여 이름이 이미 정해진 클레임

    	iss: 토큰 발급자 (issuer)
    	sub: 토큰 제목 (subject)
    	aud: 토큰 대상자 (audience)
    	exp: 토큰의 만료시간 (expiraton)
    	nbf: 토큰 시작시간(Not Before)
    	iat: 토큰이 발급된 시간 (issued at)
    	jti: JWT의 고유 식별자
  • 공개 (public) 클레임
    공개 클레임들은 충돌이 방지된 (collision-resistant) 이름을 가지고 있어야 한다. 충돌을 방지하기 위해 주로 클레임 이름을 URI 형식으로 짓는다.

{    		
	"https://velopert.com/jwt_claims/is_admin": true
}
  • 비공개 (private) 클레임
    양 측간에 (보통 클라이언트 <->서버) 협의하에 사용되는 클레임으로 공개 클레임과는 달리 이름이 중복되어 충돌이 될 수 있으니 사용할때에 유의해야한다.
{
    "username": "velopert"
}

서명

JSON Web Token 의 마지막 부분은 바로 서명(signature) 이다. 이 서명은 헤더의 인코딩값과, 정보의 인코딩값을 합친후 주어진 비밀키로 해쉬를 하여 생성한다.

HMAC-SHA256(
 secret,
 base64urlEncoding(header) + '.' +
 base64urlEncoding(payload)
)
profile
to be data engineer

0개의 댓글