모든 아티클

TOTP: 인증 앱의 일회용 코드는 어떻게 작동하는가

한국은 2020년 전자서명법 개정 전까지 공인인증서와 액티브X 기반 보안 프로그램이 사실상 인터넷 뱅킹의 유일한 인증 수단이었다. 법 개정으로 공인인증서의 법적 독점이 사라지면서 은행과 핀테크는 비로소 OTP 애플리케이션, 생체인증 등 더 가벼운 인증 수단을 자유롭게 도입할 수 있게 되었고, TOTP 방식의 앱 기반 인증도 이 흐름 속에서 빠르게 자리잡았다.

공유 비밀 더하기 시간

설정하는 동안 서버와 인증 앱은 하나의 공유 비밀 키를 교환합니다(이것이 바로 QR 코드에 인코딩된 것입니다). 그 이후로 양쪽은 독립적으로 그 비밀과 30초 간격으로 반올림된 현재 유닉스 시간으로부터 HMAC을 계산합니다 — 서로 통신하지 않고도 같은 코드에 도달합니다.

이것이 인터넷 없이 작동하는 이유

코드가 비밀과 기기의 시스템 시계로부터 로컬에서 계산되기 때문에, 인증 앱은 코드를 생성하기 위해 네트워크 연결이 필요하지 않습니다. 유일한 요구 사항은 서버와 휴대폰의 시계가 허용된 작은 오차 범위(보통 ±30~60초) 내에서 동기화되어 있어야 한다는 것입니다.

코드가 30초마다 바뀌는 이유

짧은 시간 간격은 가로챈 코드가 유효한 채로 남아있는 시간을 제한해, 공격자가 그것을 재사용할 위험을 줄입니다. 서버는 보통 코드를 입력할 때 생기는 약간의 네트워크 지연을 보완하기 위해 현재 간격과 직전 간격을 모두 허용합니다.

왜 필요한가

  • 인증 앱을 설정하거나 문제를 해결할 때 2단계 인증의 작동 원리 이해하기.
  • 인증 시스템을 개발할 때 자신의 TOTP 구현을 테스트하기.
  • 휴대폰에서 수동으로 입력하지 않고 자동화된 테스트를 위한 코드 생성하기.

TOTP가 막지 못하는 것

TOTP는 코드와 별개로 비밀번호만 도난당하는 상황에서는 잘 보호해주지만, 실시간 피싱에는 취약합니다. 피해자가 가짜 사이트에 비밀번호와 현재 TOTP 코드를 모두 입력하면, 공격자는 코드가 유효한 동안 두 값을 즉시 실제 사이트에 그대로 사용할 수 있습니다. 이런 공격을 막을 수 있는 것은 특정 도메인에 암호학적으로 묶여 있는 FIDO2/WebAuthn 표준의 하드웨어 키뿐입니다.

도구 사용해보기