Challenge-Response 인증 메커니즘과 보안 설계
Challenge-Response 인증의 동작 원리와 암호화·해시·TOTP 구현, Kerberos·TLS·스마트카드 적용 및 보안 강화 방식을 정리한다.
2026-08-14 · 최초 발행 2025-06-15
비밀을 보내지 않고 응답으로 증명하는 인증
Challenge-Response는 단순 비밀번호 인증의 약점을 보완하기 위한 인증 메커니즘이다. 서버가 클라이언트에 챌린지(Challenge)를 제시하면, 클라이언트는 개인키나 비밀번호 같은 비밀 정보와 이를 결합해 응답(Response)을 만든다. 서버는 그 응답을 확인해 인증 여부를 결정한다.
핵심은 비밀번호나 키 자체가 네트워크를 건너지 않는다는 점이다. 이 특성은 도청과 중간자 공격에 대한 내성을 높이는 기반이 된다.
챌린지와 응답을 만드는 방식
암호화 기반 응답 검증
가장 일반적인 형태에서는 서버가 무작위 값인 nonce를 클라이언트에 보낸다. 클라이언트는 nonce를 자신의 비밀키로 암호화해 반환하고, 서버는 클라이언트의 공개키 또는 저장된 비밀키로 결과를 검증한다.
# 서버 측
import os
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives import hashes
def generate_challenge():
return os.urandom(32) # 256비트 랜덤 값 생성
def verify_response(challenge, response, public_key):
try:
recovered_challenge = public_key.decrypt(
response,
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None
)
)
return recovered_challenge == challenge
except:
return False
해시로 비밀번호를 직접 노출하지 않는 방법
비밀번호 기반 시스템에서는 nonce와 비밀번호를 결합한 뒤 해시 값을 응답으로 사용할 수 있다. 서버는 저장된 사용자 비밀번호에 같은 nonce를 적용해 해시를 계산하고, 수신한 값과 비교한다.
시간이 챌린지가 되는 TOTP
시간 기반 일회용 비밀번호(TOTP)는 시간 동기화를 활용하는 Challenge-Response 변형으로 볼 수 있다. 명시적인 챌린지를 주고받지는 않지만, 현재 시간이 암묵적인 챌린지 역할을 한다. 클라이언트와 서버는 같은 비밀키와 현재 시간을 바탕으로 일회용 코드를 만들며, 두 코드가 일치하면 인증이 성공한다.
인증 시스템에서의 적용 모습
Kerberos는 Challenge-Response 방식을 사용하는 대표적인 네트워크 인증 프로토콜이다. 클라이언트는 인증 서버(AS)에 티켓 부여 티켓(TGT)을 요청하고, AS는 클라이언트 신원을 확인한 뒤 TGT를 발급한다. 클라이언트는 TGT를 이용해 서비스 접근을 요청하며, 티켓 부여 서버(TGS)는 서비스 접근용 티켓을 발급한다. 이후 클라이언트는 그 티켓으로 서비스를 이용한다.
SSL/TLS 핸드셰이크에서도 Challenge-Response 메커니즘을 찾을 수 있다. 서버는 클라이언트에 무작위 값인 ServerHello.random을 보내고, 클라이언트 역시 ClientHello.random을 서버에 보낸다. 양측은 이 값들과 사전에 합의된 비밀인 Pre-Master Secret을 조합해 세션 키를 만들고, 이 세션 키로 통신을 암호화한다.
스마트카드 인증도 같은 구조를 활용한다. 카드 리더가 스마트카드에 무작위 챌린지를 보내면, 카드는 내장된 개인키로 챌린지에 서명해 응답한다. 리더는 카드의 공개키로 이를 검증한다. 카드 복제가 어렵고 비밀키가 외부에 노출되지 않는 것이 이 방식의 장점이다.
응답 재사용과 중간자 공격을 줄이는 조건
기본적인 Challenge-Response만으로는 중간자 공격에 취약할 수 있다. 인증과 전송 채널을 연결하는 채널 바인딩(Channel Binding), 클라이언트가 서버 신원까지 확인하는 상호 인증(Mutual Authentication), 응답 시간에 제한을 두는 시간 제한(Time Constraints)은 중간자 공격과 응답 재사용 공격을 방지하는 데 사용된다.
챌린지의 무작위성도 보안 강도에 직접 영향을 준다. 충분히 긴 비트 길이의 무작위 값은 최소 128비트 이상으로 사용하고, 암호학적으로 안전한 난수 생성기(CSPRNG)를 활용한다. nonce와 타임스탬프를 함께 사용하면 재전송 공격 방지에도 도움이 된다.
제로 지식 증명(Zero-Knowledge Proof)을 통합하는 방식도 있다. 이 경우 클라이언트는 비밀 정보를 알고 있다는 사실만 증명하고 실제 비밀은 공개하지 않는다. zk-SNARK, zk-STARK 등의 고급 암호학적 기법을 활용할 수 있다.
선택할 때 함께 봐야 할 제약
Challenge-Response는 실제 비밀키나 비밀번호를 네트워크로 전송하지 않으며, 매번 다른 챌린지를 사용하므로 이전 인증 세션을 재사용하기 어렵다. 비밀번호 같은 지식 요소, 토큰 같은 소유 요소, 생체 정보까지 결합할 수 있고, 여러 인증 단계를 조합한 다중 인증도 구현할 수 있다.
대신 단순 비밀번호 인증보다 구현이 복잡하고 암호화 연산에 따른 계산 부하가 발생한다. TOTP처럼 시간 동기화가 필요한 구현도 있으며, 복잡한 인증 과정은 사용자 경험을 저하시킬 수 있다.
IoT, 모바일 결제, 원격 접속처럼 보안이 중요한 환경에서는 단순 비밀번호 인증을 넘어 Challenge-Response 기반 인증 체계를 고려할 수 있다. 제로 지식 증명과 양자 내성 암호화를 활용한 더 강력한 Challenge-Response 메커니즘도 계속 발전할 전망이다.