[HTTP] HTTP 인증

JJBIN·2024년 3월 27일

HTTP

목록 보기
2/6

1. HTTP 인증

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

1) 기본 인증

HTTP 기본 인증 과정은 다음과 같다.

A. 인증 과정

A) HTTP 요청 전송

GET /users/1 HTTP/1.1

B) 요청 실패 - 서버의 인증 요구

HTTP/1.1 401 Unautorized
WWW-Autenticate: Basic realm="users", title="login"

서버는 인증이 필요한 요청인 경우 401 상태코드와 함께 WWW-Authenticate 헤더에 서버가 요구하는 인증 방법을 알려준다.

WWW-Authenticate: <인증스킴> realm="<인증영역>", <추가 옵션>
인증스킴 : 인증 프로토콜 또는 방법
인증 영역 : 보호되는 도메인 영역 혹은 보호 범위

위 헤더를 해석하면 users 영역은 인증이 필요한 영역이니 BASE64로 인코딩 하여 인증 데이터를 전송하라는 의미다.
Basic은 BASE64로 인코딩하라는 것을 의미한다.

  • BASE64 : 64개의 공통 ASCII영역 문자
  • binary data를 6bit씩 짤라서 BASE64로 매핑
  • 6bit은 0~63을 표현 가능

C) 필요한 인증 정보를 담아 요청

GET /users/1 HTTP/1.1
Authorization: Basic xxxxxxxxxxxx

아이디, 비밀번호와 같은 필요한 인증 정보를 지정된 인증 스킴을 적용하여 Authorization 헤더로 전달한다.

D) 인증 및 요청 성공

HTTP/1.1 200 OK
Content-Type: application/json

{
	...
}

전달한 인증 정보가 유효한 경우 요청이 성공한다.


2) 다이제스트 인증

HTTP 기본 인증은 가장 간단한 인증 매커니즘이지만 인증 정보를 단순히 평문 혹은 BASE 64를 통해 전달한다.
이로 인해 탈취될 경우 인증 정보가 노출된다.

다이제스트(digest) 인증은 해시를 사용하여 인증 정보를 암호화하여 전송한다.
해시 함수는 비가역적인 성질을 지니고 있어 한번 암호화하면 원문을 알아내기 매우 어렵다.

다이제스트(digest)는 정보 통신에서 임의 길이의 데이터 블록을 고정 길이로 변환하는 해시 알고리즘(hash algorism)에서의 해시값을 가리킨다.

다이제스트(digest)의 뜻은 요약문으로, 인증 정보를 고정된 길이의 요약문으로 만든다고 이해하면 된다.

A. 인증 과정

인증 정보를 암호화하더라도 탈취된 인증 정보를 그대로 사용하는 것을 막을 수 없다.
그래서 서버에서는 난수인 nonce라는 값을 생성해서 클라이언트에게 전달한다.

클라이언트는 nonce와 인증정보를 함께 암호화하여 전송한다. 서버는 한번 사용한 nonce를 폐기하고 새로 생성한다.
이렇게 되면 인증정보를 탈취하더라도 한 번 사용된 digest는 재사용할 수 없게 된다.

A) 서버의 인증 요구

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Digest realm="example", qop="auth", nonce="dcd...", algorithm="MD5", stale="false"

인증 스킴으로 Digest를 사용한다.

  • realm: 인증 영역
  • qop: 보호 수준, 보통 auth로 설정. auth-init 설정시 메시지 무결성도 검사
  • nonce: 클라이언트가 요청을 보낼 때마다 생성되는 한 번만 사용할 수 있는 난수
  • algorithm: 해시 알고리즘. 보통 "MD5"로 설정하나 더 나은 보안을 위해서는 "SHA256" 설정
  • stale: 클라이언트가 보낸 nonce가 유효하지 않음을 나타내는 플래그

B) 인증 정보 암호화 및 전송

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를 생성한뒤 전송한다.

  • username: 사용자의 이름
  • uri: 요청한 자원의 URI
  • response: 클라이언트가 생성한 응답. 인증 정보를 해시하여 생성
  • nc: 클라이언트가 보낸 요청 순서 (nonce count)
  • cnonce: 클라이언트가 생성한 nonce

References

김영한, 『모든 개발자를 위한 HTTP 웹 기본 지식』, 인프런
RFC7235, Hypertext Transfer Protocol (HTTP/1.1): Authentication
RFC7616, HTTP Digest Access Authentication
필오의 개발 docs, 『다이제스트 인증 (1) - 다이제스트 인증과 특징』

0개의 댓글