TOTP 생성기 사용법
위 입력창에 서비스의 2단계 인증 Base32 비밀키를 입력하면, 현재 시각 기준 OTP 코드가 큰 글씨로 표시되고 1초마다 자동 갱신됩니다. 기본값은 대부분의 서비스가 쓰는 6자리·30초이며, 필요에 따라 8자리나 60초 주기를 선택할 수 있습니다. 카운트다운 막대가 0에 가까워지면 곧 새 코드로 바뀌므로, 남은 시간이 충분할 때 "복사" 버튼으로 코드를 복사해 사용하세요.
TOTP란?
TOTP(Time-based One-Time Password, 시간 기반 일회용 비밀번호)는 비밀키와 현재 시각을 조합해 일정 주기(보통 30초)마다 바뀌는 인증 코드를 만드는 방식으로, RFC6238 표준으로 정의되어 있습니다. Google Authenticator, Microsoft Authenticator, Authy 같은 인증 앱이 모두 이 방식을 사용합니다. 서버와 클라이언트가 같은 비밀키를 공유하고 각자 현재 시각으로 같은 코드를 계산하므로, 네트워크로 코드를 주고받지 않아도 본인 확인이 가능합니다. 내부적으로는 시간을 주기로 나눈 카운터에 HMAC-SHA1을 적용한 뒤, 동적 절단(dynamic truncation)으로 6자리 숫자를 추출합니다.
otpauth:// URI로 한 번에 채우기
2단계 인증을 등록할 때 보이는 QR 코드 안에는 otpauth://totp/... 형식의 URI가 들어 있습니다. 이 URI를 맨 위 칸에 붙여넣으면 비밀키뿐 아니라 자릿수, 주기, 알고리즘, 발급자(issuer)까지 자동으로 채워집니다. QR 코드 아래의 "수동 입력" 항목만 있는 경우에는 비밀키 칸에 직접 넣으면 됩니다. 발급자가 인식되면 별도 칸에 표시되어 어떤 서비스의 코드인지 확인할 수 있습니다.
코드가 만들어지는 과정
TOTP는 RFC 6238에 정의된 방식으로, RFC 4226의 HOTP를 시간 기반으로 확장한 것입니다. 계산은 다음 순서로 이루어집니다.
- Base32 비밀키를 바이트 배열로 디코딩합니다.
- 현재 유닉스 시각(초)을 주기(기본 30)로 나눈 몫을 카운터로 삼고, 8바이트 빅엔디안으로 만듭니다.
- 비밀키를 열쇠로 삼아 카운터에 HMAC(기본 SHA-1)을 적용합니다.
- 결과의 마지막 바이트 하위 4비트를 오프셋으로 삼아 그 위치에서 4바이트를 꺼내고 최상위 비트를 지웁니다. 이 과정을 동적 절단이라고 합니다.
- 그 값을 10의 자릿수 제곱으로 나눈 나머지를 구하고 앞을 0으로 채워 6자리(또는 8자리) 코드를 만듭니다.
같은 비밀키와 같은 시각이면 서버와 클라이언트가 각자 계산해도 같은 코드가 나오므로, 코드를 네트워크로 주고받지 않아도 본인 확인이 됩니다.
옵션 고르기
자릿수는 6 또는 8, 주기는 30초 또는 60초, 알고리즘은 SHA-1·SHA-256·SHA-512 중에서 고를 수 있습니다. 대부분의 서비스는 6자리·30초·SHA-1 조합을 쓰며, 이 도구의 기본값도 같습니다. 서비스가 다른 설정을 안내했다면 그에 맞춰 바꿔야 코드가 일치합니다. 화면의 막대는 현재 코드가 유효한 남은 시간을 보여 주므로, 남은 시간이 몇 초 안 남았다면 다음 코드가 나온 뒤 입력하는 편이 안전합니다.
자주 하는 실수와 주의점
- 기기 시계가 몇십 초만 어긋나도 코드가 달라집니다. 코드가 계속 거부되면 먼저 시간 자동 설정을 확인하세요.
- Base32 알파벳에는 0·1·8·9가 없습니다. 비밀키를 옮겨 적을 때 숫자 0과 알파벳 O, 숫자 1과 알파벳 I를 혼동하기 쉽습니다.
- 공백·소문자·끝의 등호 패딩은 자동으로 정리하지만, Base32에 없는 문자가 섞이면 잘못된 비밀키로 안내합니다.
- 비밀키는 비밀번호만큼 민감한 값입니다. 공용 PC에서 사용했다면 반드시 입력값을 지우세요. 이 도구는 비밀키를 저장하지 않으므로 새로고침하면 다시 입력해야 합니다.
- 평소에는 전용 인증 앱을 쓰고, 이 도구는 앱을 쓸 수 없는 상황이나 서버 구현을 검증할 때 보조로 사용하는 것을 권장합니다.
- 계정을 잃지 않으려면 서비스가 제공하는 백업 코드를 따로 안전한 곳에 보관해 두세요.
자주 묻는 질문
비밀키가 서버로 전송되나요?
아니요. 모든 TOTP 계산은 브라우저의 Web Crypto API로 사용자 기기 안에서만 이루어지며, 입력한 Base32 비밀키는 어떤 서버로도 전송·저장되지 않습니다.
TOTP 코드가 인증 앱과 다르게 나옵니다.
기기 시계가 정확한지 확인하세요. TOTP는 시간 기반이므로 시계가 몇 초만 어긋나도 코드가 달라집니다. 또한 비밀키(Base32)와 자릿수, 주기, 알고리즘이 서비스 설정과 같은지 확인하세요. 대부분의 서비스는 6자리·30초·SHA-1을 사용합니다.
Base32 비밀키는 어디서 얻나요?
2단계 인증을 설정할 때 서비스가 보여주는 QR코드 옆의 수동 입력 키가 Base32 비밀키입니다. 보통 A~Z와 2~7로 이루어진 문자열이며 공백이나 대소문자는 무시됩니다.
otpauth:// URI를 붙여넣으면 무엇이 채워지나요?
QR 코드 안에 들어 있는 URI를 맨 위 칸에 붙여넣으면 비밀키, 자릿수, 주기, 알고리즘, 발급자가 한 번에 채워집니다. 값이 자동으로 반영되므로 서비스가 안내한 설정을 일일이 고를 필요가 없습니다.
코드는 어떻게 계산되나요?
Base32 비밀키를 바이트로 디코딩하고, 현재 유닉스 시각을 주기로 나눈 몫을 8바이트 카운터로 만든 뒤 HMAC을 적용합니다. 그 결과에서 동적 절단으로 4바이트를 꺼내 10의 자릿수 제곱으로 나눈 나머지를 구하면 6자리 코드가 나옵니다. RFC 4226과 RFC 6238에 정의된 방식입니다.
Base32 비밀키에 0이나 1을 넣어도 되나요?
안 됩니다. Base32 알파벳은 A부터 Z까지와 2부터 7까지만 사용하므로 0, 1, 8, 9는 들어갈 수 없습니다. 비밀키를 옮겨 적을 때 숫자 0과 알파벳 O, 숫자 1과 알파벳 I를 혼동하지 않도록 주의하세요.
이 코드로 로그인해도 안전한가요?
TOTP 계산 자체는 브라우저 안에서만 이뤄져 안전합니다. 다만 비밀키는 매우 민감한 정보이므로, 공용 PC에서는 사용 후 입력값을 지우고, 평소에는 신뢰할 수 있는 전용 인증 앱을 사용하는 것을 권장합니다.