일회용 비밀번호 (OTP)는 어떻게 작동하나요?
이 기사에서는 두 가지 다른 일회용 비밀번호 방법: 이메일/전화번호 + 인증 코드와 동적 코드를 소개합니다.
인터넷이 발전함에 따라, 우리는 거의 모든 필요를 충족시키기 위해 다양한 온라인 서비스를 사용해 왔습니다. 이러한 서비스를 사용하기 위한 첫 번째 단계는 종종 등록과 로그인입니다. 등록과 로그인에 있어 사용자 ID와 비밀번호 인증은 여전히 널리 사용됩니다. 비록 인터넷에 연결할 수 없는 독립형 데스크탑 컴퓨터를 사용하던 시절로부터 30년 이상이 지났지만 말입니다.
과거에는 이메일 계정의 비밀번호만 기억하면 되었습니다. 하지만 이제 우리는 수십, 심지어 수백 개의 온라인 서비스를 사용하며, 모든 서비스에 같은 비밀번호를 사용할 수 없습니다. 하나의 계정의 비밀번호가 유출되면 같은 비밀번호를 사용하는 모든 계정이 위험할 것입니다. 결과적으로 비밀번호 없는 로그인은 점점 더 인기를 얻고 있으며, 점차 주류 접근 방식이 되고 있습니다.
비밀번호 없는 인증에는 여러 가지 방법이 있으며, 소셜 로그인, 이메일/전화번호 + 인증 코드, 동적 비밀번호를 사용하는 인증자 앱 등이 포함됩니다. 후자의 두 가지 방법은 일회용 비밀번호 (OTP)로 분류할 수 있습니다.
일회용 비밀번호 (OTP)란 무엇인가요?
OTP는 주어진 로그인 세션이나 짧은 시간 동안만 유효한 자동 생성된 일련의 문자입니다. OTP는 한 번만 사용할 수 있기 때문에, 잃어버리거나 도난당한 비밀번호와 같은 자격 증명 유출의 위험을 방지할 수 있습니다.
이론적으로 OTP는 일 정한 길이의 임의의 문자로, 대문자와 소문자 그리고 특수 기호까지 포함할 수 있습니다. 하지만 사용자 경험을 위해 대부분의 서비스는 OTP를 사용할 때 순수 숫자를 사용합니다.
이메일 / 전화번호 + 인증 코드
많은 웹사이트는 등록한 이메일이나 전화번호로 인증 코드(또는 패스코드)를 보내 사용자 본인임을 확인하게 합니다.
잭과 조가 0과 999 사이의 숫자를 맞추는 놀이를 하고 있다고 상상해 보세요. 잭은 조에게 숫자 범위를 알려주고, 조는 세 번의 기회 안에 1분 내에 숫자를 맞춰야 합니다. 숫자 범위를 아는 것 외에 조는 다른 정보를 갖고 있지 않습니다.
단지 세 번의 시도 안에 조가 1분 내에 숫자를 올바르게 맞추는 것은 거의 불가능하다는 것을 우리는 알고 있습니다.
이메일 / 전화번호 + 인증 코드는 같은 원리로 작동합니다: 인증 코드는 일반적으로 매우 짧은 기간 동안만 유효하며, 보통 10분을 넘지 않습니다. (잭이 조에게 "1분"을 주는 것과 비슷합니다.) 또한, 인증 코드를 확인하는 API나 방법은 일반적으로 패스코드에 대한 무차별 대입 공격을 방지하기 위해 레이트 리미트를 가지고 있습니다 (마치 잭이 조에게 "세 번의 기회"만 주는 것과 같이).
잠재적인 공격자에게 이 방법을 크랙하기는 거의 불가능합니다. 하지만 시스템은 사용자에게 신뢰할 수 있는 경로(이메일 또는 전화)를 통해 인증 코드를 알려주며, 사용자는 직접 인증할 수 있습니다.
동적 코드
동적 코드, 또는 시간 기반 일회용 비밀번호(TOTP)는 시간이 지남에 따라 변경된다는 점에서 "동적"입니다. 일반적으로 웹 앱이 TOTP를 사용하면, RFC6238 - 시간 기반 일회용 비밀번호 알고리즘을 따릅니다.
해시 기반 일회용 비밀번호
TOTP를 소개하기 전에, RFC4226 - HMAC 기반 일회용 비밀번호 알고리즘을 간략히 설명해야 합니다 (HMAC은 해싱 알고리즘입니다). HOTP 알고리즘은 다음과 같이 작동합니다:
-
비밀: HOTP는 서버와 클라이언트 간에 공유되는 비밀 키 K를 필요로 합니다.
-
카운터: HOTP의 핵심은 새로운 비밀번호가 생성될 때마다 증가하는 카운터 C입니다.
-
HMAC 계산:
-
인증 코드를 계산하기 위해 HMAC-SHA-1 (또는 다른 해시 함수)을 사용합니다:
-
여기서 H는 160비트 해시 값입니다.
-
-
트렁케이션: 해시 값 H의 일부를 추출하여 OTP를 생성합니다. 6자리의 OTP를 원한다고 가정하면, 과정은 다음과 같습니다:
- H의 마지막 바이트를 추출하여 트렁케이션 오프셋 O로 사용합니다.
- O부터 시작하여 4바이트를 추출하고 이를 정수 T로 변환합니다.
- T의 마지막 d 자리를 취합니다, 즉, OTP = T mod 10^d입니다.
요약하면, HOTP 공식은:
여기서 d는 원하는 OTP 길이입니다 (일반적으로 6-8자리).
시간 기반 일회용 비밀번호
TOTP는 HOTP의 확장 버전으로, 카운터 대신 시간 단위를 사용합니다. 현재 시간을 사용하여 동적 인증 코드를 생성하므로 OTP는 시간이 지남에 따라 자동으로 만료됩니다. 작동 원리는 다음과 같습니다:
-
시간 단위: TOTP는 HOTP 카운터 C 대신 현재 시간 T를 사용합니다. 시간 단위는 정해진 일정 시간 간격입니다 (일반적으로 30초).
- 예를 들어, 시간 단위가 30초이고 현재 유닉스 타임스탬프가 T라고 가정합니다. TOTP 카운터는 다음과 같이 계산됩니다: T' = T / time_step
- 여기서 T′는 30초 단위의 시간 단계 카운터입니다.
-
OTP 생성: T′를 HOTP 알고리즘에 대입하여 OTP를 생성합니다:
-
동적 업데이트: TOTP는 시간 단위에 기초하므로 OTP는 시간이 지남에 따라 변경되며, 서버는 OTP가 유효 시간 내에 있는 한 유효성을 확인할 수 있습니다.
요약하면, TOTP 공식은:
인증자 앱을 사용하는 경험에 기초하여 비밀값을 장치와 서버 사이에서 QR 코드를 스캔하거나 직접 복사하여 동기화할 수 있으며, 비밀값이 동일한지 확인하기 위해 현재 동적 코드를 한 번 입력해야 합니다.
모바일 장치를 사용하기 시작한 초기에는, 서로 다른 장치의 시간이 같지 않음을 발견할 수 있었고, 주기적으 로 장치의 시간을 수동으로 조정해야 했습니다. 최근 몇 년 동안, 거의 모든 장치는 네트워크 시간 서비스 (NTP)를 사용하여 정기적으로 장치 시간을 동기화하고 업데이트합니다. 장치의 시계가 완전히 정확하지 않더라도, 빈번한 업데이트는 서로 다른 장치 간의 시간이 합리적으로 일치하게 됩니다. 이 가정에 근거하여, 장치가 오프라인 상태에서도 동적 코드를 사용할 수 있으며, 오프라인 상태에서는 인증 코드를 받기 어려울 것입니다.
마무리
이 기사에서는 두 가지 다른 일회용 비밀번호 방법: 이메일/전화번호 + 인증 코드와 동적 코드를 소개했습니다.
이메일/전화번호 + 인증 코드는 통신 인프라와 타사 이메일 또는 짧은 메시지 서비스 (SMS)를 사용하여 구현됩니다. 동적 코드는 외부 서비스 및 통신 시설에 의존하지 않고 오프라인으로 사용할 수 있습니다.
Logto는 인기 있고 강력하며 확장성이 뛰어난 IAM (Identity and Access Management) 서비스로서, 두 가지 OTP 방법을 모두 지원하여 사용자가 비즈니스 관점에서 가장 잘 맞는 솔루션을 선택할 수 있게 해줍니다.