ZeroBase/CS

토큰 기반 로그인 방식

Red_Horse 2025. 7. 26. 18:01

개요

  • 사용자가 로그인하면 서버는 JWT 토큰을 생성하여 클라이언트에 전달합니다.
  • 사용자는 이후 요청 시, Authorization 헤더 또는 Cookie에 access 토큰을 담아 인증을 수행합니다.
  • 일반적으로 access tokenrefresh token을 함께 사용하여 보안성과 사용자 경험을 모두 확보합니다.

JWT (Json Web Token)

JWT는 사용자 인증 및 권한 부여에 사용되는 토큰 포맷으로, 다음의 3부분으로 구성됩니다

 

1. Header (헤더)

  • 토큰의 유형(JWT)과 서명에 사용된 알고리즘(HS256, RS256 등)을 명시
  • Base64URL로 인코딩됨
{
  "alg": "HS256",
  "typ": "JWT"
}
 

2. Payload (페이로드)

  • 사용자 정보, 토큰 발급자(iss), 만료 시간(exp) 등의 클레임(Claim) 을 담고 있음
  • 인증/인가에 필요한 실제 데이터가 위치
  • Base64URL로 인코딩됨
{
  "sub": "user123",
  "name": "John Doe",
  "iat": 1516239022,
  "exp": 1516242622
}
 

3. Signature (서명)

  • Base64UrlEncode(header) + "." + Base64UrlEncode(payload) 의 결과에 서버의 비밀키(secret key) 를 이용해 서명 생성
  • 해당 서명으로 토큰의 무결성신뢰성을 검증 가능

장점

  • Stateless: 서버가 세션을 유지하지 않아도 됨 → 인증 저장소 불필요
  • 경량화: XML 기반의 SAML에 비해 훨씬 가볍고 빠름
  • 호환성: JSON 기반 → 다양한 언어에서 직렬화/역직렬화가 쉬움
  • Self-contained: 토큰 하나로 사용자 인증 및 권한 정보를 모두 담고 있음

단점

  • 정보 노출 위험: 토큰이 탈취되면 내부의 Payload는 누구나 디코딩할 수 있음 (암호화되지 않음)
  • 비대화 문제: 토큰에 너무 많은 정보를 담을 경우, HTTP 헤더가 커져 서버에 부담
  • 갱신 불가: JWT 자체는 수정할 수 없으며 만료 전까지는 유효함 → 토큰 폐기 어려움