보안

최종 업데이트: 2026년 4월

비밀번호 저장

비밀번호는 bcrypt(cost factor 12)로 해싱하여 저장합니다. 원문 비밀번호는 서버 메모리에도 보관하지 않으며, 해싱 후 즉시 폐기합니다. 회원가입 시 Have I Been Pwned API를 통해 유출된 비밀번호인지 확인하고, 유출 이력이 있는 비밀번호는 사용을 차단합니다.

토큰 및 세션

인증 토큰은 HS256 알고리즘으로 서명된 JWT를 사용합니다. 프로덕션 환경에서는 32자 이상의 JWT 시크릿이 요구되며, 미달 시 서버가 시작되지 않습니다.

리프레시 토큰은 bcrypt(cost factor 10)로 해싱하여 서버에 저장합니다. 리프레시 토큰은 사용할 때마다 새로운 토큰으로 교체(rotation)됩니다. 액세스 토큰과 리프레시 토큰의 TTL은 프로젝트 설정에서 조정할 수 있습니다.

세션은 서버 측에서 관리하며, IP 주소, User Agent, 마지막 활동 시간을 기록합니다. 사용자는 대시보드에서 활성 세션을 확인하고 개별 또는 전체 세션을 해지할 수 있습니다.

다단계 인증 (MFA)

TOTP 기반 다단계 인증을 지원합니다. TOTP 시크릿은 AES로 암호화하여 저장합니다. 백업 코드는 10개가 발급되며, HMAC-SHA256으로 해싱하여 저장합니다. 백업 코드 검증 시 타이밍 공격을 방지하기 위해 상수 시간 비교(constant-time comparison)를 사용합니다.

OAuth 및 소셜 로그인

OAuth state 파라미터는 crypto.randomBytes(32)로 생성하여 CSRF 공격을 방지합니다. 20개의 OAuth 프로바이더를 지원하며, 각 프로바이더의 콜백 URL은 프로젝트별로 제한됩니다.

Passkeys (WebAuthn)

FIDO2/WebAuthn 표준을 기반으로 패스키 인증을 지원합니다. 서버 측 검증에 SimpleWebAuthn 라이브러리를 사용합니다.

네트워크 보안

모든 통신은 TLS를 통해 암호화됩니다. HSTS(HTTP Strict Transport Security)가 1년 max-age로 적용되어 있습니다.

CORS는 프로젝트에 등록된 도메인만 허용하는 동적 화이트리스트 방식으로 운영합니다. 와일드카드(*) 허용은 사용하지 않습니다.

API 서버는 Helmet 미들웨어를 통해 Content-Security-Policy, X-Frame-Options (DENY), X-Content-Type-Options (nosniff) 등의 보안 헤더를 설정합니다.

무차별 대입 방지

로그인 실패 시 시도 횟수를 기록합니다. 기본 설정은 5회 실패 시 300초(5분) 동안 계정이 잠기며, 이 값은 프로젝트 보안 설정에서 변경할 수 있습니다. 로그인 성공 시 실패 카운터가 초기화됩니다.

Cloudflare Turnstile CAPTCHA를 프로젝트별로 활성화할 수 있으며, 활성화 시 회원가입과 로그인에 봇 방지 챌린지가 적용됩니다.

입력 검증

모든 API 입력은 class-validator를 사용하여 검증합니다. 허용되지 않은 필드는 자동으로 제거(whitelist)되며, 등록되지 않은 필드가 포함된 요청은 거부(forbidNonWhitelisted)됩니다. 비밀번호는 최소 8자 이상이 요구됩니다. 데이터베이스 쿼리는 TypeORM의 파라미터화된 쿼리를 사용하여 SQL 인젝션을 방지합니다.

Webhook 보안

각 웹훅 엔드포인트에는 고유한 서명 시크릿이 자동 생성됩니다. 웹훅 페이로드는 HMAC-SHA256으로 서명되며, 타임스탬프와 함께 X-Authon-Signature 헤더로 전달됩니다. 전송 실패 시 최대 3회 자동 재시도합니다.

취약점 보고

보안 취약점을 발견하셨다면 security@authon.dev로 알려주세요. 공개적으로 이슈를 등록하지 말고 이메일로 직접 보내주시기 바랍니다.

Authon — 범용 인증 플랫폼