본문 바로가기
프로그래밍

토큰으로 검증하자! JWT(JSON 웹 토큰)

by bantomak 2025. 4. 7.
반응형

JWT(JSON Web Token)란?

JWT(JSON Web Token)는 사용자 인증 정보를 JSON 형식의 토큰으로 표현하고, 이를 디지털 서명을 통해 안전하게 전달하는 방식이다.

  • "서버가 인증을 거친 사용자에게 발급해 주는, 변조 불가능한 정보 뭉치"
  • 클라이언트는 이 토큰을 보관하고, 이후 요청할 때마다 헤더에 포함시켜 다시 인증받지 않고도 서비스를 이용할 수 있다.
  • 즉, 한번 인증받으면 인증 상태가 유지된다.

사용자 인증 정보를 기록하고 있는 토큰이라고 생각하면 이해하기 편하다.

추가적으로 JWT의 탄생배경에 대해서 알아보자.  이를 위해서는 우선 Cookie와 Session에 대해서 알아야 할 필요가 있다.

🍪 쿠키(Cookie)

쿠키는 '클라이언트(웹 브라우저)에 저장되는 작은 데이터 조각'을 말한다.

서버가 HTTP 응답에 포함시켜 브라우저에 저장시키고, 이후 요청마다 자동으로 전송된다.

 

쿠키를 사용하는 이유는 쿠키에 특정 정보를 저장하고 사용하면 매우 편리하기 때문입니다. 기본적으로 웹 환경은 상태를 별도로 저장하지 않기 때문에(STATELESS) 로그인 시에 사용했던 ID, Password를 매번 입력해야 하는 상황이 발생합니다. 이때 쿠키를 사용하면 ID, Password를 자동으로 포함해서 서버에 전송해 준다.

 

쿠키의 작동 방식

  • 사용자가 서버에 로그인 요청
  • 서버가 Set-Cookie 헤더로 쿠키를 내려줌
  • 클라이언트는 쿠키를 저장
  • 이후 모든 요청에 Cookie 헤더로 해당 쿠키를 함께 전송

🧾 세션(Session)

세션이란 '서버가 사용자 상태 정보를 저장하는 방식'이다. (<=> 쿠키는 클라이언트에서 정보를 저장)

클라이언트는 보통 세션 ID만 쿠키로 저장하고 실제 데이터는 서버 메모리 상에 존재하게 된다.

 

세션의 작동 방식

  • 사용자가 로그인하면 서버가 고유한 '세션 ID' 생성
  • 해당 ID를 쿠키(Set-Cookie)로 클라이언트에 전달
  • 클라이언트는 이후 요청에 세션 ID를 포함해 보냄
  • 서버는 세션 ID를 조회하여 사용자 상태를 복원

쿠키 vs 세션

세션을 사용하면 서버가 사용자의 상태를 저장한다. 이는 http의 장점이라고 할 수 있는 무상태(STATELESS)를 위배하게 된다. 서버의 세션 저장소가 생기면서 상태를 저장하고 있기 때문이다. 상태를 저장하면서 생기는 문제점은 서버가 상태를 저장하기 때문에 서버를 늘리고 싶다면 서버가 개별로 세션을 저장하는 것이 아닌 하나의 저장소를 이용해서 세션을 저장하고 관리해야 한다. 즉 관리 이슈가 증가하게 된다.

  • 세션 저장소에 문제가 생기면 전체 인증 체계에 문제가 생김. (이는 기존에 인증받은 유저들도 마찬가지)
  • 상태를 저장하기 때문에 http의 장점인 ScaleOut을 사용하기 어려워짐
  • 세션 ID를 탈취당할 수 있다는 보안적 취약점이 존재함
  • 매 요청 시에 세션 저장소를 조회해야 함

JWT의 등장

JWT(JSON Web Token)은 이러한 환경 속에서 태어난 인터넷 표준 인증 방식이다.

  • 쿠키+세션을 대신하여 토큰 기반 인증을 적용하고자 등장
  • IETF(Internet Engineering Task Force)에서 표준화
  • RFC 7519: JSON Web Token (May 2015)
  • OAuth 2.0, OpenID Connect 등과 함께 인증·인가 기술의 핵심으로 자리 잡았다.

JWT 구조

JWT는 .으로 구분된 3개의 문자열로 구성된다.

aaaaa.bbbbb.ccccc
Header:
{
  "typ": "JWT",
  "alg": "HS256"
}

Payload:
{
  "sub": "1",
  "name": "John Doe",
  "admin": true,
  "iat": 123,
  "exp": 1743977956
}

Signature : NTNv7j0TuYARvmNMmWXo6fKvM4o6nv/aUi9ryX38ZH+L1bkrnD1ObOQ8JAUmHCBq7Iy7otZcyAagBLHVKvvYaIpmMuxmARQ97jUVG16Jkpkp1wXOPsrF9zwew6TpczyHkHgX5EuLg2MeBuiT/qJACs1J0apruOOJCg/gOtkjB4c=

 

 

JWT 디코더 & 인코더 (JWT decoder & encoder) | 안전하고, 간단하며, 사용자 친화적

JWT 를 신속하게 온라인으로 디코드하고 인코드하며, 그들의 서명을 검증하세요. 다양한 알고리즘을 사용한 JWT 예제와 단계별 JWT 구현 가이드를 탐색해보세요.

logto.io

위에 웹사이트에 직접 만들어볼 수 있다.

openssl을 사용해서 secret key 생성하기

openssl을 사용하면 간편하게 secret key 생성이 가능하다. 직접 생성한 key를 가지고 JWT를 만들어보자.

openssl rand -hex 64

JWT의 주된 용도 - 인증(Authentication)

  • 사용자가 서버에 로그인하면, 서버는 JWT를 발급
  • 클라이언트는 JWT를 로컬에 저장 (예: localStorage, 쿠키)
  • 요청 시 Authorization 헤더에 발급받은 JWT를 넣어 서버에 전송
Authorization: Bearer <JWT>

JWT의 주된 용도 - 인가(Authorization)

  • 토큰 안에 사용자 권한/역할 정보(role, scope)를 포함
  • 서버가 해당 사용자의 권한을 판단 가능

자주 사용되는 곳

 

  • 웹 로그인 시스템 (SPA, 모바일 앱 등)
  • OAuth 2.0: 엑세스 토큰 형식으로 사용됨
  • OpenID Connect: ID 토큰에 사용
  • 마이크로서비스 간 통신
  • 서버리스 아키텍처 (ex: AWS Lambda)

언제 JWT를 써야 하는가?

  • 서버 간 인증이 필요한 분산 환경
  • SPA 앱에서 세션 없이 인증 유지
  • 모바일 앱에서 인증 처리
  • API 서버가 다수인 구조

같이 읽으면 좋은 글

 

HTTPS 통신을 위한 자체 인증 SSL 인증서 만들기

전반적인 과정OpenSSL 다운로드Private Key 생성인증서 요청(CSR) 파일 생성(private.csr)자체 서명하기 위해서 rootCA 생성자체 서명한 인증서 생성(private.crt)pem 확장자로 변환NGINX config 파일에서 해당 파일

jettstream.tistory.com

댓글