반응형
작성일: 2024년 7월 30일

 

금융 거래를 하거나 중요한 시스템에 로그인할 때 OTP(One Time Pasword)를 종종 사용한다.

OTP를 사용하는 사람은 OTP의 동작 원리를 몰라도 문제가 없지만,

사용자 인증 시스템을 개발/구현하는 사람은 OTP의 동작 원리를 잘 알아야 한다.

 

IETF RFC 문서에 명확하게 OTP(HOTP, TOTP)에 관해서 기술하고 있기 때문에 RFP 문서를 읽는 것이 제일 확인한 스터디 방법이다.

 

 

ICT 분야에서는 어떤 공부를 하든 RFC를 먼저 열람하는 것이 제일 확실하다.
괜히 어설프게 인터넷에 떠도는 자료를 읽고 공부하다보면 나중에 업무할 때 논쟁거리를 만들게 되니까 ^^
예를 들어서, TOTP에 관해서 연동 블록 개발자간 박터지게 싸웠는데 그 중에서 한명이 인터넷에 떠도는 사이비 문서를 읽고 말싸움을 한 것이라면 얼마나 쪽팔리겠는가.
(솔직히, 이런 경우에 쪽팔려하는 개발자라면 발전할 가능성이라도 있지만, 그냥 모르는 것을 모르는대로 넘어간다면 영원히 사이비 개발자로 남을 것이다)

 

IETF RFC 문서에 너무 명확하고 쉽게 설명이 있으니까, 여기서 그 내용을 중복으로 설명할 필요는 없을 것 같고...

그냥 어떤 문서를 읽고, 어떤 예제 소스 코드를 보면 좋은지 정도만 이 블로그에서 설명하도록 하겠다.

 

OTP는 HOTP(HMAC-Based One-Time Password)와 TOTP(Time-Based One-Time Password)로 구분해서 구현할 수 있다.

IETF에서 표준이 된 순서로 본다면, HOTP -> TOTP이다.

즉, 동일한 인증 기술의 구현이라는 목표를 가지고

  • HOTP가 2005년 12월에 표준이 되었고
  • TOTP가 2011년 05월에 표준이 되었다.

IETF RFC 문서 정보

HOTP:  https://datatracker.ietf.org/doc/html/rfc4226  (2005년 12월 표준 확정)

TOTP:  https://datatracker.ietf.org/doc/html/rfc6238   (2011년 05월 표준 확정)

 

대부분의 기술이 그렇듯이 동일한 목적을 두고 개발된 기술이라면, 뒤에 개발된 기술(표준안)이 더 좋은 것이다.

설계/개발(구현)에 많은 시간을 투자할 상황이 아니라면 TOTP만 고려해도 별 문제 없다는 뜻이다.

그리고 두 가지 OTP에 대한 RFC를 잘 읽어보면, HOTP와 TOTP가 비슷해서 TOTP로 인증 체계를 구현하고 나면 나중에 HOTP를 추가로 기능 추가해도 큰 공수가 들어가지 않는다.

 

 

OTP, HOTP, TOTP 예제 소스 코드  (Java)

위 IETF RFC 문서의 뒷 부분에 JAVA로 구현된 예제 소스 코드가 있다.

논리적인 pseudocode가 아니라 실제로 동작하는 Java 소스 코드이다.

(실제로 문서에 있는 소스 코드를 복사해서 터미널에 붙여서 javac로 컴파일하고, java runtime으로 돌려봤는데 아주 깔끔하게 동작한다)

그리고 RFC 문서에 있는 동일한 Java 코드가 Github에도 있다.

 

Github 주소:  https://github.com/gityf/java_demo/blob/master/demo/src/main/java/org/wyf/otp/TOTP.java 

 

`git clone ....`해서 돌려봤는데, 깔끔하게 잘 돌아간다 ^^

 

 

 

OTP, HOTP, TOTP 예제 소스 코드  (Go)

Go 언어로 구현 및 테스트해보고 싶다면, 아래의 Go source code를 추천한다.

 

Github 주소:  https://github.com/pquerna/otp

 

이 Go 패키지는 재미있게도 QR-code를 이용해서 OTP 값을 출력해준다.

스마트폰으로 QR-code를 찍어서 스마트폰 화면에 보이는 숫자를 iTerm 터미널에 입력하면 OTP를 이용한 인증 통과 여부를 알려준다.

 

 

Python에서는 OTP 인증 코드를 작성하기가 더 쉽다.

아래 python document를 보면서 따라하면 끝 ^^

https://pyauth.github.io/pyotp/

 

 


 

+ Recent posts