> totp | authenticator | generator <
Base32 시크릿에서 시간 기반(TOTP) 및 카운터 기반(HOTP) 일회용 비밀번호를 생성합니다. 2FA 설정을 테스트하고, 인증 앱과의 코드 불일치를 진단하고, otpauth:// URI를 만드세요. 모두 브라우저에서 로컬로 처리됩니다.
시크릿은 브라우저 밖으로 나가지 않습니다. 그래도 공용 컴퓨터에는 실제 운영 시크릿을 붙여 넣지 마세요.
OTPAUTH URI
인증 앱용 QR 코드가 필요하신가요? URI를 다음 도구에 붙여 넣으세요: QR 코드 생성기
카운트다운이 있는 실시간 코드
Base32 시크릿을 붙여 넣으면 현재 코드와 다음 코드를 매 주기마다 갱신하여 보여 주고, 만료까지 남은 시간을 진행 막대로 표시합니다.
SHA-1, SHA-256, SHA-512
6·7·8자리와 원하는 주기를 선택할 수 있습니다. HMAC은 Web Crypto API로 계산하며 RFC 4226·RFC 6238 테스트 벡터와 일치합니다.
otpauth URI 생성기 및 가져오기
인증 앱용 otpauth:// URI를 만들거나 기존 URI를 가져와 모든 필드를 자동으로 채웁니다. 어떤 데이터도 업로드되지 않습니다.
>> 기술 정보
일회용 비밀번호의 작동 원리:
HOTP(RFC 4226)는 HMAC(시크릿, 카운터)를 계산해 결과를 6~8자리로 잘라 냅니다. TOTP(RFC 6238)는 카운터를 Unix 시간÷주기(보통 30초)로 사용하는 HOTP이므로, 주기마다 코드가 바뀌고 양쪽이 통신 없이도 같은 코드를 얻습니다. 공유 시크릿은 보통 Base32 텍스트 또는 otpauth:// URI가 담긴 QR 코드로 전달됩니다.
예시:
RFC 6238 test vector (SHA-1) secret = GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ time = 59 -> counter = 59 / 30 = 1 code (8 digits) = 94287082
TOTP 생성기를 사용하는 이유:
- >로그인 기능을 개발하면서 2단계 인증을 테스트하고 디버깅
- >인증 앱과 서버의 코드가 다른 원인 파악
- >올바른 발급자, 알고리즘, 자릿수, 주기로 otpauth:// URI 생성
- >Unix 시간 입력란으로 고정된 시각의 코드 검증
>> 자주 묻는 질문
Q: TOTP는 어떻게 작동하나요?
A: 앱과 서버가 시크릿을 공유합니다. 양쪽 모두 시크릿과 현재 시간 단계(Unix 시간÷주기, 기본 30초)로 HMAC을 계산해 6자리 코드로 잘라 냅니다. 두 시계가 맞으면 같은 코드가 나옵니다.
Q: 여기에 시크릿을 입력해도 안전한가요?
A: 계산은 Web Crypto API를 사용해 전적으로 브라우저에서 이루어지며 서버로 아무것도 전송되지 않습니다. 하지만 TOTP 시크릿은 계정의 열쇠입니다. 공용이거나 신뢰할 수 없는 컴퓨터에는 실제 운영 시크릿을 붙여 넣지 말고, 디버깅에는 테스트 계정을 사용하세요.
Q: 코드가 인증 앱과 다른 이유는 무엇인가요?
A: 가장 흔한 원인은 시계 오차(TOTP는 몇 초 이내의 정확한 시간이 필요), 알고리즘·자릿수·주기 불일치, 시크릿 오타입니다. 대부분의 서비스가 쓰는 SHA-1, 6자리, 30초가 선택되어 있는지 확인하세요.
Q: TOTP와 HOTP의 차이는 무엇인가요?
A: HOTP는 코드를 사용할 때만 증가하는 카운터를 쓰므로 코드는 사용될 때까지 유효합니다. TOTP는 시계에서 카운터를 얻기 때문에 주기마다 자동으로 만료됩니다. 일반 사용자 2FA에서는 TOTP가 훨씬 널리 쓰입니다.
Q: otpauth:// URI란 무엇인가요?
A: 2FA를 켤 때 스캔하는 QR 코드 안의 텍스트로, 예를 들어 otpauth://totp/Example:user@example.com?secret=...&issuer=Example 형식입니다. 시크릿, 발급자, 계정과 선택적으로 알고리즘·자릿수·주기를 담고 있습니다. 가져오기 칸에 붙여 넣으면 시크릿을 추출합니다.
Q: 인증 앱은 어떤 설정을 지원하나요?
A: Google Authenticator를 비롯한 많은 앱은 알고리즘, 자릿수, 주기 매개변수를 무시하고 항상 SHA-1, 6자리, 30초를 사용합니다. 앱과 서버가 다른 설정을 지원한다는 것을 알지 못한다면 이 기본값을 사용하세요.