본문 바로가기

Engineering/Web Development

JWT

1. JWT (JSON Web Token)

JWT는 사용자 인증을 위해 사용하는 JSON 기반의 토큰입니다. 주로 웹 애플리케이션에서 세션 관리를 할 때 사용됩니다.

  • 구성: JWT는 3개의 부분으로 구성됩니다.
    1. Header: 토큰의 타입(JWT)과 사용된 서명 알고리즘(예: HMAC SHA256 또는 RSA)을 명시합니다.
    2. Payload: 사용자 정보 또는 클레임(claim) 정보를 담고 있습니다. 예를 들어, 사용자 ID, 만료 시간 등의 정보를 담을 수 있습니다.
    3. Signature: 위의 Header와 Payload를 서명하여 생성한 부분으로, 토큰의 무결성을 확인할 수 있습니다.
  • JWT 사용 흐름:
    1. 사용자가 로그인하면 서버는 JWT를 생성하고, 이를 사용자에게 반환합니다.
    2. 사용자는 이 JWT를 클라이언트(주로 로컬 스토리지나 쿠키)에 저장하고, 이후 요청 시마다 서버로 보냅니다.
    3. 서버는 요청을 받을 때마다 JWT의 유효성을 검사하여 사용자가 인증된 요청인지 확인합니다.
  • 장점:
    • Stateless: 서버가 세션 상태를 저장할 필요가 없습니다. JWT 자체에 정보가 담겨 있기 때문에 서버는 토큰만 확인하면 됩니다.
    • 분산 시스템에 적합: 여러 서버에 분산된 환경에서도 JWT를 사용하여 인증 상태를 유지할 수 있습니다.
  • 단점:
    • 토큰 크기가 상대적으로 크기 때문에 많은 정보를 담으면 비효율적일 수 있습니다.
    • 한 번 발급된 토큰은 만료되거나 폐기되기 전까지 유효하므로, 보안 측면에서 취약할 수 있습니다.

2. JWT와 Refresh Token 기반 인증 시스템

(1) JWT와 Refresh Token

  • JWT (Access Token): 사용자가 인증된 요청을 할 때 사용하는 짧은 유효 기간을 가진 토큰입니다. 서버는 이 토큰을 통해 사용자가 인증된 상태인지 확인합니다. JWT는 access_token이라고도 불립니다. 일반적으로 만료 시간이 짧습니다 (예: 15분~1시간).
  • Refresh Token: access_token의 만료 기간이 지나면, 사용자가 새로 로그인하지 않고도 새 토큰을 발급받을 수 있도록 도와주는 토큰입니다. refresh_token은 일반적으로 긴 유효 기간을 가지며 (예: 며칠, 몇 주) 서버에 저장됩니다. 사용자가 로그아웃할 때, 이 refresh_token을 삭제하여 블랙리스트로 관리합니다.

JWT는 액세스 토큰 (access token)리프레시 토큰 (refresh token)을 사용하여 인증을 처리합니다. 액세스 토큰은 짧은 유효기간을 가지고 API 요청 시 인증을 담당하며, 리프레시 토큰은 액세스 토큰이 만료된 후 새로운 액세스 토큰을 발급받기 위해 사용됩니다.

현재 RMS 프로젝트에서는 로그아웃 시 리프레시 토큰을 DB에서 삭제하여 해당 리프레시 토큰을 더 이상 사용할 수 없게 만드는 방식으로 구현하였습니다.

(2) 로그인/로그아웃 흐름 (Refresh Token 블랙리스트 관리)

  • 로그인: 사용자가 로그인하면 서버는 액세스 토큰과 리프레시 토큰을 생성하고, 리프레시 토큰을 데이터베이스(DB)에 저장합니다.
  • API 요청 시 인증: 클라이언트는 액세스 토큰을 포함하여 API 요청을 보냅니다. 서버는 액세스 토큰을 검증하여 유효하면 요청을 처리합니다.
  • 리프레시 토큰을 이용한 액세스 토큰 갱신: 액세스 토큰이 만료되면, 클라이언트는 저장된 리프레시 토큰을 서버로 보내 새로운 액세스 토큰을 발급받습니다.
  • 로그아웃: 사용자가 로그아웃하면 서버는 해당 리프레시 토큰을 DB에서 삭제합니다. 이를 통해 해당 리프레시 토큰은 더 이상 유효하지 않게 되며, 블랙리스트 처리됩니다.

3. Redis를 활용한 리프레시 토큰 관리

Redis는 빠른 속도간단한 데이터 구조 덕분에 토큰 저장 및 관리에 매우 적합합니다.

특히 리프레시 토큰의 만료 시간 관리블랙리스트 처리에 매우 유용합니다.

Redis 사용 이유

  • 속도: Redis는 메모리 기반 저장소로 매우 빠르게 데이터를 조회하고 처리할 수 있습니다.
  • 만료 시간 관리: Redis의 TTL(Time-To-Live) 기능을 사용하여 리프레시 토큰이 자동으로 만료되도록 설정할 수 있습니다.
  • 블랙리스트 처리: Redis에 리프레시 토큰을 블랙리스트로 추가하고, 사용이 끝난 후 해당 토큰을 삭제할 수 있습니다.

Redis와 블랙리스트 관리

Redis를 사용하여 리프레시 토큰을 블랙리스트에 추가하고 관리하는 방법입니다.

  1. 로그인 시: 리프레시 토큰을 Redis에 저장.
  2. 로그아웃 시: 리프레시 토큰을 Redis에서 삭제하거나 블랙리스트로 등록.
  3. 리프레시 토큰 검증 시: Redis에서 해당 토큰이 블랙리스트에 있는지 확인.