DevToolPal
한국어

TOTP / HOTP 코드 생성기

Base32 시크릿이나 otpauth:// URI로 2단계 인증 코드(TOTP, HOTP)를 생성합니다. SHA-1/256/512, 6–8자리, 실시간 카운트다운을 지원합니다.

로컬에서 실행, 업로드 없음

옵션

종류
자릿수
시간 간격

시크릿(Base32) 또는 otpauth:// URI

코드

결과가 여기에 표시됩니다

기능 소개

Google Authenticator, Microsoft Authenticator, 1Password 같은 2단계 인증 앱은 30초마다 바뀌는 6자리 코드를 보여 줍니다. 각 코드는 공유 시크릿으로 계산하는 일회용 비밀번호로, TOTP(RFC 6238)는 시간을, HOTP(RFC 4226)는 카운터를 사용합니다. 이 도구는 시크릿으로 같은 코드를 계산하므로 2FA 설정을 테스트하거나 서버 구현을 디버깅하거나 특정 시점의 올바른 코드를 확인할 때 쓸 수 있습니다.

현재 코드와 실시간 카운트다운, 그리고 서버가 작은 시계 오차를 감안해 흔히 허용하는 이전·다음 코드도 함께 표시합니다.

사용 방법

  1. Base32 시크릿(A–Z와 2–7, 공백과 대소문자는 무시)을 붙여 넣거나 QR 코드의 otpauth:// URI 전체를 붙여 넣습니다. 예시를 눌러 바로 써 볼 수 있습니다.
  2. TOTP 또는 HOTP를 고르고 알고리즘, 자릿수, 시간 간격을 계정에 맞춥니다. otpauth URI 안의 설정이 우선합니다.
  3. HOTP는 카운터를 입력하고 카운터 +1로 코드를 하나씩 확인합니다.
  4. 현재 코드를 복사합니다. 카운트다운이 남은 유효 시간을 보여 줍니다.

예시

데모 시크릿 JBSWY3DPEHPK3PXP는 바이트 “Hello!”와 0xDEADBEEF를 Base32로 표현한 것입니다. 아래 URI(QR 코드에 담긴 내용)는 이 시크릿을 기본 설정으로 쓰는 계정을 나타냅니다.

otpauth://totp/Example:alice@example.com?secret=JBSWY3DPEHPK3PXP&issuer=Example&algorithm=SHA1&digits=6&period=30

Unix 시간 1700000000에서 이 시크릿의 코드는 324 550이며 현재 시간 창은 10초 남아 있습니다.

코드 계산 방식

먼저 Base32 시크릿을 바이트로 디코딩합니다. TOTP의 카운터는 초 단위 Unix 시간을 시간 간격으로 나눈 뒤 내림한 값입니다. 카운터를 8바이트로 쓰고 시크릿으로 HMAC 서명합니다. 동적 절단은 HMAC 출력의 마지막 4비트를 기준으로 4바이트를 고르고, 필요한 자릿수로 나머지를 구하되 앞자리 0은 유지합니다.

자주 묻는 질문

› 계산된 코드가 인증 앱의 코드와 다른 이유는 무엇인가요?

TOTP는 시계에 의존하므로 먼저 기기 시간이 자동으로 설정되어 있는지 확인하세요. 그다음 알고리즘, 자릿수, 시간 간격이 계정과 같은지 확인합니다. 대부분의 서비스는 SHA-1, 6자리, 30초를 쓰며, QR 코드에 명시되지 않으면 인증 앱은 다른 설정을 무시합니다.

› TOTP와 HOTP는 어떻게 다른가요?

TOTP(RFC 6238)는 현재 시간을 시간 간격으로 나눈 값을 카운터로 쓰므로 코드가 30초마다 바뀝니다. HOTP(RFC 4226)는 코드를 쓸 때마다 1씩 늘어나는 카운터를 씁니다. 둘 다 시크릿과 카운터를 HMAC에 넣고 마지막 6~8자리 숫자를 취합니다.

› 시크릿이 저장되거나 전송되나요?

아니요. 코드는 Web Crypto API로 브라우저 안에서 계산됩니다. 시크릿은 저장되지 않고 주소창이나 공유 링크에도 들어가지 않으며, 공유 링크에는 설정만 담깁니다. 다만 2FA 시크릿은 두 번째 인증 수단 그 자체이므로 본인 소유의 시크릿만 붙여 넣으세요.

› 내 앱에 2단계 인증을 도입할 때 쓸 수 있나요?

네. "무작위 시크릿"으로 160비트 Base32 시크릿을 만들어 otpauth:// URI나 QR 코드로 사용자에게 제공하고, 서버가 계산한 코드를 여기 표시된 코드와 비교하세요. 서버는 보통 시계 오차를 감안해 이전 코드와 다음 코드도 허용합니다.