본문 바로가기
웹개발/JWT

JWT(JSON Web Token)

by 어컴띵 2021. 3. 22.

참조: auth0.com/learn/json-web-tokens/?_ga=2.110734850.648172899.1616396953-1758314723.1615595517

 

Get Started with JSON Web Tokens - Auth0

Get Started with JSON Web Tokens in Auth0

auth0.com

위 내용을 참조하여 작성함 (거의 번역기로 번역함)

1. JWT는 무엇인가?

JWS(JSON Web Token)은 JSON객체를 이용해서 당사자간에 안전한 정보전달을 위한 컴팩트 하고 독립적인 방법을 정의하는 개방된 표준이다. 이정보는 디지탈 서명이 되어 있으므로 검증되었고 신뢰할수 있다. JWT는 HMAC 알고리즘 또는 RSA를 이용한 공개/비밀키 쌍을 이용하여 서명 할수 있다.

 

2. 언제 JWON WEB TOKEN을 사용하는가?

인증과 정보교환에 사용할수 있다.

 

3. JWT의 구조

JWS는 dot(.) 으로 구분된 세부분으로 구성된다.

  • Header
  • Payload
  • Signature

다음과 같은 형태를 가진다.

xxxxx.yyyyy.zzzzz

header.payload.signature

 

Header

header는 2부분으로 구성된다.

토큰 타입과 해쉬 알고리즘(HMAC SHA256 or RSA)

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

그다음 Base64URL로 인코딩한다.

 

Payload

토큰은 두번째 부분은 claims가 포함된 payload(전송되는 중요한 데이타정도 되겠다)다.  claims이란 엔티티(일반적으로 사용자) 와 추가 메타데이터에 대한 설명이다. claims는 3가지(reserved, public, private)가 있다

Reserved Claims: 미리 정의된 claims이다. 필수는 아니지만 쓰기를 권장하고 그중일부는 iss(발행자), exp(만료시간), sub(주제), aud(청중) 등이 있다.

클래임 이름은 3자여야한다.

 

Public Claims: 사용자가 정의 할수 있다. 이름의 충돌을 방지하기 위해서 웹토큰 레지스토리에 저장하거나, URI방식으로 정의 해야한다.

 

Private Claims: 서로간의 정보를 공유하기위해서 정의한 사용자 지정 claims다. 

 

{
    "sub": "1234567890", /* Reserved claims */
    "name": "John Doe", /* Public claims */
    "admin": true /* Private claims */
}

Signature

서명 부분을 만들기 위해서 인코딩된 header와 payload 그리고 secret, header에 지정되 algorithm을 가져와서 서명을 해야한다.

 

HMAC SHA256 알고리즘을 이용해서 서명하려는 경우 다음과 같이 사용한다.

HMACSHA256(
    base64UrlEncode(header) + "." +
    base64UrlEncode(payload),
    secret)

 

4. JWT는 어떻게 작동하는가

인증에서 사용자가 아이디/비번으로 로그인에 성공했을때 JWT token을 리턴한다. token은 사용자의 자격을 증명하는 데이타이므로 보안문제에 대해서 세심한 주의를 기울여야 한다. 일반적으로 토큰을 오래 보관해서는 안된다.(만료시간을 짧게 가져가는게 좋다는 의미?) 

 

그리고 세션데이터를 브라우저 저장소에 저장하면 안된다.

cheatsheetseries.owasp.org/cheatsheets/HTML5_Security_Cheat_Sheet.html#local-storage

 

HTML5 Security - OWASP Cheat Sheet Series

HTML5 Security Cheat Sheet Introduction The following cheat sheet serves as a guide for implementing HTML 5 in a secure fashion. Communication APIs Web Messaging Web Messaging (also known as Cross Domain Messaging) provides a means of messaging between doc

cheatsheetseries.owasp.org

 

유저가 인증이 필요한 접근을 할때는 Authorization 헤더에 Bearer 스키마를 이용해서 token과 같이 요청을 보내야한다.

Authorization: Bearer <token>

 

이런 인증방식은 유저의 상태를 서버의 메모리에 저장하지 않는다. 인증이 필요한 서버경로에 접근시에는 Authorization 헤더에 검증된 token을 가지고 있으면 접근이 허용된다. 그리고 token에 필요한 정보들이 있기때문에 데이타베이스에 접근해야할 필요성이 줄어든다.

 

무상태(stateless) 데이타 api에 전적으로 의존할수 있고 다운스트림 서비스들을 요청할수도 있다. CORS는 쿠키를 사용하지 않으므로 api를 제공하는 도메인은 중요하지 않다.(한마디로 인증이 된 token만 있으면 api를 제공하는 서비스를 이용할수있다 이말인거 같다.) 

 

 

5. 왜 JSON 웹 토큰을 사용해야 하나?

JWT(JSON Web Token)와 SWT(Simple Web Token) , SAML(Security Assertion Markup Language Tokens)와 비교하면 JSON은 다른 방법보다 덜 복잡하고, 크기도 작고, HTML및 http환경에서 전달이 용이하다

JSON은 대부분의 프로그래밍에서 일반적으로 사용이 가능하고 작업하기가 더쉽다.

사용과 관련해서 인터넷에서 많이 사용된다. 이는 다양한 플랫폼, 특히 모바일엣 에서 JWT의 클라이언트 측 처리가 간편하다.

 

이상 대충 JWT를 설명하는 페이지를 보면서 한번 살펴보았다.

 

다시한번 정리는 하자면

 

JSON Web Token은 현재와 같은 인터넷 환경에서 인증, 데이타교환에 용이한 처리방식이며 JWT의 구조는 3부분(header, payload, signature)으로 나누어져 있다. header는 타입, 알고리즘을 나타내며 payload는 전송할 데이타를 나타내고, signature는 알고리즘, header, payload, secret로 서명하는 부분이다. jwt는 서버에 로그인후 리턴값으로 jwt token을 받으며 인증이 필요한 url에 접근시 http Authorization header에 bearer과 함께 token을 보내고 서버에서 token에 대한 인증을 받고 해당 url에 접속을 한다.