본문으로 건너뛰기

토큰 관리 기술 명세

1. 토큰 구조​

Access Token​

interface AccessToken {
header: {
alg: 'RS256';
typ: 'JWT';
kid: string; // Key ID
};
payload: {
iss: string; // Issuer
sub: string; // Subject (User ID)
aud: string[]; // Audience
exp: number; // Expiration Time
iat: number; // Issued At
jti: string; // JWT ID
type: 'ACCESS'; // Token Type
sessionId: string; // Session ID
deviceId: string; // Device ID
};
signature: string; // RSA Signature
}

Refresh Token​

interface RefreshToken {
header: {
alg: 'RS256';
typ: 'JWT';
kid: string;
};
payload: {
iss: string;
sub: string;
exp: number;
iat: number;
jti: string;
type: 'REFRESH';
sessionId: string;
};
signature: string;
}

2. 토큰 생성 프로세스​

2.1 액세스 토큰 생성​

2.2 리프레시 토큰 생성​

  1. 세션 ID 생성 또는 기존 세션 조회
  2. 리프레시 토큰 페이로드 구성
  3. RSA 서명
  4. Redis에 토큰 정보 저장
  5. 클라이언트에 토큰 반환

3. 토큰 검증 프로세스​

3.1 검증 단계​

  1. JWT 형식 검증

  2. 서명 검증

    async function verifyToken(token: string): Promise<TokenPayload> {
    const decoded = jwt.decode(token, { complete: true });
    const key = await jwkService.getKey(decoded.header.kid);
    return jwt.verify(token, key.publicKey);
    }
  3. 클레임 검증

    • 만료 시간 확인
    • 발급자 확인
    • 토큰 타입 확인
    • 세션 ID 확인
  4. Redis 검증

    • 토큰 폐기 여부 확인
    • 세션 유효성 확인

4. 토큰 갱신 프로세스​

4.1 갱신 흐름​

4.2 갱신 정책​

  1. 리프레시 토큰 1회성 사용
  2. 이전 액세스 토큰 자동 폐기
  3. 새로운 토큰 ID 할당
  4. 세션 정보 업데이트

5. 토큰 저장 및 캐싱​

5.1 Redis 저장 구조​

interface TokenCache {
jti: string; // 토큰 ID
userId: string; // 사용자 ID
sessionId: string; // 세션 ID
deviceId: string; // 디바이스 ID
type: 'ACCESS' | 'REFRESH';
isRevoked: boolean; // 폐기 여부
expiresAt: number; // 만료 시간
}

5.2 캐싱 전략​

  1. 액세스 토큰: 짧은 TTL (15분)
  2. 리프레시 토큰: 긴 TTL (7일)
  3. 폐기된 토큰: 원본 만료 시간까지 유지

6. 보안 고려사항​

6.1 토큰 보안​

  1. 강력한 RSA 키 (2048비트 이상)
  2. 정기적인 키 로테이션 (24시간)
  3. 토큰 ID의 충분한 엔트로피
  4. 민감 정보 페이로드 제외

6.2 토큰 보안​

  1. 사용자당 하나의 활성 토큰 (단일 디바이스 로그인 정책)
  2. 비정상 패턴 감지 시 세션 종료
  3. 장기 미사용 세션 자동 종료
  4. 세션 데이터 암호화 저장

7. 모니터링 및 알림​

7.1 모니터링 지표​

  1. 토큰 발급 수 (초당)
  2. 토큰 검증 실패율
  3. 토큰 갱신 성공률
  4. Redis 응답 시간
  5. 키 로테이션 상태

7.2 알림 설정​

  1. 토큰 검증 실패율 > 5%
  2. Redis 응답 시간 > 100ms
  3. 키 로테이션 실패
  4. 비정상적인 토큰 발급 패턴

변경 이력​

버전날짜작성자설명
0.1.02025-03-15bok@weltcorp.com최초 작성
0.2.02025-03-16bok@weltcorp.com앱 토큰 관련 내용 추가
0.3.02025-03-21bok@weltcorp.com권한 관련 내용을 IAM 도메인으로 이전