13장. 다이제스트(Digest) 인증

13.1. 개요

Acegi Security에는 HTTP 헤더 안에 들어있는 다이제스트 인증 신원정보를 처리할 수 있는 DigestProcessingFilter를 제공한다. 다이제스트 인증(Digest Authentication)은 구체적으로 말해 신원정보가 유선을 통해 클리어 텍스트(clear text)로 전달된 적이 없는지를 확인함으로써 Basic 인증이 가진 여러 약점들을 해결하려 한다. 다이제스트 인증을 지원하는 여러 사용자 에이전트에는 파이어폭스(FireFox)와 인터넷 익스플로러(Internet Explorer)가 포함되어 있다. HTTP 다이제스트 인증을 관장하는 표준은 RFC 2617에 정의되어 있는데, RFC 2617은 RFC 2069에 이미 기술되어 있는 다이제스트 인증 표준의 구 버전을 갱신한 것이다. 대부분의 사용자 에이전트들은 RFC 2617을 구현하고 있다. Acegi Security의 DigestProcessingFilter는 RFC 2617에 이미 기술되어 있는 "인증("auth")"에 대한 보호 품질(QOP; Quality of Protection)과 호환되며, 뿐만 아니라 RFC 2069와의 하위 호환성도 갖추고 있다. 다이제스트 인증은 여러분이 암호화되지 않은 HTTP(예를 들면, TLS/HTTPS가 아닌)를 사용하고 있으며, 인증 과정상의 보안을 최대화하고자 할 경우에 선택할 수 있는 상당히 매력적인 대안이다. 실제로 다이제스트 인증은 WebDAV 프로토콜에서는 필수적으로 지원되어야 하는 요구사항이며 RFC 2518 섹션 17.1에 지정되어 있으므로 배포되는 다이제스트 인증이 점차 늘어나 Basic 인증을 대체하는 것을 볼 수 있기를 기대한다.

비록 보안기능을 추가하는 것이 사용자 에이전트의 구현을 더 복잡하게 만드는 것을 의미하기는 하지만 폼 인증, Basic 인증, 다이제스트 인증 중에서는 말할 것도 없이 다이제스트 인증이 가장 안전한 선택이다. 다이제스트 인증의 중심에는 "비표(nonce)"가 있다. 비표는 서버가 만들어내는 값이며 Acegi Security의 비표는 다음의 형식을 도입하고 있다:

base64(expirationTime + ":" + md5Hex(expirationTime + ":" + key))
expirationTime:	비표가 폐기되는 날짜/시간이며 밀리세컨드 단위로 표현된다.
key:			비표 토큰이 변경되는 것을 방지하는 비밀 키

DigestProcessingFilterEntryPoint는 비표 토큰의 폐기시간(기본값은 300이며 5분과 같다)을 결정하는데 사용되는 nonceValiditySeconds 프로퍼티와 함께 비표 토큰을 생성하는데 사용되는 key를 지정하는 프로퍼티를 포함하고 있다. 비표가 유효하더라도 다이제스트는 사용자명, 비밀번호, 비표, 요청 URI, 클라이언트가 만들어내는 비표(각 요청에 대해 사용자 에이전트가 만들어내는 임의의 값), 영역명(realm name) 등을 포함하는 다양한 문자열을 연결한 다음, MD5 해싱을 수행하여 계산된다. 서버와 사용자 에이전트 모두 이러한 다이제스트 연산을 수행하므로 만약 포함되어 있는 값(예, 비밀번호)에 대해 서버와 사용자 에이전트가 서로 불일치할 경우 서로 다른 해시 코드가 만들어지게 된다. Acegi Security 구현체에서는 만약 서버가 만들어낸 비표가 폐기되면 (그러나 그와 달리 다이제스트는 유효할 경우), DigestProcessingFilterEntryPoint"stale=true" 헤더를 전송할 것이다. 이렇게 하는 것이 사용자 에이전트가 사용자를 방해할 필요는 없으므로(비밀번호와 사용자명 등이 적절하지 않기 때문) 단순히 새로운 비표를 이용하여 재시도하도록 알린다.

DigestProcessingFilterEntryPointnonceValiditySeconds 매개변수로 어떠한 값이 적절한지는 여러분의 애플리케이션에 달려있을 것이다. 주의할 점은 극도로 안전해야 하는 애플리케이션의 경우 가로채어진 인증 헤더가 expirationTime이 담긴 비표가 도착할 때까지 인증 주체를 사칭하는 데 사용될 수 있다는 것이다. 이것은 적절한 설정값을 선택하는데 있어 중요한 원칙이나 우선적으로 TLS/HTTPS상으로 실행되지는 않을 굉장히 안전한 애플리케이션에서는 일반적인 설정이 아닐 수도 있다.

다이제스트 인증이 좀 더 복잡한 구현체이기 때문에 종종 사용자 에이전트와 관련된 문제가 발생하곤 한다. 예를 들면 인터넷 익스플로러는 동일한 세션상의 연속적인 요청에 대한 "불투명한(opaque)" 토큰을 제시하지 못한다. 따라서 Acegi Security 필터는 대신 모든 상태 정보를 "비표(nonce)" 토큰에 캡슐화한다. 우리가 테스트했을 때 Acegi Security 구현체는 비표 시간 제한 등을 적절히 처리하는 등 파이어폭스와 인터넷 익스플로러에서 안정적으로 동작하였다.