컴퓨터 과학

CS-JWT(JSON Web Token)

용용it 2023. 11. 13. 19:01
JWT는 무엇일까 ?

 

JSON Web Token의 약자로, 웹에서 정보를 안전하게 전달하기 위한 토큰 기반의 규약이다.

주로 클라이언트와 서버 간의 인증 및 권한 관리를 위해 사용된다.

JSON 형식을 사용하여 정보를 표현하며, 디지털 서명이나 암호화를 통해 검증될 수 있다.

 

 

 


 

 

JWT의 구조

 

Header(헤더): JWT의 유형과 사용하는 알고리즘 등에 대한 메타데이터가 포함되어 있다.

 

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

 

 

 


 

 

 

Payload(페이로드): 실제로 전송되는 키, 값 형식으로 이루어진 데이터가 이 부분에 포함된다. 

 

클레임(claim)이라고 불리는 특정 정보를 담고 있다. 

클레임은 세 가지 유형으로 나뉘어진다.

등록된(Registered)클레임

공개(Public)클레임

비공개(Private)클레임

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

 

 

 

잠깐, 그러면 등록된 클레임, 공개 클레임, 비공개 클레임은 무엇일까 ?

 

등록된 클레임(Registered Claims)

 

JWT 표준에 의해 정의 된 것으로, 특정한 의미를 가지고 있다. 몇 가지 주요한 등록된 클레임을 알아보자.

 

iss (Issuer): 토큰 발급자(issuer)를 나타낸다.
sub (Subject): 토큰 주제(subject), 일반적으로 사용자를 나타낸다.
aud (Audience): 토큰 수신자(audience)를 나타낸다.
exp (Expiration Time): 토큰의 만료 시간을 나타낸다.
nbf (Not Before): 토큰의 사용을 허용하는 날짜와 시간을 나타낸다.
iat (Issued At): 토큰 발급 시간을 나타낸다.
jti (JWT ID): JWT의 고유 식별자를 나타낸다.

 

공개 클레임(Public Claims)

 

사용자 정의가 가능하고, 충돌을 방지하기 위해 표준 이름을 가지고 있다.

예를 들면 이름, 이메일 주소 등이 있다.

{
  "name": "Draon",
  "email": "yong@gmail.com"
}

 

 

 

비공개 클레임(Private Claims)

 

서버와 클라이언트 간에 사전 협의한 정보를 나타낸다.

서버와 클라이언트 간의 특정한 데이터를 주고 받기 위해 사용될 수 있다.

{
    "color": "black",
    "role": "admin"
}

 

 

 

 

의문 :  서버와 클라이언트 간에 사전 협의한 정보를 비공개 클레임이라고 하는데,
협의한 정보가 만약  name이라면 이건 비공개 클레임인가 공개 클레임인가 ?

답 : name은 JWT 규격에 정의되어 있기 때문에 공개 클레임이다.

 

 

의문 : https://www.iana.org/assignments/jwt/jwt.xhtml#claims  라는 사이트는
IANA에서 제공하는 JWT 클레임 레지스트리, 표준 클레임과 등록된 클레임의 목록을 확인할 수 있는데, 
iss은 등록된 클레임일까 공개 클레임일까 ? 

답: 등록된 클레임이면서 공개 클레임이다.

 

 


 

 

Signature (서명) 

헤더와 페이로드를 인코딩한 후, 비밀 키를 사용하여 서명된 부분이다.

서버는 이 서명을 검증하여 토큰이 유효한지 확인합니다.

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

 

 

즉, 헤더 + "." + 페이로드 "." + 서명으로 점(.)을 이용하여 연결한다.

 

JWT의 예시이다.

출처: https://jwt.io/

 

 

 


 

 


JWT의 일반적인 사용 시나리오이다.

토큰 생성 (Token Generation)


사용자가 로그인하거나 인증을 수행한 후, 서버에서 JWT를 생성한다.

 

 

토큰 발급 (Token Issuance)


서버는 클라이언트에게 JWT를 발급한다.
클라이언트는 이 토큰을 저장하고 나중에 서버에 전달하여 인증 또는 권한 부여를 요청할 때 사용한다.

 

 

 

토큰 전송 (Token Transmission)


클라이언트는 발급받은 JWT를 HTTP 헤더, 쿠키, 또는 요청의 일부로 서버에 전송한다.
주로 HTTP 헤더의 Authorization 헤더에 Bearer 스킴을 사용하여 전송된다.

 

 

토큰 검증 (Token Verification)


서버는 클라이언트가 제공한 JWT를 받아 검증한다.
서명을 통해 토큰의 무결성을 확인하고, 클레임을 검사하여 토큰이 유효한지 확인한다.

 

 

 

인증 및 권한 부여 (Authentication and Authorization)


서버는 토큰을 검증한 후 클라이언트의 인증 및 권한 부여를 수행한다.


클라이언트에게 해당 리소스 또는 서비스에 대한 접근 권한을 부여한다.


일반적으로 JWT는 웹 애플리케이션 및 API에서 사용되며, 

사용자의 인증 및 권한 부여를 효과적으로 처리하는 데 도움이 된다.

 

 

 

 

이번엔 알기 쉽게 그림으로 보자,

 

'컴퓨터 과학' 카테고리의 다른 글

CS-OSI(Open Systems Interconnection) 7계층  (0) 2023.12.11
CS-데이터베이스(DataBase)  (0) 2023.11.18
CS-JSON(JavaScript Object Notation)  (0) 2023.11.13
CS-OAuth(Open Authorization)  (0) 2023.11.08
c언어-메모리  (0) 2023.01.21