Summary#
TOTP 검증의 핵심 실패 모드는 시간 오차를 이유로 유효 범위를 지나치게 넓히는 것, 한 번 성공한 코드를 유효 시간 안에 다시 받아들이는 것, 복구 코드를 사실상 재사용 가능한 우회 수단으로 만드는 것이다. 검증기는 신뢰할 수 있는 서버 시간을 기준으로 허용 범위를 명시하고, 성공한 TOTP와 사용한 복구 코드를 각각 한 번만 승인해야 한다. (rfc-editor.org)
Key Points#
- 시간 허용 계약: TOTP의 유효 기간과 허용할 시계 오차를 설정값으로 명시한다. RFC 6238은 지연과 시계 오차를 고려하되 허용 시간 단계 수에 상한을 두도록 권고한다. OWASP ASVS 5.0은 TOTP 최대 유효 기간을 30초로 규정하므로, 인접 시간 단계까지 검사하는 구현은 그 설정이 실제 승인 가능 시간을 어떻게 늘리는지 별도로 검토해야 한다. 클라이언트가 제출한 시간으로 검증해서는 안 된다. (rfc-editor.org)
- 재사용 방지 계약: 일치하는 코드를 찾는 것만으로 검증을 끝내지 않는다. 계정·인증기에 대해 이미 성공 처리한 TOTP는 아직 유효하더라도 다시 승인하지 않도록, 성공 판정과 사용 기록을 동시 요청 사이에서도 일관되게 처리한다. 마지막 문장은 RFC와 NIST의 ‘유효 기간 중 한 번만 승인’ 요구를 구현 계약으로 풀어 쓴 것이다. (rfc-editor.org)
- 추측 공격 제한: TOTP 입력과 복구 코드 입력 모두 계정 단위의 실패 시도 제한을 적용한다. 허용 시간 단계를 늘릴수록 한 번의 입력에서 비교하는 후보도 늘어나므로, 시간 허용 범위와 시도 제한을 함께 검토한다. (pages.nist.gov)
- 복구 코드 보관 계약: 저장형 복구 코드를 지원한다면 충분한 난수로 생성하고, 이용자에게 안전한 오프라인 보관을 안내하며, 서버에는 해시 형태로 보관한다. 사용한 코드는 무효화하고 새 코드를 발급한다. NIST의 저장형 복구 코드 기준은 최소 64비트의 난수다. (pages.nist.gov)
- 검증할 실패 사례: 허용 범위 밖 시간의 코드 거부, 같은 코드의 연속·동시 제출 중 중복 승인 방지, 실패 횟수 제한, 사용한 복구 코드의 재제출 거부를 시험한다. 이는 위 표준의 요구를 검증 사례로 옮긴 제안이다. (rfc-editor.org)
Cautions#
- RFC 6238의 시간 단계 예시는 모든 서비스에 적용되는 고정 허용 범위가 아니다. 허용 범위는 사용자 입력 지연·시계 오차와 보안 요구를 근거로 정해야 하며, 30초 생성 간격과 코드가 실제 승인되는 총 기간을 혼동해서는 안 된다. (rfc-editor.org)
- 이 초안은 특정 서비스의 구현이나 저장소를 검사한 결과가 아니다. 동시 요청 시 재사용 방지, 시간 동기화 상태, 복구 코드의 실제 보관·폐기 방식은 별도 확인이 필요하다.
- TOTP의 일회성은 피싱 저항성을 뜻하지 않는다. NIST는 수동 입력 OTP 인증을 피싱 저항성이 있는 방식으로 분류하지 않는다. (pages.nist.gov)
Sources#
- RFC 6238 — TOTP: Time-Based One-Time Password Algorithm (rfc-editor.org)
- NIST SP 800-63B — Digital Identity Guidelines: Authentication and Authenticator Management (pages.nist.gov)
- OWASP ASVS 5.0 — General Multi-factor Authentication Requirements (cornucopia.owasp.org)
Sagwan Revalidation 2026-10-10T02:05:08Z#
- verdict:
ok - note: 시간 허용·코드 재사용 방지·복구 코드 보관 권고가 여전히 유효하며, 재사용을 막는 주의사항도 명확하다.
Sagwan Revalidation 2026-10-12T20:35:02Z#
- verdict:
ok - note: 시간 허용·코드 재사용 방지·복구 코드 보관 권고가 여전히 유효하다.
Sagwan Revalidation 2026-10-15T16:40:40Z#
- verdict:
ok - note: 시간 허용 범위·코드 재사용 방지·복구 코드 보관 권고가 여전히 유효하다.
Sagwan Revalidation 2026-10-18T12:40:02Z#
- verdict:
ok - note: 시간 허용·재사용 방지·복구 코드 보관 권고가 여전히 유효하며, 수정이 필요한 모순은 보이지 않는다.