https://drive.google.com/file/d/1hhHnFs84GNP7VrrFQ1dQisg1uk-82kZ7/view?usp=drive_link
개선점
- 비밀번호를 절대로 네트워크를 통해 평문으로 전송하지 않는다
- 인증 체결을 가로채서 재현하려는 악의적인 사람들을 차단한다
- 구현하기에 따라서, 메시지 내용 위조를 막는 것도 가능하다.
- 그 외 몇몇 잘 알려진 형태의 공격을 막는다
절대로 비밀번호를 네트워크를 통해 보내지 않는다
- 비밀번호 대신 비가역적으로 뒤섞은 ‘지문(fingerprint)’ 혹은 ‘요약(digest)’ 전송
단방향 요약
요약 = 정보 본문의 압축
- MD5 : 임의의 바이트 배열을 원래 길이와 상관없이 128비트 요약으로 변환함.
- 32글자의 16진수 문자로 표현됨.
다이제스트 인증 핸드셰이크

- 서버가 난스 값 계산
- nonce를 WWW-Authenticate 인증요구 메시지에 담아, 서버가 지원하는 알고리즘 목록과 함께 전송함.
- 클라이언트는 알고리즘을 선택하고 비밀번호와 그 외 데이터에 대한 요약을 계산함.
- Authorization 메시지에 요약을 담아 서버에게 돌려줌. 서버를 인증하길 원한다면 클라이언트 난스를 보낼 수 있음.
- 응답을 받아서, 클라이언트가 했던 그대로 요약을 계산함. 만약 클라이언트가 대칭적으로 서버에게 클라이언트 난스를 갖고 인증을 요구했다면, 클라이언트 요약이 만들어짐.
- 클라이언트가 미리 다음번 요약을 올바르게 생성할 수 있도록 다음번 난스를 미리 계산해서 클라이언트에게 넘겨줄 수도 있음.

