본문 바로가기

IT/Internet

OTP 토큰 백업과 복원

OTP를 사용하다가 휴대폰을 교체하거나 초기화할 경우, OTP토큰 재발급 신청을 해야한다.

왜 OTP는 기본적으로 백업이 (잘) 안되는지 알아보고, 백업/복원 방법을 알아보자.

  

OTP 유형 

먼저 OTP 방식에 대한 이해가 필요하다. OTP 방식은 다음과 같이 HOTP / TOTP 두 가지 방식이 있다. 

HOTP (HMAC-based One-Time Password) 
이벤트 기반 일회용 비밀번호. 따라서 Event-based OTP 라고도 불린다. 
Seed 라고 하는 비밀키와 이벤트 기반의 카운터로 키가 생성된다.  
TOTP (Time-based One-Time Password) 
시간 기반 일회용 비밀번호. 
HOTP를 기반으로 하고 있지만 이벤트 대신 시간을 기반으로 키를 생성한다. 
보통 타임스탬프는 30초에서 60초. 

쉽게 말해서 OTP를 등록했을 때, 생성된 키의 유효기간이 없다면 그 키는 HOTP 방식이다.   

  

 

안전성 비교 

HOTP/TOTP 둘 다 일회용 비밀번호를 생성하는 것은 동일하지만,  HOTP는 한 번 생성된 키가 사용될 때까지 (or 다음 키가 생성될 때까지) 키가 유효한 반면 TOTP는 시간이 지나면 무효처리 된다.

따라서 당연히 TOTP가 더 안전한 방법이다.

  

HOTP 형태 

HOTP 토큰의 URL은 다음과 같다.  

otpauth://hotp/XXXXX:XXXXX?secret=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&issuer=XXXXXX&counter=0

 

 

OTP 앱에서 비밀번호를 생성하면 제일 마지막의 counter=0 이 숫자가 1, 2, 3 증가하게 된다. 

 counter는 OTP 생성기 (Google OTP 등) 쪽만 증가하고, 해당 키를 이용해서 서버에서 인증을 받으면 그 때 비로소 서버 쪽도 카운터가 증가하게 된다.  

즉, 서버와 클라이언트가 서로 통신할 필요가 없기 때문에 Google OTP 앱 설명에 "데이터 연결 없이도 인증 코드 생성" 이라는 설명이 존재하는 것이다. 

  

만약 사용자가 키를 2번 생성한다면 클라이언트의 카운터는 2가 증가하지만 서버는 그대로이므로 HOTP는 클라이언트와 서버의 카운터에 어느정도 오차가 발생할 가능성이 항상 존재한다. 

그래서 오차 범위를 어느정도 커버할 수 있도록 되어 있는데, 만약 이 허용 가능 범위를 넘어가게 되면 그 때는 클라이언트와 서버의 카운터 재동기화가 필요한 상황이 된다.  

 

HOTP 백업 

OTP앱 중 백업/복원을 지원하는 앱들이 몇몇 있지만 실제로 백업/복원을 해보면 HOTP 방식은 제대로 동작하지 않는 경우가 많다.  

그건 앱의 문제가 아니라 사용자의 잘못된 사용 방법 때문인데, 동작하지 않는 시나리오는 다음과 같다. 

흐름 
사용자 액션 
클라이언트 카운터 
서버 카운터 
로그인 
1 
OTP 토큰 백업 
counter = 2 
counter = 2 
pass 
2 
OTP 사용 
counter = 3
counter = ...
counter
 = 34
counter = 3
counter = ...
counter
 = 34
pass 
3 
휴대폰 초기화 
  
  
  
4 
OTP 토큰 복원 
counter = 2 
counter = 34 
fail 

사용자가 토큰 백업 후, OTP를 계속 사용하게 되면 counter 가 계속 증가하기 때문에 백업본의 카운터가 서버 카운터보다 훨씬 작아지면서 오차 범위를 넘어서므로 로그인을 할 수 없게 된다.

그러므로 OTP 백업 후에는 OTP 복원 전까지 counter를 증가시켜서는 안된다.

 

반면 TOTP의 경우에는 백업/복원에 이슈가 없다. 키 생성에 사용되는 카운터가 시간이기 때문이다.

서버와 클라이언트가 Google NTP 를 통해 시간 동기화만 되면 늘 카운터가 일치하기 때문에 어긋날 염려가 없다. 

  

 

만약 OTP를 PC 1대에서만 사용한다면, 매번 휴대폰을 꺼내서 OTP 패스워드를 생성하는 대신 해당 PC에서 바로 OTP 패스워드를 생성하면 더 편리할 것이다.

크롬 확장앱 중 Authenticator 라는 앱이 있는데 크롬 브라우저에 OTP 생성기를 확장앱으로 추가할 수 있다.

무료이고 매우 편리하며 강력한 기능을 가지고 있다.