코드를 보려면 유효한 비밀 키를 입력하세요.
서버와 같은 방식으로 코드를 확인합니다. 시계 오차를 허용하기 위해 현재 코드와 앞뒤 최대 2단계의 코드를 허용합니다.
작동 방식
TOTP(Time-based One-Time Password, RFC 6238)는 Google Authenticator, Microsoft Authenticator, Authy, 1Password의 6자리 코드 뒤에 있는 알고리즘입니다. 서비스와 휴대폰은 비밀 키를 공유하며, 30초마다 양쪽 모두 현재 시각을 단계로 나눈 값과 비밀 키로 HMAC을 계산하고, 이를 6자리로 잘라 결과를 비교합니다. 코드를 입력하기 전까지는 아무도 코드를 전송하지 않으므로 휴대폰이 오프라인이어도 작동합니다.
HOTP(RFC 4226)는 기반 알고리즘으로, 시각 대신 코드를 요청할 때마다 증가하는 카운터를 사용합니다. TOTP는 카운터를 1970년 이후 경과한 주기 수로 바꾼 HOTP입니다. 비밀 키는 Base32로 표기되며, 2단계 인증을 활성화할 때 QR 코드로 표시되는 otpauth:// URI에 담겨 전달됩니다.
이 도구는 브라우저의 암호학적 난수 생성기로 비밀 키를 생성하고, 현재·이전·다음 코드를 계산하고, URI와 QR 코드를 만들고, 기존 URI를 읽고, 서버와 같은 시계 오차 허용 범위로 코드를 검증합니다. 비밀 키는 브라우저 밖으로 나가지 않으며 공유 링크에도 포함되지 않습니다.
예시
GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ · SHA1 · 8 · T = 59 s94287082RFC 6238의 테스트 벡터입니다. 비밀 키는 ASCII 텍스트 12345678901234567890을 Base32로 인코딩한 것이며, Unix 에포크 후 59초 시점의 단계는 1이고 8자리 코드는 정확히 이 값이어야 합니다.GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ · SHA1 · 8 · T = 1111111109 s07081804RFC 6238의 또 다른 벡터로, 구현에서 앞자리 0이 사라지지 않는지 확인하는 데 유용합니다. 코드는 정수가 아니라 고정 자릿수의 숫자열입니다.HOTP · GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ · contador 0755224RFC 4226의 6자리 첫 번째 벡터입니다. 카운터가 1이 되면 코드는 287082가 됩니다.otpauth://totp/Ejemplo:ana%40example.com?secret=JBSWY3DPEHPK3PXP&issuer=EjemploTOTP · SHA1 · 6 · 30 sGoogle Authenticator가 정의하고 다른 앱들이 채택한 Key URI 형식입니다. algorithm, digits, period가 없으면 SHA1, 6, 30으로 간주하므로 대부분의 QR 코드에는 비밀 키와 발급자만 들어 있습니다.활용 사례
- 애플리케이션의 2FA 활성화 테스트: 비밀 키를 생성하고 휴대폰으로 QR 코드를 스캔한 뒤, 앱에 표시되는 코드와 같은 코드를 서버가 허용하는지 확인합니다.
- 서버가 유효한 코드를 거부하는 이유 디버깅: 이전 또는 다음 단계의 코드와 일치하는지 보면 시계 오차가 드러납니다.
- 자체 TOTP 또는 HOTP 구현을 RFC 6238 및 4226의 테스트 벡터로 검증.
- 다른 앱에서 내보낸 otpauth:// URI를 읽어 계정이 사용하는 알고리즘, 자릿수, 주기 확인.
- Base32 비밀 키를 이미 가지고 있는 테스트 계정을 두 번째 앱이나 비밀번호 관리자에 등록.
자주 묻는 질문
앱에서 유효하다고 표시되는 코드를 서버가 거부하는 이유는 무엇인가요?
대부분 시계 때문입니다. TOTP는 휴대폰과 서버의 시각이 일치해야 하며, 30초만 차이 나도 서로 다른 단계를 계산합니다. 그래서 서버는 양쪽으로 1~2단계를 허용합니다. 코드가 이전 또는 다음 단계와 일치한다면 서버 시각을 NTP로 동기화하고 휴대폰의 자동 시간 설정을 켜세요.
실제 계정의 비밀 키를 여기서 생성해도 안전한가요?
비밀 키는 crypto.getRandomValues로 생성되며 브라우저 밖으로 나가지 않습니다. 하지만 운영 환경에서는 코드를 검증할 서버가 직접 생성하고 저장해야 합니다. 이 도구는 테스트와 디버깅용입니다. 실제 비밀 키는 비밀번호처럼 다루세요. 비밀 키를 가진 사람은 누구나 영원히 당신의 코드를 생성할 수 있습니다.
SHA-256, 8자리 또는 60초를 사용하는 것이 좋을까요?
이론상으로는 더 강력하지만, Google Authenticator 일부 버전을 포함한 여러 앱이 이 매개변수를 무시하고 항상 30초마다 6자리 SHA-1로 계산하기 때문에 사용자는 서버가 거부하는 코드를 보게 됩니다. HMAC으로서의 SHA-1은 여전히 안전합니다. 호환성을 위해 대부분의 서비스는 기본값을 사용합니다.
비밀 키는 얼마나 길어야 하나요?
RFC 4226은 최소 128비트를 요구하고 160비트를 권장하며, 이는 Base32로 32자입니다. 많은 서비스가 80비트(16자)를 사용하며 앱도 이를 문제없이 허용합니다. 이 도구는 160비트를 생성합니다.
TOTP는 피싱을 막아 주나요?
완전히 막지는 못합니다. 가로채거나 SIM 스와핑으로 탈취할 수 있는 SMS보다 훨씬 낫지만, 가짜 사이트가 코드를 요구해 같은 30초 안에 진짜 사이트에서 사용할 수 있습니다. FIDO2 보안 키와 패스키는 도메인에 묶여 있어 이런 공격에 강합니다.
휴대폰을 잃어버리면 어떻게 되나요?
비밀 키 없이는 코드를 계산할 방법이 없습니다. 그래서 서비스는 2FA를 활성화할 때 복구 코드를 제공하니, 휴대폰이 아닌 곳에 보관하세요. 일부 앱은 계정을 암호화해 클라우드에 백업하거나 QR 코드로 내보내 다른 기기로 옮길 수 있습니다.