{{위키데이터 속성 추적}}
'''시간 기반 일회용 비밀번호'''({{lang|en|Time-based one-time password}}, '''TOTP''')는 현재 시간을 고유성의 원천으로 사용하여 [[일회용 비밀번호]] (OTP)를 생성하는 [[컴퓨터 알고리즘]]이다. [[HMAC 기반 일회용 비밀번호 알고리즘]] (HOTP)의 확장으로 [[국제 인터넷 표준화 기구]] (IETF) 표준 {{IETF RFC|6238}}로 채택되었다.<ref name="RFC6238">{{웹 인용|url=https://tools.ietf.org/html/rfc6238|title=RFC 6238 – TOTP: Time-Based One-Time Password Algorithm|access-date=July 13, 2011|archive-date=July 11, 2011|archive-url=https://web.archive.org/web/20110711124823/http://tools.ietf.org/html/rfc6238|url-status=live}}</ref>

TOTP는 [[개방형 인증 이니셔티브]] (OATH)의 초석이며, 다수의 [[2요소 인증]] 시스템에 사용된다.

== 역사 ==

여러 OATH 회원들의 협력을 통해 업계에서 지원하는 표준을 만들기 위해 TOTP 초안이 개발되었습니다. 이벤트 기반 일회성 표준 HOTP를 보완하고 최종 사용자 조직과 기업이 애플리케이션 요구 사항 및 [[보안]] 지침에 가장 적합한 기술을 선택할 수 있는 더 많은 선택권을 제공한다. 2008년, OATH는 IETF에 이 규격의 초안을 제출했다. 이 버전은 IETF에 제출된 이전 버전에 기초하여 저자가 기술 공동체로부터 받은 모든 피드백과 논평을 통합한다.<ref>{{웹 인용|url=http://www.openauthentication.org/news/20080408|title=OATH Submits TOTP: Time-Based One Time Password Specification to IETF|last=Alexander|first=Madison|work=Open Authentication|access-date=22 February 2010|archive-date=23 January 2013|archive-url=https://www.webcitation.org/6DtdCt3JN?url=http://www.openauthentication.org/news/20080408|url-status=live}}</ref> 2011년 5월에 TOTP는 공식적으로 [[RFC]] 6238이 되었다.<ref name="RFC6238" />

== 알고리즘 ==

TOTP 인증을 설정하려면 인증기와 피인증자가 HOTP 매개 변수와 TOTP 매개 변수를 모두 미리 설정해야 한다:
* ''T''{{sub|0}}, 시간 간격 카운트가 시작될 [[유닉스 시간]] (기본값은 0),
* ''T{{sub|X}}'', ''C{{sub|T}}'' 카운터 값을 계산하는 데 사용되는 간격 (기본값은 30초).

인증기와 피인증자는 모두 TOTP 값을 계산한 다음 피인증자가 제공한 TOTP 값이 로컬에서 생성된 TOTP 값과 일치하는지 확인한다. 몇몇 인증기는 약간의 [[클럭 스큐]], 네트워크 지연 및 사용자 지연을 고려하기 위해 현재 시간 이전 또는 이후에 생성되어야 하는 값을 허용한다.

TOTP는 HOTP 알고리즘을 사용하여 카운터를 현재 시간을 기준으로 감소하지 않는 값으로 바꾼다:

TOTP 값(''K'') = [[HMAC 기반 일회용 비밀번호 알고리즘#정의|HOTP 값]](''K'', ''C{{sub|T}}''),

카운터 값 계산

<math display="block">C_T = \left\lfloor\frac{T - T_0}{T_X}\right\rfloor,</math>

여기에서
* ''C{{sub|T}}'' is the count of the number of durations ''T{{sub|X}}'' between ''T''{{sub|0}} and ''T'',
* ''T'' is the current time in seconds since a particular [[epoch]],
* ''T''{{sub|0}} is the epoch as specified in seconds since the [[Unix epoch]] (e.g. if using [[Unix time]], then ''T''{{sub|0}} is 0),
* ''T{{sub|X}}'' is the length of one time duration (e.g. 30 seconds).

유닉스 시간은 엄격하게 증가하지 않는다. UTC에 [[윤초]]가 삽입되면 유닉스 시간은 1초를 반복한다. 그러나 한번의 윤초는 유닉스 시간의 [[바닥 함수|정수 부분]]을 감소시키지 않으며, ''T{{sub|X}}''가 1초의 배수인 한 ''C{{sub|T}}''도 감소하지 않는다.

== 보안성 ==

TOTP 값은 [[비밀번호]]처럼 [[피싱]]될 수 있지만, 이를 위해서는 공격자가 실시간으로 자격 증명을 프록시해야 한다.<ref>{{웹 인용|last=Umawing|first=Jovi|date=21 January 2019|access-date=9 August 2020|title=Has two-factor authentication been defeated? A spotlight on 2FA's latest challenge|url=https://blog.malwarebytes.com/cybercrime/2019/01/two-factor-authentication-defeated-spotlight-2fas-latest-challenge/|website=Malwarebytes Labs|language=en-US|archive-date=25 September 2020|archive-url=https://web.archive.org/web/20200925082641/https://blog.malwarebytes.com/cybercrime/2019/01/two-factor-authentication-defeated-spotlight-2fas-latest-challenge/|url-status=live}}</ref>

공유 비밀번호를 도용한 공격자는 원하는 대로 유효한 새 TOTP 값을 생성할 수 있다. 이것은 공격자가 대규모 인증 데이터베이스를 위반하는 경우 특히 문제가 될 수 있다.<ref>{{뉴스 인용|url=https://www.wired.com/2011/06/rsa-replaces-securid-tokens/|title=RSA Agrees to Replace Security Tokens After Admitting Compromise|last=Zetter|first=Kim|newspaper=WIRED|access-date=17 February 2017|language=en-US|archive-date=12 November 2020|archive-url=https://web.archive.org/web/20201112032021/https://www.wired.com/2011/06/rsa-replaces-securid-tokens/|url-status=live}}</ref>

네트워크와 사람 모두의 [[레이턴시]], [[시간 동기화|동기화되지 않은 시계]]로 인해 일회용 비밀번호는 [[인증기]]와 피인증자 사이의 시간 범위에 걸쳐 유효성을 검사해야 한다. 여기에서 시간은 당사자 간의 유효성을 허용하기 위해 더 큰 기간(예: 30초)으로 다운샘플링된다. 후속 인증이 작동하려면 피인증자와 인증기의 시계를 대략적으로 동기화해야 한다(인증기는 일반적으로 피인증자의 타임스탬프와 ±1 시간 간격이 다른 타임스탬프에서 생성된 1회용 암호를 수락한다).<ref name="RFC6238"/> TOTP 값은 일반적으로 30초 이상 유효하므로 클라이언트 및 서버 시간 지연이 고려된다.<ref name="RFC6238"/>

== 같이 보기 ==
* [[Botan]]
* [[FreeOTP]]
* [[Google Authenticator]]
* [[multiOTP]]

== 각주 ==

{{refs}}

== 외부 링크 ==
* [https://nbviewer.jupyter.org/github/algorithmic-space/cryptoy/blob/master/rfc6238.ipynb Step by step Python implementation in a Jupyter Notebook] {{웨이백|url=https://nbviewer.jupyter.org/github/algorithmic-space/cryptoy/blob/master/rfc6238.ipynb |date=20190406214815 }}
* [https://www.docker.com/blog/designing-docker-hub-2fa/ Designing Docker Hub Two-Factor Authentication], (section "Using Time-Based One-Time Password (TOTP) Authentication").

[[분류:인터넷 프로토콜]]
[[분류:컴퓨터 접근 제어]]
[[분류:암호 알고리즘]]