본문 바로가기
Research/Computer Science

JWT

by RIEM 2023. 4. 6.

Nam jun Paik, Li Tai Po

JWT란

JWT(Json Web Token)은 JSON 형식으로 데이터를 주고 받는 방법이다.

RFC 7519에 명되센 국제 표준이며, 토큰 내 정보가 포함된(Self-contained) 클레임(claim) 기반 토큰이다. JWT의 목적은 인증(Authentication)과 권한부여(Authorization)다. 클라이언트는 인증 후 JWT를 발급 받고 이후 API 요청 시 요청 헤더에 JWT를 담아 요청하는 방식으로 사용한다. JWT는 해시나 비대칭키로 서명(Signature)할 수 있다.

서버기반 인증 vs. 토큰기반 인증

HTTP는 stateless한 프로토콜이기에 인증 상태를 저장하지 않는다. 그렇게 되면 매번 페이지를 넘길 때마다 인증을 해야하므로 귀찮아진아. 이 문제를 해결하는 방식으로 1)서버기반 인증과 2)토큰기반 인증이 있다.

서버기반 인증

인증 정보를 서버에 두는 방식이다.
로그인 성공 이후 서버에서는 사용사 세션(Session)을 생성한다. 클라이언트의 브라우저에는 해당 세션 ID가 담긴 쿠키를 만들어 보관한다. 서버는 세션ID로 클라이언트를 파악한다. 이는 서비스가 커져 비용 문제를 고려하여 서버를 수평적으로 확장해야 하는 상황이 발생할 때, 분산된 서버 간 데이터 불일치 문제가 발생할 수도 있다는 단점이 존재한다.

토큰기반 인증

유저 정보가 담긴 토큰을 클라이언트가 가지고 있는 방식이다.
서버 API 요청 시 HTTP header에 실어 전송한 뒤, 서버는 이를 검증(Validation)한다. 서버는 발급과 검증 역할만 하기 때문에 책임은 클라이언트에게 있다. 이러한 특징 덕분에 서버는 유저 정보를 저장할 필요가 없어 비용을 아낀다. 다만 클라이언트가 소지하게 되면 정보 노출될 가능성이 있기에 민감정보는 담지 않아야 한다. 게다가 세션ID 대비 용량이 커서 오버헤드가 발생할 수도 있다.

JWT의 구조

토큰은 Header, Payload, Signature으로 구성되며, 각 파트는 JSON 형식이다. JSON 특성상 띄어쓰기가 포함될 수 있기에 이를 한줄로 표현하기 위해Base64으로 인코딩한다.

1)Header

헤더에는 알고리즘과 토큰 유형이 포함된다. 알고리즘은 주로 HMAC SHA256, RSA가 주로 사용된다.

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

2)Payload

페이로드는 클레임(Claim)이라는 정보 단위로 구성된다. 클레임의 유형은 3가지로, 1)등록된 클레임(Registered Claim), 2)공개 클레임(Public Claim), 3)비공개 클레임(Private Claim)으로 구성된다.

등록된 클레임(Registered Claim)

JWT 사양에 정의된 클레임으로 7가지가 있다.

  • iss : Issuer. 토큰 발급자
  • sub : Subject. 토큰 제목
  • aud : Audience. 토큰 대상자
  • exp : Expiration Time. 토큰 만료 시각
  • nbf : Not Before. 토큰 활성 시각
  • iat : Issued At. 토큰 발급 시각
  • jti : JWT ID. JWT 식별자

공개 클레임(Public Claim)

JWT 사용자들이 정의하는 클레임이다. 서버와 클라이언트를 넘어 제 3자가 JWT를 함께 사용할 때 생길 수 있는 충돌을 방지하기 위한 클레임이다.

{
    "email": "hello@gmail.com",
    "profile": "ttp://yo.com/hello.png",
    "http://htllo.com/good": true
}

비공개 클레임(Private Claim)

서버-클라이언트 간 사용하는 클레임이다.

{
    "userId": "09924214",
    "userName": "John" 
}

3)Signature

Base64 인코딩된 Header + Base64 인코딩된 Payload + 비밀키 => 암호화하는 작업이다. 타인에 의해 변조되지 않았는지 확인하기 때문에 무결성을 보장하는 장치다.

JWT 사용 시 고려할 부분

과거에는 유저들의 토큰을 탈취하는 문제가 자주 발생했으나, 이를 조치할 수 있는 방안이 부족했다. 최근에는 이 문제를 막기 위해 Access Token, Refresh Token을 함께 사용한다. Access Token은 5분~1일 정도, Refresh Token은 2주 정도 유지된다.

Reference

'Research > Computer Science' 카테고리의 다른 글

CORS  (0) 2023.04.07
parallel computing  (0) 2023.04.06
OOP in Javascript  (0) 2023.04.04
ISO, TCP-UDP, TCP 3way handshake  (0) 2023.03.31
List, Set, Map, HashMap  (0) 2023.03.30

댓글