구글 OTP 동작 원리

박성수·2025년 4월 22일
0

알고쓰자

목록 보기
4/4

구글 OTP는 사용자와 서버가 공유한 비밀 키와 현재 시간을 기반으로 매 30초마다 새로운 6자리 인증 코드를 생성하여 2단계 인증을 수행하는 방식이다.

OTP는 One Time Password의 약자로 일회성 암호를 뜻하며, 구글 OTP는 TOTP(Time-based One Time Password) 알고리즘을 사용한다.

1. TOTP 기본 구성 요소

🔐 Shared Secret (비밀 키):

  • 최초 등록 시, 서버와 클라이언트(예: 스마트폰 앱)가 공유하는 비밀 키(Base32 인코딩된 문자열).
  • QR 코드(URI 형식은 아래와 같다)로 전달되며, 앱에 입력됨.

    otpauth://totp/{issuer}:{account}?secret={secret}&issuer={issuer}&algorithm=SHA1&digits=6&period=30

✅ QR코드 URI 각 구성 요소 설명

항목설명
otpauth://totp/TOTP 알고리즘 사용 명시
{issuer}:{account}앱에 표시될 서비스 이름(issuer)과 계정 식별자(account)
secret핵심! Base32 인코딩된 공유 비밀 키
issuer서비스 이름 (예: Google, Github 등)
algorithmHMAC 알고리즘 (기본: SHA1, 옵션: SHA256, SHA512)
digitsOTP 자리수 (보통 6자리)
periodOTP 갱신 주기 (기본 30초)

⏱ 시간(Time):

  • 서버와 클라이언트가 현재 시각을 기준으로 일정 주기(보통 30초)마다 새 OTP를 생성함.

🔁 TOTP 알고리즘:

  • TOTP = HOTP(K, T)
  • K: 공유된 비밀 키
  • T: 시간 단위로 카운팅된 값
  • HOTP: HMAC 기반 OTP 함수

2. 작동 순서

1. 등록 단계 (초기 설정)

  • 서버에서 사용자 전용 비밀 키(K)를 생성
  • 이 키를 QR 코드로 만들어 사용자에게 제공
  • 사용자는 Google Authenticator 앱으로 스캔해서 비밀 키를 앱에 저장

2. OTP 생성 (클라이언트 쪽)

  • 앱이 현재 시간(Unix Time)을 30초 단위로 나눠 카운터 T를 계산
    → T = floor(currentTime / 30)
  • HMAC-SHA1(K, T)을 수행하여 해시 값 생성
  • 이 해시 값을 Dynamic Truncation으로 6자리 숫자로 변환 → OTP 완성

3. 서버 인증 (서버 쪽)

  • 로그인 시 사용자가 앱에서 생성된 6자리 OTP 입력
  • 서버도 동일한 방식으로 비밀 키와 현재 시간으로 OTP를 계산
  • 입력된 OTP와 계산된 OTP를 비교

app(instagram)은 Google Authenticator에 처음 등록할 때 공유한 시크릿 키를 가지고 현재 시간을 기준으로 6자리 인증 코드를 가지게 된다.

📌 보안 주의

  • QR코드는 비밀 키를 포함하므로 절대 노출되면 안 됨!
  • 누군가 이 QR코드를 스캔하면 OTP를 동일하게 생성할 수 있어.
profile
Java 백엔드 개발자입니다. 제가 생각하는 개발자로서 가져야하는 업무적인 기본 소양과 현업에서 가지는 고민들을 같이 공유하고 소통하려고 합니다.

0개의 댓글