HTTP는 무상태성(stateless)을 통해 클라이언트와 서버 간에 서로 모르는 상태로 통신을 진행한다.
무상태성은 클라이언트와 서버 간에 유연한 통신을 가능하게 한다.
하지만 이 무상태성으로 인해 클라이언트의 인증이 필요한 경우 모든 인증 정보를 서버에게 전달해야한다.
HTTP 기본 인증 과정은 다음과 같다.

GET /users/1 HTTP/1.1
HTTP/1.1 401 Unautorized
WWW-Autenticate: Basic realm="users", title="login"
서버는 인증이 필요한 요청인 경우 401 상태코드와 함께 WWW-Authenticate 헤더에 서버가 요구하는 인증 방법을 알려준다.
WWW-Authenticate: <인증스킴> realm="<인증영역>", <추가 옵션>
인증스킴 : 인증 프로토콜 또는 방법
인증 영역 : 보호되는 도메인 영역 혹은 보호 범위
위 헤더를 해석하면 users 영역은 인증이 필요한 영역이니 BASE64로 인코딩 하여 인증 데이터를 전송하라는 의미다.
Basic은 BASE64로 인코딩하라는 것을 의미한다.
GET /users/1 HTTP/1.1
Authorization: Basic xxxxxxxxxxxx
아이디, 비밀번호와 같은 필요한 인증 정보를 지정된 인증 스킴을 적용하여 Authorization 헤더로 전달한다.
HTTP/1.1 200 OK
Content-Type: application/json
{
...
}
전달한 인증 정보가 유효한 경우 요청이 성공한다.
HTTP 기본 인증은 가장 간단한 인증 매커니즘이지만 인증 정보를 단순히 평문 혹은 BASE 64를 통해 전달한다.
이로 인해 탈취될 경우 인증 정보가 노출된다.
다이제스트(digest) 인증은 해시를 사용하여 인증 정보를 암호화하여 전송한다.
해시 함수는 비가역적인 성질을 지니고 있어 한번 암호화하면 원문을 알아내기 매우 어렵다.
다이제스트(digest)는 정보 통신에서 임의 길이의 데이터 블록을 고정 길이로 변환하는 해시 알고리즘(hash algorism)에서의 해시값을 가리킨다.
다이제스트(digest)의 뜻은 요약문으로, 인증 정보를 고정된 길이의 요약문으로 만든다고 이해하면 된다.

인증 정보를 암호화하더라도 탈취된 인증 정보를 그대로 사용하는 것을 막을 수 없다.
그래서 서버에서는 난수인 nonce라는 값을 생성해서 클라이언트에게 전달한다.
클라이언트는 nonce와 인증정보를 함께 암호화하여 전송한다. 서버는 한번 사용한 nonce를 폐기하고 새로 생성한다.
이렇게 되면 인증정보를 탈취하더라도 한 번 사용된 digest는 재사용할 수 없게 된다.
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Digest realm="example", qop="auth", nonce="dcd...", algorithm="MD5", stale="false"
인증 스킴으로 Digest를 사용한다.
GET /example HTTP/1.1
Authorization: Digest username="user123", realm="example", nonce="dcd...", uri="/example",
response="662...", qop=auth, nc=00000001, cnonce="0a...", algorithm="MD5"
nonce, uri 등과 함께 인증정보를 사용하여 해시 함수를 통해 response를 생성한뒤 전송한다.
김영한, 『모든 개발자를 위한 HTTP 웹 기본 지식』, 인프런
RFC7235, Hypertext Transfer Protocol (HTTP/1.1): Authentication
RFC7616, HTTP Digest Access Authentication
필오의 개발 docs, 『다이제스트 인증 (1) - 다이제스트 인증과 특징』