OTP(TOTP) 테스트 도구 완벽 가이드
OTP(One-Time Password, 일회용 비밀번호)는 현대 디지털 보안에서 가장 널리 사용되는 2단계 인증(2FA) 방식 중 하나입니다. 특히 TOTP(Time-based One-Time Password)는 시간 기반으로 일회용 비밀번호를 생성하는 표준 알고리즘으로, RFC 6238에 정의되어 있습니다. 이 도구는 개발자와 보안 담당자가 TOTP 구현을 테스트하고 검증할 수 있도록 설계되었습니다.
TOTP는 공유된 비밀 키(Secret Key)와 현재 시간을 조합하여 일정 시간 간격(일반적으로 30초)마다 새로운 숫자 코드를 생성합니다. 이 과정에서 HMAC-SHA1 해시 함수가 사용되며, 서버와 클라이언트가 동일한 비밀 키와 시간을 공유하면 같은 코드를 독립적으로 생성할 수 있습니다. Google Authenticator, Microsoft Authenticator, Authy 등 주요 인증 앱이 모두 이 표준을 따르고 있습니다.
이 도구는 순수 JavaScript로 HMAC-SHA1 알고리즘을 구현하여 브라우저에서 직접 TOTP 코드를 생성합니다. 시크릿 키가 외부 서버로 전송되지 않으므로 안전하게 테스트할 수 있습니다. Base32로 인코딩된 시크릿 키를 입력하면 실시간으로 OTP 코드가 생성되며, 30초(또는 설정된 주기) 카운트다운 타이머로 코드의 남은 유효 시간을 확인할 수 있습니다. 또한 otpauth:// URI를 자동으로 생성하여 인증 앱에 등록할 수 있는 텍스트 형식의 설정 정보를 제공합니다.
개발자는 이 도구를 활용하여 자체 TOTP 서버 구현의 정확성을 검증하거나, 2단계 인증 시스템의 통합 테스트를 수행할 수 있습니다. 보안 감사 시 TOTP 설정이 올바르게 작동하는지 확인하는 용도로도 활용 가능합니다. 시크릿 키 길이, 코드 자릿수(6자리/8자리), 갱신 주기(30초/60초) 등 다양한 매개변수를 조정하여 다양한 시나리오를 테스트할 수 있습니다.
TOTP 작동 원리
TOTP의 핵심 알고리즘은 다음과 같이 동작합니다. 먼저 현재 Unix 시간을 시간 간격(기본 30초)으로 나누어 시간 카운터(T)를 계산합니다. 이 카운터 값을 8바이트 빅엔디안 정수로 변환한 후, 공유 비밀 키와 함께 HMAC-SHA1 해시를 계산합니다. 생성된 20바이트 해시에서 동적 잘라내기(Dynamic Truncation)를 통해 4바이트를 추출하고, 이를 10의 거듭제곱(6자리면 10^6)으로 나눈 나머지가 최종 OTP 코드가 됩니다.
Base32 인코딩이란?
Base32는 바이너리 데이터를 A-Z와 2-7의 32개 문자로 표현하는 인코딩 방식입니다. TOTP에서 시크릿 키를 Base32로 인코딩하는 이유는 사용자가 수동으로 키를 입력해야 할 때 대소문자 구분 없이 명확하게 전달할 수 있기 때문입니다. 또한 QR 코드로 전달할 때도 표준 형식으로 사용됩니다.
자주 묻는 질문 (FAQ)
Q. 이 도구에서 생성한 OTP가 실제 인증 앱과 동일한 코드를 보여주나요?
A. 네, 동일한 시크릿 키와 동일한 시간(시스템 시계가 정확하다면)에서 RFC 6238 표준에 따라 동일한 OTP 코드를 생성합니다. Google Authenticator 등 주요 인증 앱과 동일한 결과를 확인할 수 있습니다.
Q. 시크릿 키가 서버로 전송되지 않나요? 안전한가요?
A. 이 도구는 100% 클라이언트 사이드(브라우저)에서 동작합니다. 입력한 시크릿 키는 외부 서버로 전송되지 않으며, 모든 HMAC-SHA1 연산이 순수 JavaScript로 브라우저 내에서 수행됩니다. 단, 실제 운영 중인 서비스의 시크릿 키를 입력하는 것은 보안상 권장하지 않습니다.
Q. OTP 코드가 인증 앱과 다른 경우 어떻게 해야 하나요?
A. 시스템 시계가 정확한지 확인하세요. TOTP는 시간 기반이므로 서버와 클라이언트의 시간이 ±30초 이상 차이 나면 코드가 일치하지 않을 수 있습니다. 또한 시크릿 키의 대소문자, 공백, 패딩 문자(=)를 정확히 입력했는지 확인하세요.
Q. otpauth:// URI는 무엇이며 어떻게 사용하나요?
A. otpauth:// URI는 TOTP 설정 정보를 표준 형식으로 담은 URL 스킴입니다. 이 URI를 QR 코드로 변환하면 인증 앱에서 카메라로 스캔하여 즉시 등록할 수 있습니다. URI에는 시크릿 키, 발급자, 계정 이름, 자릿수, 주기 등의 정보가 포함됩니다.
Q. 6자리와 8자리 OTP의 차이는 무엇인가요?
A. 6자리 OTP는 가장 일반적인 설정이며, 대부분의 서비스에서 사용됩니다. 8자리 OTP는 더 높은 보안 수준을 제공하지만 사용자가 입력해야 하는 자릿수가 많아 편의성이 다소 떨어집니다. 특별한 보안 요구 사항이 없다면 6자리를 권장합니다.
Q. 랜덤 키 생성 기능은 안전한가요?
A. 브라우저의 Web Crypto API(crypto.getRandomValues)를 사용하여 암호학적으로 안전한 난수를 생성합니다. 테스트 및 개발 목적으로는 충분히 안전하지만, 실제 프로덕션 환경에서는 서버 측에서 키를 생성하고 안전하게 저장하는 것을 권장합니다.