개발조각

JWT(JSON Web Token) 본문

CS

JWT(JSON Web Token)

개발조각 2023. 3. 13. 13:27
728x90
반응형

JWT란 무엇인가


JWT(JSON Web Token)는 유저 간에 정보를 JSON 개체로 안전하게 전송하기 위한 간결하고 독립적인 방법을 정의하는 개방형 표준( RFC 7519 )입니다.

즉 JWT는 표준이며 모든 JWT는 토큰이지만 모든 토큰이 JWT는 아닙니다.

 

JWT는 상대적으로 크기가 작기 때문에 URL, POST 매개변수 또는 HTTP 헤더 내부를 통해 전송할 수 있으며 빠르게 전송됩니다.

 

Json Wet Token 약자로 모바일이나 웹의 사용자 인증을 위해 사용하는 암호화된 토큰을 의미합니다.

 

 

언제 JWT를 사용할까?


JWT는 다양한 방법으로 사용할 수 있습니다.

 

인증

JWT를 사용하는 가장 흔한 시나이오이며, 사용자가 자격 증명을 사용하여 성공적으로 로그인하면 사용자의 정보를 기반으로 한 ID토큰이 발급합니다.

  • ID토큰은 항상 JWT입니다.

 

승인

사용자가 성공적으로 로그인하면 애플리케이션은 해당 사용자를 대신하여 경로, 서비스 또는 리소스(예: API)에 액세스 하도록 요청할 수 있습니다.

 

정보교환

JWT는 서명이 가능하기 때문에 당사자 간에 안전하게 정보를 전송 교환하기에 좋습니다.

보낸 사람이 누구인지 확신할 수 있기 때문입니다.

JWT의 구조를 통해 콘텐츠가 변조되지 않았는지 확인할 수 있습니다.

 

 

JWT 구조


JWT는 세 부분이 연결된 Base64Url 인코딩 문자열로 구성되며, 점(.)으로 구분됩니다.

  • Header
  • Payload
  • Signature

URL에서 파라미터로 사용할 수 있도록 URL_Safe한 Base64Url 인코딩을 사용합니다.

Base64
이진(8bit) 데이터를 문자 코드에 영향을 받지 않은 공통 ASCII 영역의 문자들로 바꾸는 인코딩 방식
여기서 64는 64진법을 의미 → 64개의 문자들을 반복적으로 사용하겠다는 의미

Base64 Url Safe
웹으로 전송하기 위해서 사용하는 문자가 Base64 형태의 문자
Base64를 쓰다보니 문제가 발생(62: +, 63: /이기 때문에) → 이 문자들을 전송하게 되면 전상적으로 전송되지 않는 문제 발생
이러한 오류를 막기 위해 등장한 것이 safe (62: - minus, 63: _ underline)

 

따라서 JWT는 아래와 같이 보입니다.

xxxxx.yyyyy.zzzzz
// Header.Payload.Signature

 

 

header

토큰의 유형인 JWT와 HMAC SHA256 또는 RSA와 같은 서명 알고리즘의 두 부분으로 구성되어 있습니다.

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

 

Payload

클레임(claim)이 담겨있습니다.

클레임(claim)이란 사용자 및 추가 데이터에 대한 정보 조각

클레임이 담겨있다는 말은 토큰에 담을 정보(서버에서 첨부한 사용자 권한 정보와 데이터)가 담겨있다.라고 생각하시면 됩니다.

클레임은 name/value의 한쌍으로 이뤄져있습니다.

 

클레임(claim)의 종류

  • Registered claims(등록된 클레임) :
    • 필수는 아니지만 유용한 클레임 세트를 제공하기 위해 권장되는 미리 정의된 클레임 세트
    • iss(발급자), expiration(만료 기간), sub(주제), audience(대상)등이 있다.
  • Public claims(공개 클레임)
    •  JWT를 사용하는 사람들이 마음대로 정의할 수 있습니다.
  • Private claims(비공개 클레임)
    • 사용에 동의한 당사자 간에 정보를 공유하기 위해 생성된 사용자 정의 클레임입니다.
{ 
	"sub": "1234567890", // 등록 클레임
	"name": "John Doe", // 비공개 클레임
	"admin": true
}

 

Signature

서명은 메시지가 도중에 변경되지 않았음을 확인하는 데 사용되며, 

개인 키로 서명된 토큰의 경우 JWT의 발신자가 누구인지도 확인할 수 있습니다.

서명을 만들기 위해 Base64로 인코딩 된 헤더와 페이로드를 암호와 함께 가져와서 헤더에 지정된 알고리즘으로 서명합니다.

 

 HMAC SHA256 알고리즘을 사용하려는 경우 서명은 다음과 같은 방식으로 생성됩니다.

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

 

 

JWT(JSON Web Token)은 어떻게 작동하나?


인증 시 사용자가 자격 증명을 성공적으로 로그인하면 JSON 웹 토큰이 반환됩니다.

토큰은 자격 증명이므로 보안 문제를 방지하기 위해 주의해야 됩니다.

  1. 일반적으로 토큰은 필요 이상으로 오래 보관해서는 안됩니다.
  2. 중요한 정보가 들어있는 데이터는 브라우저 저장소(Web Storage, Cookie)에 저장해서는 안됩니다.
  3. 사용자가 보호된 경로 또는 리소스에 액세스 하기를 원할 때마다 사용자 에이전트는 JWT를 전송해야 합니다.
  4. HTTP 헤더를 통해 JWT 토큰을 전송할 경우 너무 커지지 않도록 해야 합니다. 

 

APO 또는 리소스에 액세스하기 위해 JWT를 얻고 사용하는 방법

출처 jwt.io

  1. 응용 프로그램 또는 클라이언트가 서버에 권한 부여를 요청합니다.
  2. 권한이 부여되면 권한 부여 서버는 응용프로그램에 대한 액세스 토큰은 반환합니다.
  3. 응용 프로그램은 액세스 토큰을 사용하여 보호된 리소스(예: API)에 액세스 합니다.

 

 

참고자료


https://jwt.io/introduction

 

JWT.IO

JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.

jwt.io

https://tech.toktokhan.dev/2021/04/30/JWT/

 

JWT란 무엇인가

JWT 안녕하세요 똑똑한 개발자에서 백엔드 개발을 하고 있는 김영환 입니다. JMT졸맛탱이 아니라 JWT😝 웹 개발을 진행하다보면 빠질수 없는 인증 / 인가 .. JWT에 대해서 소개해보도록 하겠습니다.

tech.toktokhan.dev

https://koonsland.tistory.com/57

 

Base64 와 Base64 Url Safe 의 차이점

컴퓨터 분야에서 프로그래밍, 특히 웹 프로그래밍을 할때에는 Base64라는 것을 주로 많이 사용하게 됩니다. 문자들을 Base64(베이스64) 형태로 변환해서 전송하고 받은 쪽은 다시 변환해서 사용하는

koonsland.tistory.com

https://auth0.com/docs/secure/tokens/json-web-tokens

 

Auth0

Get started using Auth0. Implement authentication for any kind of application in minutes.

auth0.com

 

728x90
반응형

'CS' 카테고리의 다른 글

RESTful API  (0) 2023.03.19
Comments