Tinyauth

클라이언트 보안

Tinyauth의 세션 시크릿, 해시 시크릿, JWT 토큰 수명 및 키 순환 구성하기

tinyauth는 OAuth2/OIDC 클라이언트에게 JWT 기반의 액세스 토큰과 리프레시 토큰을 발급해요. 액세스 토큰은 API 요청 인증에 사용되며 짧은 수명을 가지고, 리프레시 토큰은 새로운 액세스 토큰을 발급받기 위해 사용되며 상대적으로 긴 수명을 가져요. 설정 예시는 다음과 같아요.

# config.yaml
security:
  session_secret: ${SESSION_SECRET}
  hash_secret: ${HASH_SECRET}

tokens:
  access_token_ttl: ${ACCESS_TOKEN_TTL:-3600}
  refresh_token_ttl: ${REFRESH_TOKEN_TTL:-2592000}
  key_rotation:
    enabled: ${JWT_KEY_ROTATION_ENABLED:-true}
    interval_days: ${JWT_KEY_ROTATION_DAYS:-30}
    overlap_days: ${JWT_KEY_OVERLAP_DAYS:-7}
  • security.session_secret: 세션 쿠키를 서명하는 데 사용하는 비밀 키예요. 프로덕션 환경에서는 반드시 고유하고 무작위인 값을 생성해야 해요. 이 값을 변경하면 기존의 모든 세션이 무효화돼요.
  • security.hash_secret: 비밀번호, 클라이언트 시크릿, 일회성 토큰 해싱에 사용하는 base64url 32바이트 루트 시크릿이에요.
  • tokens.access_token_ttl: JWT 액세스 토큰의 수명(초 단위)이에요. 기본값은 3600(1시간)이에요. 권장 범위는 9003600(15분1시간)이에요.
  • tokens.refresh_token_ttl: JWT 리프레시 토큰의 수명(초 단위)이에요. 기본값은 2592000(30일)이에요. 권장 범위는 6048002592000(730일)이에요.
  • tokens.key_rotation.enabled: JWT 서명 키 자동 순환을 활성화할지 여부예요. 기본값은 true예요.
  • tokens.key_rotation.interval_days: 키 순환 주기(일 단위)예요. 기본값은 30일이에요. 이 주기마다 새로운 서명 키가 활성화돼요.
  • tokens.key_rotation.overlap_days: 이전 키를 유효하게 유지하는 기간(일 단위)이에요. 기본값은 7일이에요. 키 교체 직후에도 이전 키로 서명된 토큰을 검증할 수 있도록 하는 유예 기간이에요.
Note

security.session_secretopenssl rand -hex 32 명령어로 생성할 수 있어요. security.hash_secretopenssl rand -base64 32 | tr '+/' '-_' | tr -d '=' 명령어로 생성할 수 있어요.


토큰 수명

토큰 수명을 짧게 설정하면 보안이 강화되지만 클라이언트가 더 자주 토큰을 갱신해야 하고, 길게 설정하면 편의성은 높아지지만 토큰 탈취 시 위험 노출 시간이 길어져요. 서비스의 보안 요구 수준에 맞게 적절히 조절하세요.

# config.yaml
tokens:
  access_token_ttl: 1800
  refresh_token_ttl: 604800

위 설정은 액세스 토큰을 30분, 리프레시 토큰을 7일로 설정하는 예시예요. 보안이 중요한 서비스라면 이처럼 짧은 수명을 사용하는 것이 좋아요.


JWT 키 순환

tinyauth는 RS256 비대칭 키로 JWT에 서명해요. 보안을 강화하기 위해 서명 키를 주기적으로 교체(순환)하는 기능을 제공하며, 기본적으로 활성화되어 있어요.

# config.yaml
tokens:
  key_rotation:
    enabled: true
    interval_days: 30
    overlap_days: 7

키 순환이 활성화되면, tokens.key_rotation.interval_days마다 새로운 서명 키가 생성되고 활성화돼요. 이전 키는 tokens.key_rotation.overlap_days 동안 유효하게 유지되어, 키 전환 기간 동안에도 기존 토큰을 정상적으로 검증할 수 있어요.

Note

키 순환은 nextactivepreviousretired 수명 주기를 따라요. 활성 키와 이전 키 모두 /.well-known/jwks.json 엔드포인트를 통해 공개되므로, 클라이언트는 키 전환 기간 동안에도 토큰을 정상적으로 검증할 수 있어요.


프록시 설정

리버스 프록시(nginx, Caddy 등) 뒤에서 tinyauth를 운영하는 경우, 클라이언트의 실제 IP 주소와 프로토콜을 올바르게 식별하기 위해 trust_proxy를 설정해야 해요.

# config.yaml
server:
  trust_proxy: true
  • server.trust_proxy: 리버스 프록시 헤더를 신뢰할지 여부를 설정해요. 기본값은 false예요.
    • true: 모든 프록시 헤더를 신뢰해요. 완전히 신뢰할 수 있는 네트워크에서만 사용하세요.
    • false: 프록시 헤더를 신뢰하지 않아요.
    • '127.0.0.1': 지정된 IP 주소의 프록시만 신뢰해요.
    • 1 또는 2: 지정된 홉 수만큼의 프록시를 신뢰해요.
Caution

server.trust_proxy를 올바르게 구성하지 않으면 IP 스푸핑 취약점이 발생할 수 있어요. 프로덕션 환경에서는 true 대신 구체적인 프록시 IP 주소나 홉 수를 지정하는 것을 권장해요.