HTTP

HTTP 완벽 가이드 (13)

kchabin 2025. 3. 15. 13:57

https://drive.google.com/file/d/1hhHnFs84GNP7VrrFQ1dQisg1uk-82kZ7/view?usp=drive_link

개선점

  • 비밀번호를 절대로 네트워크를 통해 평문으로 전송하지 않는다
  • 인증 체결을 가로채서 재현하려는 악의적인 사람들을 차단한다
  • 구현하기에 따라서, 메시지 내용 위조를 막는 것도 가능하다.
  • 그 외 몇몇 잘 알려진 형태의 공격을 막는다

절대로 비밀번호를 네트워크를 통해 보내지 않는다

  • 비밀번호 대신 비가역적으로 뒤섞은 ‘지문(fingerprint)’ 혹은 ‘요약(digest)’ 전송

단방향 요약

요약 = 정보 본문의 압축

  • MD5 : 임의의 바이트 배열을 원래 길이와 상관없이 128비트 요약으로 변환함.
  • 32글자의 16진수 문자로 표현됨.

 

다이제스트 인증 핸드셰이크

 

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

출처: https://ssup2.github.io/blog-software/docs/theory-analysis/http-digest-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 헤더인지 알 수 없음
  1. 다음 난스 미리 생성
    • 파이프라이닝 능력이 실질적으로 쓸모없어짐
    • 회전 지연 회피를 위한 기반 기술 → 성능상 불이익이 커짐
  2. Authentication-Info: nextnonce="<난스 값>"
  3. 제한된 난스 재사용
    • 한 난스를 다섯 번 혹은 10초간 재사용 허락
    • 파이프라이닝 가능
    • 난스가 만료 → 401 Unauthorized 인증 요구 전송
    WWW-Authenticate: Digest
    	realm="<영역 값>"
    	nonce="<난스 값>"
    	stale=true
    
    • 난스를 재사용하면 공격자의 재전송 공격이 성공하기 쉬워짐 → 보안성 감소
    • 참고- stale은 신선하지 않다는 의미
  4. 동기화된 난스 생성

제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