2FA 코드는 어떻게 작동할까요? TOTP 설명
작성: Novaz 팀 · 업데이트: 2026년 10월 29일
Novaz 단계는 버전 1.0.5에서 확인함
영어 가이드를 번역한 글입니다. 서비스 웹사이트의 버튼과 메뉴는 한국어로 표시될 때 이름이 조금 다를 수 있습니다.
이 페이지의 내용
인증 앱과 웹사이트는 둘 다 가진 두 가지로 같은 6자리 숫자를 각자 계산합니다. 한 번 공유한 비밀 키와 현재 시간입니다. 로그인할 때 둘 사이에 전송되는 것은 없습니다. 그래서 신호가 없어도 코드가 작동하고, 30초마다 코드가 바뀝니다. 이 방식을 TOTP(시간 기반 일회용 비밀번호)라고 하며, 공개 표준입니다(RFC 6238).
재료 1: 설정 키
2FA를 켜면 웹사이트는 무작위 비밀 값을 만들어 QR 코드로 보여 주고, 설정 키라는 텍스트 버전도 함께 제공합니다. 앱이 이 값을 저장합니다. 그때부터 웹사이트와 앱은 같은 키를 가지며, 다른 누구도 이 키를 가져서는 안 됩니다.
QR 코드는 표준 형식의 링크 otpauth://totp/…일 뿐이며, 키, 서비스 이름, 계정 이름, 그리고 선택적으로 아래에서 설명하는 설정이 들어 있습니다. 저희 2FA QR 코드 디코더로 QR 코드 안의 내용을 볼 수 있습니다.
재료 2: 단계로 센 시간
양쪽 모두 현재 시간을 1970년 1월 1일부터 흐른 초(Unix 시간)로 구한 뒤 30으로 나누고 나머지는 버립니다. 그 결과는 30초마다 1씩 늘어나는 정수입니다. RFC 6238은 이 값을 T라고 부르며, “a default time-step size of 30 seconds”(기본 시간 단계 크기 30초)를 권장합니다.
두 재료를 섞어 코드 만들기
앱은 키와 T를 암호학적 함수인 HMAC에 넣습니다. 보통 SHA-1을 사용합니다. 그런 다음 HOTP 표준(RFC 4226, 5.3절)에 정의된 방법으로 결과를 짧은 숫자로 줄입니다.
- HMAC 결과의 마지막 4비트가 결과 안의 한 위치를 고릅니다.
- 앱은 그 위치에서 31비트를 가져와 숫자로 만듭니다.
- 그 숫자의 마지막 6자리를 남깁니다. 8자리를 쓰는 서비스도 있습니다.
키나 시간 단계가 바뀌면 완전히 다른 코드가 나옵니다. 코드에서 거꾸로 키를 알아낼 수는 없습니다.
Try it: a live TOTP code
Calculated in your browser from an example key. Don't paste a real setup key here.
Current code
…
Previous: …
Next: …
- Unix time
- …
- Time step T = ⌊time ÷ 30⌋
- …
- Seconds left
- …
웹사이트가 코드를 받아들이는 이유
웹사이트는 자신이 가진 키 사본과 자체 시계로 같은 계산을 합니다. 숫자가 일치하면 로그인됩니다. 실제로 이 방식이 잘 작동하게 하는 두 가지 세부 사항이 있습니다.
- 지연을 위한 약간의 여유. 한 단계가 끝날 무렵 입력한 코드는 다음 단계에 도착할 수 있습니다. RFC 6238은 “at most one time step is allowed as the network delay”(네트워크 지연으로 최대 한 시간 단계를 허용)하도록 권장하므로, 많은 웹사이트가 현재 코드 바로 앞의 코드도 받아들입니다.
- 각 코드는 한 번만 작동합니다. 표준에 따르면 서버는 이미 받아들인 코드의 “MUST NOT accept the second attempt”(두 번째 시도를 받아들여서는 안 됩니다). 미국 NIST 지침도 같은 내용으로, 검증자는 “SHALL accept a given OTP only once while it is valid”(유효한 동안 하나의 OTP를 한 번만 받아들여야 한다)고 합니다(NIST SP 800-63B-4).
시계가 틀리면 코드가 작동하지 않는 이유도 이 때문입니다. iPhone 시계가 1분 어긋나 있으면 웹사이트와 다른 시간 단계의 코드를 계산하게 됩니다. 인증 앱 코드가 작동하지 않나요?를 참고하세요.
서비스가 바꿀 수 있는 설정
표준은 일부 변형을 허용하며, QR 코드에 그 설정을 담을 수 있습니다.
| 설정 | 일반적인 값 | 허용되는 다른 값 |
|---|---|---|
| 해시 | SHA-1 | SHA-256, SHA-512(RFC 6238, 1.2절) |
| 자릿수 | 6 | 7 또는 8(RFC 4226, 5.3절) |
| 간격 | 30초 | 다른 길이 |
서비스가 일반적이지 않은 설정을 사용한다면 키를 입력하지 말고 QR 코드를 스캔해 추가하세요. 그래야 앱이 설정도 함께 받습니다.
TOTP와 HOTP
이전 표준인 HOTP는 시간 대신 코드를 요청할 때마다 늘어나는 카운터를 사용합니다. TOTP는 시간 단계를 카운터로 쓰는 HOTP로, “TOTP = HOTP(K, T)”입니다. 오늘날 대부분의 웹사이트는 TOTP를 사용합니다.
TOTP가 막지 못하는 것
코드를 직접 입력하므로, 그럴듯한 가짜 로그인 페이지가 코드를 물어보고 곧바로 사용할 수 있습니다. NIST는 “OTP authentication is not phishing-resistant”(OTP 인증은 피싱에 강하지 않다)고 분명히 말합니다. 패스키와 보안 키는 피싱에 강합니다. 자세한 내용은 인증 앱과 SMS에 있습니다.
Authenticator App - Novaz에서는
Novaz는 iPhone에서 표준 TOTP 코드를 만듭니다.
- QR 코드로 추가한 경우: SHA-1, SHA-256 또는 SHA-512, 6
8자리, 1300초 간격. - 직접 입력한 키로 추가한 경우: 항상 6자리, 30초, SHA-1.
HOTP 코드는 만들지 않습니다. 또한 iPhone의 시계를 확인해 15초 이상 어긋나면 알려 줍니다.