컴퓨터 공학 & 통신

[http 통신] 인증 & 인가 - JWT

왈왈디 2023. 3. 28. 17:28
728x90

JWT란?

JWT(JSON Web Token)는 클라이언트(사용자)와 서버 간에 정보를 JSON 개체로 안전하게 전송하기 위한 개방형 표준(RFC 7519)이다.

JWT는 JSON 개체에 기본정보, 전달할 정보, 검증 정보를 모두 담고 있다.

또한, JWT는 전자 서명이 되어있기 때문에 검증 과정을 거쳐 확인하고 신뢰할 수 있으며

Secret Key 또는 Public/Private Key Pair를 사용하여 서명할 수 있다.


JWT의 구조

JWT는 Header, Payload, Signature 3가지 구성 요소로 이루어지며,

각 구성 요소는 dot (.)으로 구분된다.

이미지 출처: wecode


1. Header

Header는 JWT의 첫번째 구성 요소이고, 일반적으로 2가지 정보를 담고 있다.

  • alg : Signature을 만드는데 사용한 알고리즘 정보
  • typ : Token의 타입
// Header
{
    "alg" : "HS256",
    "typ" : "JWT" 
}

2. Payload

Payload는 JWT의 두번째 구성 요소로 실질적으로 전달해야 하는 정보들을 가지고 있다.

Payload에 담긴 정보 하나 하나를 Claim이라고 하는데, 3가지 종류의 Claim이 존재 한다.

  • Registered Claims : 이미 JWT 표준으로 지정된 Claim으로, 총 7가지의 Registered Claim이 존재한다. 해당 Claim을 무조건 전부 사용해야 되는 것은 아니고 적절히 상황게 맞게 사용하면 된다.
    • iss: 토큰 발급자
    • sub: 토큰 제목
    • aud: 토큰 대상자
    • exp: 토큰 만료시간
    • iat: 토큰 발급 시간
    • nbf: 토큰 활성화 시간
    • jti: JWT의 고유 식별자
  • Public Claims : JWT를 사용하는 사람들이 공개적으로 정의할 수 있다. 그러나 기존에 이미 등록되어 있는 Claims와 충돌을 방지하려면 IANA JSON Web Token 레지스트를 참고하거나 UUID, OID, 도메인 이름 등을 사용해야 한다. (잘 안씀)
  • Private Claims : Public Claims과 달리 오직 사용자와 서버 사이에서만 합의하여 사용하는 Claim이다.
{
    "exp": "1245678900", //Registered Claims
    "https://velopert.com/jwt_claims/is_admin": true, //Public Claims
    "user_id" : 12345123 //Private Claims
}

3. Signature

Signature는 JWT의 세번째 구성 요소이고, 문자 그대로 JWT의 서명 부분이다.

Header의 인코딩된 내용과 Payload의 인코딩된 내용을 더한 뒤에 Secret Key와 알고리즘을 이용하여 암호된 값을 나타낸다.

 

서버는 Header와 Payload를 인코딩하여 Signature까지 생성된 JWT를 클라이언트(프론트엔드)에 보낸다.

클라이언트는 token를 local에 저장하여, 요청을 보낼 때 마다 서버 측에 보내게 된다.

서버는 전달 받은 JWT를 secret key로 복호화하여, signature부분이 header와 payload로 정상적으로 복호화되는지 확인한다.

이 과정을 통해 클라이언트로부터 전달받은 token이 유효한 token인지, 신뢰성 있는지 확인할 수 있다.

 

secret key는 token별로 개별 설정되지 않고, 하나의 secret key가 모든 token을 관리한다.

때문에 secret key는 보안에 있어 매우 중요한 부분이다.

매우 중요한 값이기 때문에 어디에도 전달되거나 저장되지 않는다. (db에도 저장하지 않는다.)

주로 환경변수로 설정된다.

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

위의 HS256(HMAC SHA256) 알고리즘으로 암호화된 Signature를 살펴보면, Header와 Payload가 합쳐진 내용을 secret과 HMACSHA256을 이용하여 암호화 되어 있다는 것을 확인 할 수 있다.

즉, secret을 모른다면 암호화된 Signature의 내용은 확인 할 수 없다.

 

 

출처: wecode

728x90