[HTTP] 다이제스트 인증
이 포스트는 “HTTP 완벽가이드”의 “13장, 다이제스트 인증”을 정리한 내용입니다.
- 기본 인증은 편리하고 유연하지만 안전하지 못함
- 다이제스트 인증은 기본 인증과 호환되는 대체재로서 개발
- 널리 쓰이지는 않지만 개념은 보안트랜잭션의 구현에 유용함
#다이제스트 인증의 개선점
특징
- 비밀번호를 네트워크를 통해 평문으로 전송하지 않음
- 인증 체결을 가로채서 재현하지 못함
- 구현 방법에 따라 메시지 내용 위조 방지 가능
단방향 다이제스트
- 다이제스트(요약)는 단방향 함수로 동작, 무한 가지의 모든 입력값을 유한의 범위로 압축 변환
- MD5(메시지 다이제스트 #5), SHA(Secure Hash Algorithm)…
- 요약함수는 보통 cryptographic checksums로 불림, 단반향 해시 함수이거나 fingerprint function임
재전송 방지를 위한 난스 사용
- 난스(nonce)라 불리는 자주 바뀌는 증표를 발급
- 다이제스트를 탈취하여 서버로 전송하는 해킹을 막기위한 방법
- 다이제스트는 특정 난스 값에 대해서만 유효
다이제스트 인증 핸드쉐이크
그림1. 다이제스트 인증 핸드셰이크
자료 출처:David Gourley and Brian Totty, "HTTP: The Definitive Guide (Definitive Guides)", O'Reilly, 2002
- 서버는 난스값을 계산
- 난스를 WWW-Authenticate 인증요구 메시지에 담아, 서버가 지원하는 알고리즘 목록과 함께 클라이언트에 전송
- 클라이언트는 알고리즘 선택, 비밀번호와 그 외 데이터에 대한 요약 계산
- 클라이언트는 Authorization 메시지에 요약을 담아 서버로 전송, 서버를 인증하려면 클라이언트를 난수를 보낼 수 있음
- 서버는 요약, 알고리즘, 그외 보조데이터를 받아 요약을 검증함. 클라이언트가 서버에게 인증을 요구했다면 클라이언트 요약이 만들어 클라이언트에 전송. 다음번 난스를 클라이언트에게 미리 전송하기도 함
#요약(digest) 계산
다이제스트 인증이 핵심은 공개된 정보, 비밀 정보, 시한부 난스 값을 조합한 단방한 요약
다이제스트 알고리즘의 입력 값
H(d) | 단방향 해시함수 |
KD(s,d) | 요약함수. s는 secret, d는 data를 의미 |
A1 | 비밀번호 등 보안 정보를 담고 있는 데이터 덩어리 |
A2 | 요청 메시지의 비밀이 아닌 속성을 담고 있는 데이터 덩어리 |
H(d)와 KD(s,d) 알고리즘
- RFC2617에서 제안된 알고리즘은 MD5, MD5-sess(‘sess’는 세션을 의미)
- 만약 알고리즘이 정해지지 않았다면 MD5가 기본
-
KD 요약 함수는 콜론으로 연결된 비밀 데이터와 일반데이터의 MD5를 계산
H(<데이터>) = MD5(<데이터>) KD(<비밀>,<데이터>) = H(연결(<비밀>:<데이터>)
보안 관련 데이터(A1)
-
사용자 이름, 비밀번호, 보호 영역, 난스와 같은 비밀 보호 정보로 이루어짐
MD5: A1 = <사용자>:<영역>:<비밀번호> MD5-sess: A1 = MD5(<사용자>:<영역>:<비밀번호>):<난스>:<c난스>
메시지 관련 데이터(A2)
- URL, 요청 메서드, 메시지 엔티티 본문과 같은 메시지 자체의 정보
-
qop(quality of protection)에 따라 A2의 두가지 사용법이 있음
정의되지 않음: <요청메서드>:<uri 지시자 값> auth: <요청메서드>:<uri 지시자 값> auth-int: <요청메서드>:<uri 지시자 값>
#보호수준(qop) 향상
- qop 필드는 WWW-Authenticate, Authorization, Authentication-Info에 모두 존재 가능
- qop 필드는 클라이언트와 서버가 어떤 보호 기법을 어느 정도 수준으로 사용할 수 있지 협상할 수 있게 허용
메시지 무결성 보호
- qop=”auth-int”면 메시지 무결성 보호가 적용
- auth-int의 경우 계산되는 H(엔티티 본문)은 메시지 본문의 해시가 아닌 엔티티 본문의 해시
#실제 상황에 대한 고려
다중 인증 요구
- 서버는 클라이언트에게 가능한 가능한 인증 요구를 보냄
오류 처리
- 다이제스트 인증에서, 지시자나 그 값이 적절하지 않거나 요구된 지시자가 빠진 경우 400 Bad Request가 절절한 응답임
- 인증서버는 반드시
uri
지시자가 가리키는 리소스가 요청줄에 명시된 리소스와 같음을 확인해야함
다를 경우 이는 공격의 징후일 수 있으므로 로그를 남기는 것이 좋음
#보안에 대한 고려사항
- 헤더 부당 변경
- 재전송 공격
- 다중 인증 메커니즘
- 사전(dictionary) 공격
- 악의적인 프락시와 중간자 공격
- 선택 평문 공격
- 비밀번호 저장
#다이제스트 인증 기능의 구현을 위한 지원 데이터
WWW-Authenticate 지시자들
realm | 사용자 이름과 비밀번호가 어디 사용될 것인지 알려주기 위해 사용자에게 보여질 문자열 |
nonce | 401 응답이 만들어질 때마다 유일하게 생성되어야 하는 서버에 특화된 데이터 문자열 |
domain | 보호될 공간을 정의한 따옴표로 감싸진 URI들의 공백으로 분리된 목록 |
opaque | 서버에 의해 정의된 데이터의 문자열, 클라이언트는 같은 보호 공간의 URI에 대한 다음번 요청에서 Authorizaiton 허더에 이 값을 담아 반환 |
stable | 클라이언트로부터의 이전 요청이 nonce 값이 신선하지 않아서 거부되었음을 의미하는 플래그 |
algorithm | 다이제스트와 체크섬을 생성할 때 사용하는 알고리즘, 기본 값은 MD5 |
qop | 선택적, 서버가 지원하는 보호 수준을 의미 |
Authorization 지시자들
username | 특정 realm에서의 사용자 이름 |
realm | WWW-Authenticte 헤더에 담겨 클라이언트에게 넘겨진 releam |
nonce | WWW- Authenticate 헤더에 담겨 클라이언트에게 넘겨진 nonce |
uri | 요청 URI에서의 URI, 프락시에 의해 요청이 변경될 수 있기 때문에 존재 |
response | 다이제스트 값, 사용자가 비밀번호를 알고 있음을 증명 |
algorithm | 다이제스트와 체크섬을 생성할 때 사용하는 알고리즘, 기본 값은 MD5 |
opaque | 서버에 의해 정의된 데이터의 문자열, 같은 보호 공간의 URI에 대한 다음번 요청에서 값을 그대로 넣어서 반환 |
cnonce | qop 지시자가 보내진 경우만 포함. 메시지 무결성 보호를 제공 |
qop | 클라이언트가 메세지에 적용한 “보호 수준”의 정도 |
nc | qop 지시자가 보낸 경우에만 포함. 클라이언트가 이 요청의 nonce값과 함께 보낸 요청들의 횟수 합계 |
Authentication-Info 지시자들
nextnonce | 미래의 인증 응답 시에 클라이언트가 사용해주기를 서버가 원하는 nonce |
qop | 서버에 의해 응답에 적용된 ‘보호 수준”의 정도 |
rspauth | response auth를 의미. 선택적인 응답 다이제스트가 들어있으며 이를 이용해 상호 인증을 지원 |
cnonce | 응답 대상인 클라이언트의 요청에 들어있는 값과 반드시 같아야 함 |
nc | 응답 대상인 클라이언트 요청에 들어있는 값과 반드시 같아야 함 |
#추가 정보 RFC 2617,”HTTP Authentication: Basic and Digest Access Authentication”
출처: "HTTP 완벽가이드", 이응준, 정상일 옮김, 인사이트, 2014