2FA TOTP 코드 주기·허용창 계산기 사용 안내
계산 과정
기본 입력값으로 계산하면 현재 표시 코드가 바뀌기까지 남은 시간은(는) 18 초입니다. 항목별 내역은 위 표에서 확인할 수 있습니다.
결과가 실제와 달라지는 경우
- 휴대전화와 서버 시계가 45초 어긋나면 30초 주기에서 한 구간 이상 차이가 날 수 있습니다. 화면 타이머가 18초 남았다고 보여도 서버가 다른 카운터를 검사하면 새 코드가 거부되거나 이전 코드가 받아들여질 수 있습니다.
- 일부 서버는 과거 1칸만 허용하고 미래 구간은 허용하지 않습니다. 이 도구는 입력한 칸 수를 과거와 미래에 똑같이 적용하므로 비대칭 정책에서는 인정 구간 수를 직접 합산한 별도 검토가 필요합니다.
- 동일 코드를 한 번 성공한 뒤 재사용하지 못하게 막거나 계정당 5회 실패 시 잠그면 단순 확률을 반복 횟수와 자유롭게 곱할 수 없습니다. 상태 저장과 시도 제한은 이 계산에 포함되지 않습니다.
- HOTP는 시간 대신 이벤트 카운터가 증가하므로 30초 잔여 시간이라는 개념이 없습니다. 푸시 승인, SMS 코드, 이메일 링크도 만료 규칙이 별도이므로 TOTP 설정에만 이 결과를 사용하세요.
- 표준 숫자 코드가 아닌 영문 포함 코드나 서버가 일부 접두어를 고정하는 구현은 10의 자릿수 제곱 공간과 다릅니다. 8자리처럼 보이더라도 마지막 2자리가 체크값이면 독립 후보는 10⁸개가 아닙니다.
알아두면 좋은 기준
- 30초 주기에서 현재 구간 경과가 12초이면 화면 코드가 바뀌기까지 18초 남습니다. 경과값 42초도 30으로 나눈 나머지 12초를 사용하므로 같은 결과가 나옵니다.
- 인접 구간을 양쪽 1칸 허용하면 과거·현재·미래 총 3개의 시간 카운터를 검사합니다. 6자리 숫자라면 서로 다른 코드라는 단순 가정에서 무작위 1회 통과 상한은 3/1,000,000입니다.
- 허용창을 넓히면 시계 오차로 인한 사용자 실패는 줄지만 동시에 인정하는 후보가 늘어납니다. 30초 주기에서 양쪽 2칸은 5구간, 전체 폭 150초에 해당합니다.
- TOTP seed가 탈취되면 공격자는 시간마다 올바른 코드를 만들 수 있어 6자리 공간의 무작위 확률이 의미 없어집니다. seed 저장 암호화, 피싱 저항 인증수단, 복구 코드 보호를 별도로 운영해야 합니다.
자주 묻는 질문
코드가 1초 남았을 때 입력하면 바로 실패하나요?
클라이언트 전송 지연과 서버 시계가 다음 구간으로 넘어가도 서버가 과거 1칸을 허용하면 성공할 수 있습니다. 하지만 인접 허용이 0칸이거나 시계 오차가 크면 실패할 수 있으므로 새 코드가 뜬 뒤 입력하는 편이 안정적입니다.
양쪽 1칸이면 코드 유효시간이 정확히 90초인가요?
서버가 세 시간 구간을 검사한다는 의미에서 폭은 90초입니다. 특정 코드 문자열은 다른 구간에서 우연히 반복될 수 있고 재사용 차단 정책도 있으므로 한 코드가 언제나 연속 90초 동안 승인된다고 단정할 수는 없습니다.
6자리에서 8자리로 바꾸면 무작위 확률은 얼마나 줄어드나요?
동일 허용 구간 수라면 공간이 100만 개에서 1억 개로 100배 늘어 한 번의 무작위 통과 확률은 100분의 1이 됩니다. 다만 속도 제한과 seed 보호가 없다면 자릿수만으로 충분하지 않습니다.