2FA 코드 생성기 (TOTP)
Base32 시크릿 키나 otpauth:// URI로 2FA 인증 코드(RFC 6238 TOTP)를 생성합니다. RFC 테스트 벡터로 검증했고, 키는 저장하지 않으며 URL에도 넣지 않습니다.
- 브라우저에서 처리
- 데이터가 브라우저 밖으로 나가지 않습니다
- 무료 · 회원가입 불필요
WeChat으로 스캔하여 공유
예시·자세한 설명·자주 묻는 질문 실제 출력이 있는 예시, 다른 도구와의 차이, 자주 묻는 질문.
계산 방식은 RFC 6238의 TOTP로, T = floor(Unix 시각 / 주기)에 RFC 4226의 HOTP를 적용합니다.
대학 포털의 구글 OTP 등록을 예로
국내에서는 Google Authenticator를 흔히 「구글 OTP」라고 부르며, Google 고객센터 한국어 문서 제목도 「Google OTP로 인증 코드 받기」입니다. 대학 포털처럼 이 앱으로 2단계 인증을 요구하는 곳이 많습니다. 한국체육대학교의 「포털 2단계 인증(구글 OTP) 등록 가이드」(2025.7)는 휴대폰으로 QR 코드를 스캔하는 방법 외에, PC에서 크롬 확장 프로그램 「인증 도구」에 「수동입력」으로 OTP 키를 붙여 넣고 발급자에 portal을 적는 방법을 안내합니다. 같은 문서에 「OTP번호는 30초마다 변경됨」, 「한 번 등록을 마친 QR코드는 다시 다른 기기에 등록할 수 없습니다」라는 설명도 있습니다.
키를 직접 옮겨 적는 방식에서는 한 글자만 틀려도 앱이 6자리 숫자를 계속 보여 주지만 서버는 받아 주지 않습니다. 같은 키를 이 도구에 붙여 넣고, 같은 30초 안에 숫자를 비교해 보세요.
- 숫자가 다르면: 앱에 넣은 키가 잘못되었습니다. 키에
0,1,8,9가 있으면 도구가 그 문자를 알려 줍니다. Base32에는 이 네 숫자가 없으므로 O, I, B를 잘못 읽었을 가능성이 큽니다. - 숫자가 같은데 거부되면: 시계를 확인하세요. RFC 6238 5.2절은 검증 쪽이 네트워크 지연으로 허용하는 폭을 최대 1단계로 두도록 권장합니다. 기기 시계와 서버 시각이 약 3초 이상 차이 나면 이 도구가 경고합니다.
발급자 portal, 계정 20261234로 URI를 만들면 otpauth://totp/portal:20261234?secret=GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ&issuer=portal이 됩니다. Google의 Key Uri Format에 따라 기본값(SHA1, 6자리, 30초)은 생략하고, 발급자나 계정에 :가 있으면 구분자와 헷갈리므로 오류로 처리합니다.
RFC 테스트 벡터로 확인한 예시
RFC가 공개한 테스트 키이므로 다른 구현에서도 같은 결과가 나와야 합니다.
| 키(Base32) | 설정 | Unix 시각 | 이전 | 현재 | 다음 |
|---|---|---|---|---|---|
64바이트 시드(끝에 =) | SHA-512, 8자리 | 1234567890 | 19152904 | 93441116 | 93638120 |
GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ | SHA-1, 6자리, 주기 60초 | 2000000000 | 021152 | 864010 | 718332 |
| 같은 키 | SHA-1, 6자리, 주기 30초 | 2000000000 | 279037 |
첫 줄의 93441116은 RFC 6238 부록 B 표의 1234567890초 SHA-512 값입니다. 64바이트 시드는 GEZDGNBVGY3TQOJQ를 6번 반복하고 GEZDGNA=를 붙인 문자열입니다. RFC 본문은 20바이트 시드만 언급하지만, 부록 A의 참조 코드는 SHA-256·SHA-512에 32·64바이트 시드를 쓰며 표의 값도 이 시드에서 나옵니다. 둘째·셋째 줄은 같은 키와 시각이라도 주기에 따라 T가 33333333과 66666666으로 달라져 코드가 바뀐다는 것을 보여 줍니다. 30초일 때의 279037은 RFC 표의 8자리 값 69279037의 뒤 6자리입니다.
다른 2FA 코드 생성 사이트와의 차이
2026-09-30에 「2FA 코드 생성」 검색 결과에 나오는 도구를 같은 입력으로 시험했습니다.
- 키가 남는 곳. 2FA Pro는 코드를 만들면 저장 버튼을 누르지 않아도 브라우저 localStorage의
2fa_pro_history에 키 전체(fullSecret)를 기록했습니다. BrowserScan은 키를 주소창의#뒤에 적어 방문 기록에 남깁니다. 이 도구의 키는 페이지 메모리에만 있고, 보내는 요청은 키가 없는 시각 확인용 HEAD뿐입니다. - 잘못된 문자.
GEZDGNBV1Y3TQOJQ(1포함)를 넣으면 2FA Pro는 「Secret key too short.」라고 표시했고, BrowserScan은 코드를 보여 주었습니다(빨간 글씨 「키 문자가 불법입니다. 키를 확인하세요.」는 올바른 RFC 키에서도 떠 있었습니다). 이 도구는 문제가 되는 문자를 짚어 줍니다. - otpauth:// 붙여 넣기. BrowserScan은 URI를 넣으면 코드를 내지 않았습니다. 이 도구는 URI의 설정을 모두 채웁니다.
- 설정. SHA-1·SHA-256·SHA-512, 6·8자리, 1~86400초의 임의 주기, 고정 Unix 시각을 쓸 수 있습니다. 2FA Pro는 주기가 30·60초이고 7자리와 HOTP를 지원합니다.
제한 사항
- TOTP 전용입니다.
otpauth://hotp/는 받지 않으며 카운터 모드가 없습니다. - 자릿수는 Key Uri Format의 값인 6과 8뿐입니다. 주기는 1~86400의 정수 초이고, 기준은 Unix 에포크(T0 = 0)입니다.
- Key Uri Format 문서에 따르면 Google Authenticator는
algorithm과period를 무시하고, Android 버전은digits도 무시합니다. 이 값을 바꾸면 QR 코드 아래에 안내가 나옵니다. - QR 이미지는 읽지 못합니다. QR코드 스캔로
otpauth://문자열을 꺼낸 뒤 붙여 넣으세요. 다른 문자열을 QR 코드로 만들려면 QR코드 만들기를 쓰세요. - 아무것도 저장하지 않습니다. 새로고침하면 키가 사라집니다(의도한 동작입니다).
- 시계 확인은 서버
Date헤더(1초 단위)를 쓰므로 약 3초 이내의 차이는 알리지 않습니다. 요청이 실패해도 아무것도 표시하지 않습니다.
FAQ
시크릿 키가 서버로 전송되거나 저장되나요?
아니요. 코드는 브라우저의 Web Crypto API로 기기 안에서 계산합니다. 키는 localStorage, sessionStorage, 쿠키, URL 어디에도 쓰지 않으며, 이 페이지는 분석·광고 스크립트도 불러오지 않습니다. 새로고침하면 키가 사라집니다. 도구가 보내는 요청은 시계 확인을 위해 서버의 Date 헤더를 읽는 이 페이지에 대한 HEAD 요청 1번뿐이며, 쿼리 문자열도 본문도 없습니다.
Google OTP 앱이나 서버와 코드가 다르면 어떻게 확인하나요?
기기 시계(약 3초 이상 차이 나면 경고가 뜹니다), 키(한 글자 오타, 등록 화면을 다시 열어 바뀐 키), 설정(알고리즘·자릿수·주기는 양쪽이 같아야 함) 순서로 확인하세요. 현재 코드 아래의 이전·다음 코드를 보면 상대가 한 단계 어긋났는지 알 수 있습니다.
QR 코드의 otpauth:// 링크를 그대로 붙여 넣을 수 있나요?
네. otpauth://totp/ URI 전체를 시크릿 칸에 붙여 넣으면 키, 발급자, 계정, 알고리즘, 자릿수, 주기를 채우고 입력칸에는 키만 남깁니다. otpauth://hotp/(카운터 방식)는 시간 기반이 아니므로 받지 않습니다. QR 이미지에서 URI를 꺼내려면 먼저 QR 코드 디코더를 쓰세요.
랜덤 생성 키의 길이는요?
SHA-1은 20바이트(160비트), SHA-256은 32바이트, SHA-512는 64바이트로, RFC 6238 5.1절이 권장하는 HMAC 출력 길이와 같습니다. RFC 4226은 최소 128비트를 요구하며, 더 짧은 키도 계산은 되지만 경고를 표시합니다.
평소 쓰는 인증 앱 대신 써도 되나요?
권하지 않습니다. 아무것도 저장하지 않아 탭을 닫으면 코드도 사라지고, 키를 가진 사람은 누구나 같은 코드를 만들 수 있습니다. 실제 계정의 키는 인증 앱이나 비밀번호 관리자에 두세요. 이 페이지는 2FA 구현 테스트, 직접 입력한 키 확인, 특정 시각의 코드 확인에 적합합니다.