One Time Password, OTP
목차
1. 정의
OTP(One-Time Password)는 한 번만 사용하도록 설계된 비밀번호(또는 인증 코드) 를 의미한다. 일반적으로 다음과 같은 이름으로도 불린다.
- 일회용 비밀번호(One-Time Password/PIN, OTP)
- 일회용 인증번호(One-Time Authorization Code, OTAC)
- 동적 암호(Dynamic Password)
OTP는 매번 바뀌는 값을 만들어 내는 인증 방식이며, 사용자와 서버가 사전에 공유한 비밀 값(Seed/Key) 을 기반으로 동작한다. 시스템은 이 비밀 값에 시간(Time Stamp) 또는 카운터(Counter) 같은 변하는 입력을 결합해, 그 시점(또는 그 순번)에서만 유효한 코드를 생성한다. 즉, 매 요청마다 동일한 비밀을 직접 전송하는 대신, 그 비밀로부터 “지금 이 순간에만 맞는 코드”를 생성해 인증에 사용한다. 한 번 사용된 코드는 재사용이 어렵고 유효 시간이 짧기 때문에 재사용 공격(Replay Attack) 에 상대적으로 강한 편이다.
2. 특징
- 일회성: 생성된 비밀번호는 단 한 번만 사용 가능하며, 이후에는 무효화된다.
- 시간 또는 사용 제한: 일정 시간이 지나거나 사용 후 자동으로 만료된다.
- 무작위성: 고유 알고리즘으로 무작위로 생성되며, 예측이 어렵다.
- 추가 보안 계층: 고정된 비밀번호 외에도 추가 인증 요소로 사용되어 보안을 강화한다.
3. 장점
- 높은 보안성: 일회성으로 비밀번호 유출 위험을 최소화한다.
- 다양한 응용 가능성: 로그인, 은행 거래, 데이터 접근 등 다양한 상황에서 사용 가능하다.
- 예측 불가능성: 무작위 생성으로 인해 공격자가 OTP를 추측하기 어렵다.
- 다중 인증(MFA) 구현: OTP를 기존 비밀번호와 결합해 이중 보안 계층을 제공할 수 있다.
4. 단점
- 의존성: SMS나 이메일 기반 OTP는 네트워크나 서버에 의존적이다.
- 전송 지연: SMS 전송 지연으로 인해 인증이 실패할 가능성이 있다.
- 도난 가능성: 하드웨어 토큰 도난 또는 SMS 스니핑 공격 위험이 있다.
- 사용자 경험 저하: OTP 입력은 번거로울 수 있어 사용자 편의성이 떨어질 수 있다.
5. 동작 방식
출처: Tistory: OTP의 동작 원리, HOTP와 TOTP 이해하기
- 비밀키 생성
- 사용자와 시스템 간 공유되는 비밀키를 생성한다.
- 시간 정보 또는 카운터 사용
- TOTP: 특정 시간(예: 1분)마다 새로운 OTP를 생성한다. 시간 정보와 비밀키를 조합해 OTP를 계산한다.
- HOTP: 사용자의 세션 또는 이벤트가 발생할 때마다 새로운 OTP를 생성한다. 일정한 카운터와 비밀키를 조합해 OTP를 계산한다.
- OTP 생성
- OTP 전달
- 사용자에게 생성된 OTP를 안전하게 전달한다.
- 일반적으로 모바일 앱(예: Google Authenticator)를 통해 QR 코드를 스캔하거나, 텍스트 형식의 OTP를 입력하도록 유도한다.
- OTP 검증
- 사용자가 입력한 OTP와 시스템에서 생성한 OTP 를 비교해 일치 여부를 확인한다.
- 인증 결과
- OTP가 일치하면 인증이 성공하고 사용자에게 접근을 허용한다.
- OTP가 불일치하면 인증이 실패하고 접근을 거부한다.
6. 인증 방식
6.1. S/KEY OTP
S/KEY OTP는 해시 함수를 연쇄 적용한 값(Lamport 해시 체인) 을 역순으로 한 번씩 제출해 인증하는 방식으로, 매번 값이 소모되어 재사용이 불가능하다.
출처: Tistory: OTP (One Time Password) 인증
- 클라이언트 A : 임의의 비밀키를 서버로 전송한다.
- 서버 S : 클라이언트 A로부터 받은 비밀키를 첫 값으로 사용하여, 해시 체인 방식으로, 이전 결과 값에 대한 해시 값을 구하는 작업을 n번 반복한다.
- 해시 체인 방식 : 해시된 값에 다시 해시함수를 반복적으로 적용하는 것이다. (예, H(H(s)))
- 서버 S : 생성된 $n$ 개의 클라이언트 인증키를 서버에 저장한다.
또한 이를 통해, 클라이언트에서 i번째로 서버에 인증을 요구할 때의 인증 방식은 아래와 같다.
- 클라이언트 A : 클라이언트에서 정한 최초의 비밀키에 해시 함수를 $n-i$ 번 중첩 적용하여 서버로 전송한다.
- 서버 S : 클라이언트로부터 받은 값에 해시 함수를 한 번 적용한다. 그 결과가 서버에 저장된 $n-i+1$ 번째 해시값(인증키)와 일치하는지 검사한다.
- 일치하면 인증에 성공한 것으로, 카운트($i$)를 1 증가시킨다.
6.2. Time-based OTP
Time-based OTP(TOTP)는 현재 시간(고정된 시간 간격) 을 입력으로 사용해 공유 비밀키로 OTP를 생성하며, 짧은 유효시간 내에서만 인증되는 방식이다.
- 클라이언트 : OTP 토큰 내부의 자체 시간 정보를 이용해서 OTP를 생성한다.
- 클라이언트 : 생성된 OTP값을 입력한다. OTP 값을 웹서버로 전달한다.
- 웹서버 : OTP를 인증 서버로 검증요청한다.
- 인증서버 : 서버의 자체 시간 정보를 이용해서 OTP를 생성하고 검증한다.
- 인증서버 및 웹서버 : OTP 검증 결과를 전송한다.
6.3. Challenge-Response OTP
Challenge-Response OTP는 서버가 제시한 난수(Challenge) 에 대해 사용자가 공유 비밀키로 일회성 응답(Response) 을 계산해 제출함으로써 인증하는 방식이다.
- 인증서버 : 시도 값을 생성한다.
- 인증서버 및 웹서버 : 생성된 시도 값을 전달한다.
- 클라이언트 : 시도 값을 이용해서 OTP를 생성한다.
- 클라이언트 : 생성된 OTP를 입력한다. OTP를 웹서버에 전달한다.
- 웹서버 : OTP 인증 서버로 검증을 요청한다.
- 인증서버 : 시도 값을 이용해서 OTP를 생성하고 검증한다.
- 인증버서 및 웹서버 : OTP 검증 결과를 전송한다.
6.4. Event-Synchronous OTP
Event-Synchronous OTP는 시간 대신 이벤트/카운터(예: 버튼 누름, 로그인 시도 횟수) 를 기준으로 OTP를 생성하고, 사용자·서버의 카운터가 동기화되어 있을 때만 인증되는 방식이다.
- 클라이언트 : 토큰 내부의 이벤트 정보를 이용해서 OTP를 생성한다.
- 클라이언트 : 생성된 OTP 값을 입력한다.
- 웹서버 : OTP 인증 서버로 검증요청한다.
- 인증서버: 서버의 자체 이벤트 정보를 이용해서 OTP를 생성하고 검증한다.
- 인증서버 및 웹서버 : OTP 검증 결과를 전송한다.
출처:
출처:
Comments