JWT

박총명·2025년 3월 10일
post-thumbnail

🎈사전 지식

JSON

Javascript Object Notation, 데이터를 주고받기 위해 사용하는 경량의 데이터 형식 중 하나

JSON은 Javascript 객체 문법으로 구조화된 데이터를 표현하기 위한 문자 기반의 표준 포맷이다. 웹 어플리케이션에서 데이터를 전송할 때 일반적으로 사용한다. 문자열 형태로 존재하며, JSON 형식에서는 키와 값의 쌍으로 이루어진 데이터 객체를 사용한다

{
  "id" : "gildong",
  "password" : "1234",
  "age" : "30",
  "job" : [
    {
		"name" : "programmer",
      	"year" : "2015"
    },
    {
    	"name" : "dancer",
    	"year" : "2018"
    }
  ]
}

Session

Session 글 보기

Token 인증 방식

  • 토큰에 요청한 사람의 정보가 포함되어, 서버는 DB를 조회하지 않고 토큰을 검증할 수 있다.
  • 따라서, 서버의 확장성이 높아지고 대량의 트래픽에도 대처가 가능하다.
  • 서버 내부에서는 비밀키 하나만 가지고 있으면, 토큰 검증을 수행할 수 있다.

🎈JWT

인증에 필요한 정보를 암호화한 JSON 형식의 토큰

JWT는 인증과 인가에 일반적으로 사용되는 토큰의 일종이다. 인증에 필요한 사용자 정보를 암호화하여 자체적으로 포함한다는 특징이 있다.
사용자 정보뿐만 아니라 암호화된 서명을 포함하고 있어 무결성도 검증가능하다.
JSON 형태의 사용자 데이터를 URL에 대해 안전한 문자열(Base64 URL-safe Encode)로 인코딩하였기 때문에 어떤 경로로든 전송이 가능하다.
JWT 토큰을 HTTP헤더에 실어 서버가 클라이언트를 식별할 수 있도록 한다.

구조

xxxxx.yyyyy.zzzzz, X:[Header] / Y:[Payload] / Z : [Signature]

  1. 세가지 구성요소(Header, Payload, Signature)를 가진다.
  • Header : 사용할 해시 알고리즘 등의 메타 정보를 포함
  • Payload : 키와 값 형식으로 이루어진 정보(claim)의 구성 -> 이 값을 서버로 전달한다.
  • Signature : (Header + Payload + Key) 정보를 해싱하여 Client에게 함께 전달한다.
  1. 사용자가 인증을 수행하면, 서버는 다음의 정보를 가진 JWT 토큰을 발급한다.

예시

  • Header : {"alg" : "HS256", "typ" : "JWT"}
  • Payload : {"sub" : "user","id" : "admin"}
  • Signature : 위 두 내용에 대하여 적절한 서버 키(Key) 값을 더해 해싱한 값

Jwt 예시 사이트

인증

나중에 사용자(Client)는 자신이 받았던 JWT 토큰을 다시 서버에 전달한다.
서버는 (헤더 + 페이로드 + 서버 내에 있는 키(Key))를 해싱한 값이 사용자로부터 전달받은 것과 일치하는지 체크한다.
이 과정에서 서버가 가지고 있는 비밀키(secret key)를 사용한다.

원리

사용자는 서버가 처음에 부여했던 권한만큼의 작업을 요청할 수 있다.
데이터를 변경하면 해시 값이 변경되므로, 악의적인 공격자가 Payload를 수정하는 것이 불가능하다.
예를 들어 사용자의 등급이 1,2,3,4,5일 때 5등급의 사람이 1등급으로 Payload를 변경해 보냈다고 해보자. 이 경우, 서버의 키를 모르므로, 서명 값이 일치하지 않아 서버가 위조 여부를 알 수 있다.

장점

  • 세션 기반 인증 방식에 비해 서버가 DB에 세션 정보를 가지고 있을 필요가 없다.
  • 각 해시 값이 어떤 Header와 Payload를 가지는지 일일이 서버 DB에서 저장할 이유가 없다.
    -> 서버에서 상태 정보를 저장하지 않아도 되므로, 무상태성(stateless)이 유지된다.
  • 토큰 기반이므로, 서로 다른 웹 서버에 대해서도 동작할 수 있다.(웹 브라우저의 쿠키와 다른 점)

단점

  • 세션에 비하여 토큰 자체의 데이터 길이가 길다.
  • 페이로드(payload)는 암호화되지 않으므로, 중요한 정보를 담기 적절하지 않을 수 있다.
  • 토큰을 탈취당하는 경우 보안상의 문제가 발생할 수 있다.(때문에 토큰에 사용 기한을 부여한다.)

유의사항

  • Payload 자체는 중간자 공격에 의해 노출될 수 있으므로, 페이로드에는 가능한 민감 정보를 넣지 않는다.
  • 기본적으로 JWT의 목적은 정보 보호보다는 다음의 목적에 가깝다.
  1. 위조 방지
  2. 서버의 메모리 가용 이점(DB 조회 필요 X)

🔗출처

Token 인증방식 이미지 출처
JWT 인증방식 이미지 출처
멋사 블로그-인증 방법

0개의 댓글