Basic

개요

HTTP Basic 인증은 RFC 7617에 정의된 가장 단순한 인증 방식으로, 사용자 이름과 비밀번호를 콜론으로 이어 붙인 뒤 Base64로 인코딩해 Authorization 헤더에 담아 매 요청마다 보냅니다. 별도의 세션이나 토큰 발급 절차가 없어 구현이 쉽고, 내부 도구·헬스체크·프록시 인증 같은 곳에서 여전히 널리 쓰입니다.

전송 방식

Authorization: Basic base64(user:password)

자세히

동작은 세 단계로 이해할 수 있습니다. 첫째, 보호된 리소스에 자격 증명 없이 접근하면 서버가 401 Unauthorized와 함께 `WWW-Authenticate: Basic realm="..."` 헤더를 돌려줍니다. 둘째, 클라이언트(브라우저나 API 클라이언트)는 `user:password` 문자열을 만들고 이를 Base64로 인코딩합니다. 셋째, `Authorization: Basic <인코딩값>` 헤더를 붙여 다시 요청합니다. 이후 클라이언트는 보통 매 요청에 이 헤더를 그대로 재전송합니다.

여기서 realm은 같은 자격 증명이 통하는 보호 영역의 이름이며, 브라우저는 realm 단위로 자격 증명을 캐시합니다. 프록시 계층에서는 같은 메커니즘이 407 Proxy Authentication Required, `Proxy-Authenticate`, `Proxy-Authorization` 헤더로 그대로 반복됩니다.

가장 중요한 오해는 Base64를 암호화로 착각하는 것입니다. Base64는 누구나 즉시 원문으로 복원할 수 있는 인코딩일 뿐 암호화가 아닙니다. 따라서 Basic 인증은 반드시 HTTPS(TLS) 위에서만 사용해야 하며, 평문 HTTP에서는 비밀번호가 사실상 그대로 노출됩니다.

요청 / 응답 예시

Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l

코드로 보기

curl -u alice:s3cret https://api.example.com/me
# equivalently:
curl -H 'Authorization: Basic YWxpY2U6czNjcmV0' https://api.example.com/me
const creds = btoa(`${user}:${pass}`);
fetch('/me', { headers: { Authorization: 'Basic ' + creds } });
import base64
raw = request.headers['Authorization'].split(' ', 1)[1]
user, pw = base64.b64decode(raw).decode().split(':', 1)
if not verify(user, pw):
    return Response(status=401, headers={'WWW-Authenticate': 'Basic realm="api"'})

보안 고려사항

관련 헤더

AuthorizationWWW-AuthenticateProxy-AuthenticateProxy-Authorization

관련 상태코드