일회용 비밀번호(OTP)는 한 번만 쓰는 일회성 코드입니다. 종류별 차이와, 의외로 잘 알려지지 않은 한계(피싱에는 뚫릴 수 있음)를 정리합니다(공격 절차는 싣지 않습니다).
종류: TOTP / HOTP / SMS-OTP
모두 '일회성 코드'로 묶이기 쉽지만, 만들어지는 방식에 따라 세 종류로 나뉩니다.
TOTP(시간 기반)
인증 앱이 공유 비밀값 + 현재 시각으로 계산. 약 30초마다 바뀜. 오프라인에서 동작.
HOTP(카운터)
시각이 아니라 횟수(카운터)로 진행. 누를 때마다 다음 코드. 하드웨어 토큰 등에서 사용.
SMS-OTP
SMS로 코드를 전송. 간편하지만 SIM 스왑과 중계에 약해 가장 취약한 방식.
모두 '한 번만, 짧은 수명'이라는 성질은 같아서, 고정 비밀번호가 유출되어도 코드 자체는 재사용하기 어렵습니다. 특히 TOTP는 통신 없이 앱 안에서 계산하므로 SMS 같은 가로채기 경로가 없습니다.
강점과 한계: 가짜 사이트에 입력한 코드는 빼앗길 수 있다
OTP는 고정 비밀번호의 약점을 보완하지만 완전한 보호는 아닙니다. 결정적인 한계는 사람이 코드를 읽고 입력한다는 점입니다.
OTP가 통하는 상황
- 비밀번호의 유출·재사용에 의한 탈취를 막음
- 누가 보더라도 금방 무효가 되어 재사용하기 어려움
- 인증 앱의 TOTP는 오프라인에서 동작하며 SMS보다 가로채기에 강함
OTP가 뚫리는 상황
- 중간자 피싱(AiTM): 가짜 사이트가 OTP를 진짜 사이트로 중계해 로그인
- SIM 스왑: 전화번호를 탈취해 SMS-OTP를 가로챔
- 근본 원인 = 사람이 코드를 가짜 사이트에 넘겨줄 수 있음(도메인에 묶이지 않음)
전달 방식에 따라 달라지는 위험
'일회용 비밀번호'에는 여러 방식이 있고, 코드가 어디서 만들어져 어떻게 전달되는지에 따라 약점이 다릅니다.
| 방식 | 코드가 만들어지는 곳 | 전달 경로 | 주된 약점 |
|---|---|---|---|
| 인증 앱(TOTP) | 휴대폰 안 | 전달되지 않음(기기에서 계산) | 가짜 사이트에 입력, 휴대폰 분실 후 복구 |
| 하드웨어 토큰 | 작은 전용 기기 | 전달되지 않음(화면에 표시) | 가짜 사이트에 입력, 기기 분실 |
| SMS | 서비스의 서버 | 휴대전화 통신망 | 가짜 사이트에 입력, SIM 스왑, SMS 가로채기 |
| 이메일 | 서비스의 서버 | 이메일 | 가짜 사이트에 입력, 이메일 계정 탈취 |
모든 방식에 공통된 약점은 가짜 사이트에 입력하는 것입니다. 미국 국립표준기술연구소(NIST)의 인증 가이드라인 SP 800-63B(제4판, 2025년 8월)는 수동으로 입력하는 일회용 비밀번호는 피싱 저항성을 가질 수 없다고 하며, SMS처럼 전화망을 쓰는 방식은 '제한적(restricted)'으로 분류합니다. 미국 사이버보안·인프라보안청(CISA)도 2024년 12월 SMS를 두 번째 요소로 쓰지 말라고 권고했습니다.
2단계 인증, 2단계 확인, 패스키라는 용어의 관계는 2단계 인증(2FA)이란의 비교표에 정리되어 있습니다.
TOTP의 원리: QR 코드에 비밀값이 들어 있다
인증 앱을 설정할 때 스캔하는 QR 코드에는 서비스와 앱이 공유하는 비밀값이 들어 있습니다. 앱은 이 값과 현재 시각으로 코드를 계산하고, 서비스도 같은 계산을 해서 일치하는지 확인합니다.
- 표준(RFC 6238)은 30초의 시간 간격을 권장합니다
- 네트워크 지연을 고려해 직전 간격의 코드도 받아들이는 서비스가 많습니다(표준은 최대 한 간격을 권장)
- 카운터 기반 HOTP(RFC 4226)는 버튼을 누를 때마다처럼 횟수에 따라 진행합니다
따라서 QR 코드나 비밀 문자열을 가진 사람은 누구나 같은 코드를 만들 수 있습니다. 설정 화면의 스크린숏을 클라우드나 채팅에 남겨 두는 것은 비밀번호를 적어 두는 것과 같습니다.
실제 사례: 인터넷 뱅킹 부정 송금
2023년 일본에서는 인터넷 뱅킹 부정 송금이 급증했습니다. 일본 금융청에 따르면 2023년 1~11월 피해는 5,147건, 약 80.1억 엔(12월 8일 기준)으로 건수와 금액 모두 역대 최다였습니다. 금융청은 수법을 은행을 사칭한 이메일이나 SMS로 가짜 사이트에 유도해 인터넷 뱅킹의 ID, 비밀번호, 일회용 비밀번호 등을 빼낸 뒤 돈을 이체하는 것이라고 설명합니다.
이 사례의 교훈은 두 가지입니다.
- 가짜 사이트에 코드를 입력하면 일회용 비밀번호로는 막을 수 없습니다: 코드의 수명이 아무리 짧아도, 입력한 순간 사용되면 충분히 시간 안에 들어옵니다
- 막을 곳은 입력하기 전입니다: 은행은 이메일이나 SMS로 ID와 비밀번호를 묻지 않는다고 밝힙니다. 이메일이나 SMS의 링크로 연 페이지에 코드를 입력하지 않는 것이 이용자가 할 수 있는 가장 확실한 조치입니다
그 뒤 일본의 증권사와 은행은 패스키처럼 가짜 사이트에서는 완료되지 않는 인증을 필수로 하는 방향으로 움직이고 있습니다(패스키란).
자신의 계정과 서비스 점검 방법
SMS를 쓰는 계정을 인증 앱으로 옮긴다
이메일, 비밀번호 관리자, GitHub, 클라우드 서비스 같은 중요한 계정의 2단계 인증 설정을 엽니다. SMS를 쓰고 있다면 인증 앱(TOTP)을 추가하고 우선 방식으로 지정합니다. 패스키를 쓸 수 있다면 함께 추가합니다. GitHub는 GitHub 2단계 인증 설정을 참고하세요.
기기 변경과 분실에 대비한다
인증 앱을 다른 기기로 옮길 수 있는지(백업이나 이전 기능) 확인합니다. 각 서비스의 복구 코드는 비밀번호 관리자처럼 휴대폰이 아닌 곳에 저장합니다.
QR 코드와 비밀값이 남아 있지 않은지 확인한다
사진, 클라우드 저장소, 채팅에 설정용 QR 코드나 비밀 문자열의 스크린숏이 없는지 찾아보고, 있으면 삭제합니다.
서비스를 만드는 쪽이라면 검증 규칙을 점검한다
코드를 검증할 때 실패 횟수를 제한합니다(그러지 않으면 6자리 코드는 현실적으로 무차별 대입이 가능합니다). 유효 기간 안이라도 같은 코드는 한 번만 받아들입니다. 허용하는 시계 오차는 한 간격 정도로 둡니다. 관리자 계정에는 일회용 비밀번호보다 강한 패스키를 제공합니다.
이 사이트의 관점: OTP는 중간 단계이고, 목표는 패스키다
OTP는 '비밀번호만'에서 벗어나는 훌륭한 첫걸음입니다. 실제로 SMS든 TOTP든 켜는 것만으로 탈취의 대부분은 멈춥니다. 다만 이 사이트는 OTP를 최종 목표가 아니라 중간 단계로 봅니다. 중간자 피싱이 현실의 위협인 이상, 목표는 서명이 도메인에 묶여 구조적으로 가짜 사이트에 제시할 수 없는 패스키(FIDO2)입니다.
우선순위는 분명합니다. 먼저 모든 계정에 OTP를 켜고, 가장 중요한 계정(이메일, 도메인, 결제)부터 패스키로 옮깁니다. '주의해서 가짜 사이트를 알아채는 것'에 의존하지 않는 것이 핵심입니다.
출처(1차 자료)
- IETF RFC 6238, "TOTP: Time-Based One-Time Password Algorithm" — rfc-editor.org(30초 시간 간격, 네트워크 지연에 대해 최대 한 간격 허용)
- IETF RFC 4226, "HOTP: An HMAC-Based One-Time Password Algorithm" — rfc-editor.org(카운터 기반 일회용 비밀번호, 실패 시도 제한)
- NIST SP 800-63B-4(2025년 8월) — pages.nist.gov(수동 입력 OTP는 피싱 저항성 불가, 전화망 방식은 제한적, 같은 OTP는 한 번만 허용, 시도 횟수 제한)
- CISA, "Mobile Communications Best Practice Guidance"(2024년 12월) — cisa.gov (PDF)(SMS를 두 번째 요소로 쓰지 말 것)
- 일본 금융청, 피싱에 의한 인터넷 뱅킹 부정 송금 급증에 대한 주의 환기(일본어) — fsa.go.jp(2023년 1~11월 건수와 피해액, 일회용 비밀번호 등의 탈취)
다음으로 읽기
- 용어집: 2단계 인증(2FA)이란(OTP가 '두 번째 증명'으로 쓰이는 맥락) · 패스키란(OTP보다 강한 피싱 저항성)
- 용어집: 피싱이란(OTP를 중계하는 AiTM 공격의 이해)
- 학습: MFA를 제대로 고르기(실무에서의 방식 선택) · GitHub 2단계 인증 설정(인증 앱과 복구 코드)
- 사례: 7pay 부정 사용 사건(2019년)(2단계 인증이 없어 결제 앱이 탈취된 사례)