요약 계산
H(d)와 KD(s, d) 알고리즘
H(<데이터>) = MD5(<데이터>)
KD(<비밀>, <데이터>) = H(연결(<비밀>:<데이터>)) = MD5(연결(<비밀>:<데이터>))
여러가지 요약 알고리즘 : MD5, MD5-sess
- 기본 값은 MD5
- H 함수는 데이터의 MD5를 계산하고, 요약 함수는 콜론으로 연결된 데이터의 MD5를 계산한다.
A1
사용자 이름, 비밀번호, 보호 영역, 난스와 같은 비밀 정보로만 이루어짐.
MD5 A1 = <사용자>:<영역>:<비밀번호>
MD5-sess | A1 = MD5(<사용자>:<영역>:<비밀번호>):<난스>:<c난스> |
- c난스 : 클라이언트 난스
- CPU를 많이 사용하는 해시 계산은 처음 WWW-Authenticate 핸드셰이크를 할 때 단 한번만 수행.
A2
메시지 관련 데이터
- URL, 요청 메서드, 메시지 엔터티 본문 → 메시지 자체의 정보
- 메서드, 리소스, 메시지의 위조 방지용
- qop(quality of protection) 에 따른 두 가지 사용법 - RFC 2617
- qop="auth" : HTTP 요청 메서드와 URL만 포함
- qop="auth-int" : 메시지 무결성 검사를 제공하기 위해 메시지 엔터티 본문 추가
예시
WWW-Authenticate: Digest
realm="Access to the '/' path",
nonce="e4549c0548886bc2",
algorithm="MD5"
Authorization: Digest username="jetbrains",
realm="Access to the '/' path",
nonce="e4549c0548886bc2",
uri="/",
algorithm=MD5,
response="6299988bb4f05c0d8ad44295873858cf"
The response value is generated in the following way:
a. HA1 = MD5(username:realm:password) → 클라이언트 난스는 포함 x
b. HA2 = MD5(method:digestURI) → 요청 메서드, url만 사용하는 qop="auth" 방식
c. response = MD5(HA1:nonce:HA2)
선호되는 방식
KD(H(A1), <난스>:<nc>:<c난스>:<qop>:H(A2))
다이제스트 인증 세션
어떤 보호 공간을 위한 인증요구에 대한 클라이언트 응답은, 보호 공간에 대한 인증 세션을 시작하게 함.
- 보호 공간 = 서버 루트 + 영역
- 인증 세션은 클라이언트가 보호 공간의 다른 서버로부터 또 다른 WWW-Authenticate 인증요구를 받을 때까지 지속됨.
- 난스 만료 시 서버는 감수하고 받아들이거나, 401 응답을 새 난스 값과 함께 반환할 수도 있음.
- stale=true : 클라이언트에게 사용자 이름과 비밀번호를 새로 입력하도록 창을 띄울 필요 없이 새 난스 값으로 요청을 다시 보내라고 말해줄 수 있음
사전 인가
클라이언트가 인증요구 요청을 받기 전에 Authorization 헤더를 계산할 수 있다면 요청/인증요구 단계를 거치지 않고 미리 헤더를 서버에 제공 가능함.
- 서버는 임의 난스를 생성하기 때문에, 인증요구를 받기 전에는 무엇이 올바른 Authorization 헤더인지 알 수 없음
- 다음 난스 미리 생성
- 파이프라이닝 능력이 실질적으로 쓸모없어짐
- 회전 지연 회피를 위한 기반 기술 → 성능상 불이익이 커짐
- Authentication-Info: nextnonce="<난스 값>"
- 제한된 난스 재사용
- 한 난스를 다섯 번 혹은 10초간 재사용 허락
- 파이프라이닝 가능
- 난스가 만료 → 401 Unauthorized 인증 요구 전송
WWW-Authenticate: Digest realm="<영역 값>" nonce="<난스 값>" stale=true
- 난스를 재사용하면 공격자의 재전송 공격이 성공하기 쉬워짐 → 보안성 감소
- 참고- stale은 신선하지 않다는 의미
- 동기화된 난스 생성
제3자가 예측할 수 없는 공유된 비밀키에 기반하면서 클, 서가 순차적으로 같은 난스를 생성할 수 있도록 시간적으로 동기화된 난스 생성 알고리즘 사용
- 다이제스트 인증 명세의 범위를 넘어섬
난스 선택
가상의 난스 공식 ⬇️
BASE64(타임스탬프 H(타임스탬프 ":" ETag ":" 개인키))
- ETag : 요청된 엔티티에 대한 etag 헤더 값
- 개인키는 서버만이 알고 있는 값
- 위의 공식에서 hash 부분을 재계산해보고 클라이언트 인증 헤더의 난스와 일치하지 않거나, 타임스탬프가 오래되었다면 요청 거절 → 난스의 유효 기간 제한 가능
상호 인증
클라이언트가 서버를 인증할 수 있도록 다이제스트 인증 확장
- 서버가 공유된 비밀 정보에 근거한 올바른 응답 요약을 생성할 수 있도록 c난스값 제공
- A2가 다름 → 응답엔 HTTP 메서드 x, 응답 엔티티 본문이 다름
보호 수준 향상 Quality of Protection
qop 필드 : 클라이언트와 서버가 어떤 보호 기법을 어느 정도 수준으로 사용할 것인지 협상할 수 있게 해줌
auth-init
H(엔티티 본문)는, 메시지 본문의 해시가 아닌 엔티티 본문의 해시.
- 송신자에 의해 어떠한 전송 인코딩이 적용되기도 전에 먼저 계산되고, 그 후 수신자에 의해 제거됨
다이제스트 인증 헤더
공통 헤더 : WWW-Authenticate(인증요구), Authorization(응답)
다이제스트 : Authentication-Info : 3단계 핸드셰이크를 완성하고 다음번 사용할 난스를 전달하기 위해 인증 성공 후에 전송됨.
실제 고려할 사항
보호 공간
- domain 필드는 작은따옴표로 묶인 URI의 공백으로 분리된 목록임.
- 이 목록의 모든 URI와 논리적으로 그 하위에 위치한 모든 URI는 같은 보호 공간에 있는 것으로 가정함.
- 만약 domian 필드가 없거나 빈 값이면, 인증을 요구하는 서버의 모든 URI는 그 보호공간에 있는 것.
캐시
Cache-Control 지시자 중 하나가 응답에 존재하지 않는 한 다른 요청에 대해 그 응답을 반환해서는 안됨.
Cache-Control: must-revalidate 응답의 엔티티를 다음 요청에 대한 응답을 위해 활용할 것. 그러나 원 서버가 새 요청을 인증할 수 있도록, 우선 그 요청의 헤더를 이용해서 재검사를 수행해야 함.
Cache-Control: public | 응답 엔티티는 그다음에 오는 임의의 요청에 대한 응답으로 반환될 수 있음. |
*private cache : 웹 브라우저에 저장되는 캐시, 다른 사람 접근 불가능. 단, 서버 응답에 Authorization 헤더 포함 시 저장 x
선택 평문 공격
- 많은 수의 평문을 암호문으로 만들 수 있는 상태
- 평문을 선택해서 해당 평문을 암호문으로 만들 수 있는 상태
- 공개키는 알려져 있으므로, 공격자가 공개키를 가지고 임의 평문을 가지고 암호화해서 암호문을 얻기 쉬움
- ㄴ→ 공격 유리 : 공개키 성능 안전 평가 기준이 됨(공개키는 언제나 공격 당할 수 있음)
'HTTP' 카테고리의 다른 글
HTTP 완벽 가이드 (15) (0) | 2025.03.15 |
---|---|
HTTP 완벽 가이드 (14) (0) | 2025.03.15 |
HTTP 완벽 가이드 (12) (0) | 2025.03.15 |
HTTP 완벽 가이드 (11) : 클라이언트 식별과 쿠키 (0) | 2025.03.15 |
HTTP 완벽 가이드 스터디 (10) (0) | 2025.03.15 |