[JWT] JWT

hahhhm·2024년 8월 17일

JWT&BFF

목록 보기
1/4

JWT?

JWT는 로그인된 사용자인지를 확인하는 "디지털 신분증" 같은 것

💬 왜 JWT가 필요할까?

  • 보통 웹사이트에 로그인하면, 서버는 "이 사용자가 진짜인지" 알아야 함
  • 따라서 매 요청마다 "누군지" 인증해야 함.
  • 예전 방식은 서버가 사용자 정보를 세션에 저장했지만, 요즘은 "토큰 기반 인증", 그 중에서도 JWT를 많이 씀

JWT 구조

JWT는 3개의 부분으로 된 문자열임

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJ1c2VySWQiOjEyMywibmFtZSI6Iu2VnOq1rOqzteybkA==.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
구분설명
Header토큰의 타입과 암호화 알고리즘 정보
Payload사용자 정보, 만료시간 등 (암호화 X)
Signature위 두 개를 비밀키로 서명한 값

어떻게 사용되나?

  1. 사용자가 로그인
  2. 서버가 JWT 생성해서 브라우저에 전달
  3. 브라우저는 JWT를 로컬스토리지나 쿠키에 저장
  4. 다음 요청마다 JWT를 HTTP 요청에 담아 전송
  5. 서버는 JWT를 확인하고 → 누군지 확인 후 응답

장점

  • 서버가 세션을 안 가지고도 인증 가능 (무상태)
  • 분산 서버에서도 잘 작동함
  • 빠름! (데이터가 토큰 안에 있음)

주의할 점

  • 토큰이 탈취되면 위험 → HTTPS 사용 필수
  • 일반적으로 Refresh Token도 함께 사용해서 보안 강화

Access Token과 Refresh Token이란?

JWT 기반 인증 시스템에서 사용하는 두 개의 토큰


기본 개념

  • JWT는 JSON Web Token의 줄임말
  • 서버가 로그인 인증 성공 시 두 개의 토큰을 발급함:
    • Access Token: 사용자의 인증 정보가 담긴 토큰으로 API 요청 시 사용
    • Refresh Token: Access Token이 만료되었을 때, 새로운 Access Token을 발급받기 위한 토큰

Access Token vs Refresh Token

항목Access TokenRefresh Token
목적API 요청 시 인증Access Token 재발급용
담고 있는 정보사용자 정보 (ex. userId, role 등)거의 없음 or 최소 정보 (보안 강화)
저장 위치메모리, 쿠키, 로컬스토리지 등주로 httpOnly 쿠키
만료 시간짧음 (수 분 ~ 수 시간)김 (며칠 ~ 몇 달)
탈취 시 위험성중간 (기간 짧고 사용 제한)높음 (새 Access Token 발급 가능)
서버에 저장 여부❌ 무상태 방식 (Stateless)✅ 저장 가능 (보안 위해 저장하는 경우도 있음)

왜 두 개를 쓰는가?

  1. Access Token을 짧게 유지하면, 탈취 시 피해를 최소화할 수 있음
  2. 대신 Refresh Token으로 자동 재발급하면 사용자 경험은 끊기지 않음
✔ 보안성 확보 (Access Token은 짧게)
✔ 사용자 편의성 유지 (Refresh로 재로그인 없이 연장)

Stateless란?

  • JWT 인증은 Stateless (무상태) 방식임
  • 서버가 사용자 상태(세션)를 기억하지 않음
  • 클라이언트가 매 요청마다 JWT를 함께 보내며 인증을 증명함

장점:

  • 서버 확장 용이 (여러 대의 서버로 분산 가능)
  • 세션 저장소 없이도 인증 유지 가능

단점:

  • 매 요청마다 JWT를 보내야 함 → 요청 크기 증가
  • 탈취 위험 대비한 보안 조치 필요

인증(Authentication) vs 인가(Authorization)

개념설명
인증(Authentication)등록된 사용자인지 확인
인가(Authorization)해당 기능을 사용할 권한이 있는지 확인

예: 로그인은 인증 / 관리자 페이지 접근 권한 확인은 인가


서버 세션 방식 vs 토큰 방식

서버(세션) 기반 인증 (Stateful)

  • 서버가 세션을 저장해두고 사용자 상태를 기억함
  • 클라이언트는 세션 ID만 보내면 됨
  • 단점: 서버가 상태를 들고 있어야 함 → 확장성 낮음, CORS 문제 등

토큰(JWT) 기반 인증 (Stateless)

  • 서버가 토큰을 발급하면, 클라이언트는 그 토큰을 저장 후 계속 사용
  • 상태를 기억하지 않음 → 서버 확장에 유리

실제 인증 흐름 예시 (Access + Refresh Token)

  1. 로그인 성공 → 서버가 Access Token + Refresh Token 발급
  2. 클라이언트는 Access Token으로 API 요청 (인가: Authentication)
  3. Access Token 만료 시, 서버는 401 Unauthorized 응답
  4. 클라이언트는 Refresh Token으로 새로운 Access Token 요청
  5. 서버가 Refresh Token 검증 → Access Token 재발급
  6. Refresh Token도 만료됐다면 → 사용자에게 재로그인 요청

보안 고려사항

항목설명
토큰 저장 위치Access는 메모리 or 쿠키, Refresh는 httpOnly 쿠키 추천
탈취 방지HTTPS 필수, 토큰 재사용 방지, 서버 측 검증 로직 구현 등
서버 측 Refresh 관리보안을 강화하려면 Refresh Token을 DB에 저장하여 관리할 수 있음

마무리 요약

  • JWT는 Stateless 인증 방식으로 토큰만으로 사용자 인증을 처리함
  • 보안성과 사용자 편의성을 위해 Access + Refresh Token 구조를 사용함
  • 토큰은 탈취 위험이 존재하므로 짧은 유효시간 + 자동 갱신 구조가 일반적임
  • Refresh Token은 절대 노출되면 안 됨 → httpOnly 쿠키에 저장 + 주기적 갱신 필요

출처 & 참고자료

0개의 댓글