Token ( JWT Token )

TopOfTheHead·2025년 11월 20일

Spring Security

목록 보기
13/21

토큰 ( token )
Client-side에서 인증정보를 보관하는 방법.
서버가 아닌, 인증정보를 client-side에 암호화하여 저장.

서버에서 토큰의 발급만 수행하고 저장 & 관리하지 않아서 부하가 적다.
세션방식에 반해 분산환경에서 유리

Session기반 인증방식은 클라이언트에서 서버에 특정 User에 대한 정보를 요청할때마다 일일이 세션ID의 일치여부를 확인.
▶ 매 요청마다 ServerDB를 확인하는것이 부담이되므로 Token 기반 인증방식이 등장.

HTTP Servcerstateless 특징으로 상대를 알 수 없다.
사용자는 매번 요청Authorization Header토큰을 포함하고, 서버는 전달된 토큰이 해당 서버에서 발급했는지 판단하기 위해 검증을 수행

JSON 토큰 ( JWT : Json Web Token ) :
에서 Authentication과 정보교환 등을 수행하기위해 사용하는 Token 기반 인증 방식

클라이언트가 로그인 후 서버클라이언트에게 발급하여 제공
▶ 이후 클라이언트에서 전송하는 HTTP Request마다 Authorization HeaderJWT를 포함하여 인증을 수행.

클라이언트Token을 보관하면서 Stateless 특징을 지니므로, Session이 필요없다.
▶ 또한 Session처럼 DB 조회없이 Token만으로 Authenticate가 가능.

JWTpayload에 사용자 정보를 보관 가능.

JWT TokenRequest Authorization HeaderBearer {token} 형식으로 저장


JWT 토큰 종류

  • Access Token
    。짧은 유효기간 5분

    Access Token만료시간이 짧은 경우 유출되더라도 피해를 최소화하여 보안성이 좋지만, 자주 로그인해야하는 불편함이 존재
    Access Token유효기간을 짧게 구축하되 만료Refresh Token를 기반으로 새로운 Access Token을 발급하는 방식으로 구현
    사용자Access Token이 만료되더라도 다시 로그인할 필요가 없다.

  • Refresh Token
    Access Token보다 긴 유효기간 ( 12시간 )
    ▶ 만료 시 로그인을 다시해야함

    서버에서 사용되어 Access Token만료된 경우 재발급하는 역할
    클라이언트( = 프론트엔드 )에서 직접 다룰 일이 없으므로 보통 HttpOnly 쿠키에 저장

JWT Token 구조

header.payload.signature로 연결되어 구분


。각 부분은 Base64인코딩
https://www.jwt.io/에서 해석가능

Header
typ( Token Type )과 alg( Signature Algorithm )로 구성
Base64인코딩되어 포함

{
  "typ": "JWT", // 토큰 타입
  "alg": "HS256" // 서명 알고리즘 (HMAC-SHA256)
}

Payload
JWTClaim을 포함하는 부분
Base64인코딩되어 포함

{
  "iss": "example.com",
  "sub": "user123",
  "aud": "myapp",
  "exp": 1716239022,
  "iat": 1716235422,
  "role": "admin" // private claim
}

iss : ( issuer ) : 발급자
sub : ( subject ): 사용자 ID
aud : ( audiance ) : 대상자
exp : ( expiration ) : 토큰만료시간
iat ( Issued at ) : 토큰발급시간

서명 : Signature
토큰유효성 검증 시 사용하는 고유한 서명
JWTHeader.Payload를 서명 후 Base64인코딩하여 포함

서명에 사용되는 Private Key는 보안을 위해 특정길이 이상을 사용하도록 강제
비대칭키 ( RS256 , ES256 ) 등은 최소 2048bit의 사용을 권장하므로 KeyPairGenerator에서 key 크기2048 bit으로 생성하도록 설정.


Signature 생성과정
1. Header , Payload를 각각 Base64인코딩

2. 인코딩된 두 문자열.으로 결합
인코딩된Header.인코딩된Payload

3. 지정된 알고리즘Key서명을 수행하여 서명 Byte값을 생성
ex ) RS256 : SHA256으로 private key를 활용하여 서명

4. 서명 후 생성된 byte값base64인코딩하여 Signature 생성
JWT = Header.Payload.SignatureSignature이 된다.

  • Signature 검증과정
    1. 클라이언트로 부터 수신한 JWT에서 Header, Payload , Signature 분리
    。해당 Header, Payload, Signature은 각각 Base64Url인코딩된 상태

    2. Header디코딩 후 얻은 JSON에서 서명 알고리즘 ( alg )에서 허용된 알고리즘인지 검증

    3. Signature디코딩 후 얻은 서명 Byte값서버발급자Public Key로 검증

    4. 검증payload의 신뢰여부를 결정
    。실패 시 토큰을 거부
profile
공부기록 블로그

0개의 댓글