Basic Auth 헤더를 생성하는 방법
- 사용자 이름과 비밀번호를 입력하세요.
- 서버가 ISO-8859-1(Latin-1)을 기대하는 오래된 서버가 아니라면 문자 인코딩은 UTF-8로 두세요.
Authorization: Basic …줄 전체는 헤더 복사로, Base64 부분만은 토큰만 복사로 복사하세요.- 바로 쓰는 코드 아래의 URL에 엔드포인트를 넣고 사용하는 클라이언트의 코드를 복사하세요. 바꾸기를 누르면 헤더를 디코더로 보내 다시 확인할 수 있습니다.
헤더에 담기는 것
Basic 인증은 RFC 7617에 정의되어 있습니다. 클라이언트는 두 값을 콜론으로 잇고, 그 바이트를 Base64로 인코딩해 헤더 하나에 담아 보냅니다.
| 사용자 이름 | 비밀번호 | 헤더 값 |
|---|---|---|
Aladdin | open sesame | Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== |
deploy | hunter2 | Basic ZGVwbG95Omh1bnRlcjI= |
josé | pässwörd | Basic am9zw6k6cMOkc3N3w7ZyZA== (UTF-8) |
josé | pässwörd | Basic am9z6Tpw5HNzd/ZyZA== (Latin-1) |
마지막 두 행은 문자 인코딩이 왜 중요한지 보여 줍니다. 같은 텍스트가 다른 바이트를 만들기 때문에, 다른 인코딩을 기대하는 서버는 틀린 비밀번호를 받게 됩니다. UTF-8을 원하는 서버는 챌린지에서 WWW-Authenticate: Basic realm="api", charset="UTF-8"처럼 알릴 수 있습니다.
여기서 Base64는 전송 형식일 뿐입니다. 헤더를 복사한 사람은 누구나 Basic Auth 디코더로 비밀번호를 되돌릴 수 있으며, 그래서 Basic 인증은 HTTPS에서만 써야 합니다. 자세한 내용은 Base64는 암호화가 아닙니다에서 다룹니다.
도구가 경고하는 문자
- 사용자 이름 속 콜론. RFC 7617이 금지합니다. 서버가 첫 번째 콜론에서 나누므로 사용자 이름 일부가 비밀번호로 들어가 버립니다.
- 제어 문자: 탭이나 줄 바꿈 같은 문자는 Basic 자격 증명에 쓸 수 없습니다.
- Latin-1에 없는 문자: 그 문자 인코딩을 선택했을 때 이모지나 한글 같은 문자는
?로 바뀌며, 이는 결코 원하는 결과가 아닙니다. - UTF-8의 비 ASCII 문자. RFC상으로는 올바르지만 레거시 서버는 다르게 읽을 수 있으므로 먼저 테스트하세요.
비밀번호 속 콜론은 허용됩니다. 두 값을 나누는 것은 첫 번째 콜론뿐이기 때문입니다.
코드에서 Basic 인증 보내기
도구의 코드 예시는 입력한 값으로 생성되며 언어마다 안전하게 따옴표 처리됩니다. 기본 형태는 다음과 같습니다.
curl -u 'deploy:hunter2' https://api.example.com/
import requests
r = requests.get("https://api.example.com/",
auth=("deploy".encode("utf-8"), "hunter2".encode("utf-8")))
Python 예시는 일부러 바이트를 넘깁니다. requests는 str 값을 받으면 Latin-1로 인코딩하므로 €나 ł이 든 비밀번호는 실패합니다. 바이트를 넘기면 선택한 UTF-8을 정확히 그대로 보냅니다.
브라우저 JavaScript에서는 헤더를 직접 만드세요. fetch는 user:pass@가 들어간 URL을 거부하고, btoa()는 Latin-1 밖의 문자에서 예외를 던지므로 문자열을 UTF-8 바이트로 인코딩한 뒤 Base64로 바꿔야 합니다. 생성된 fetch 코드는 완성된 토큰을 넣어 두 문제를 모두 피합니다. UTF-8 단계는 JavaScript Base64 가이드에서, Buffer 버전은 Node.js에서 설명합니다.
그래도 요청이 401을 돌려줄 때
먼저 응답의 WWW-Authenticate 헤더를 확인하세요. Bearer라고 되어 있으면 API가 토큰을 기대하는 것이므로 Basic 자격 증명은 절대 받아들이지 않습니다. Basic이라고 되어 있으면 실제로 보낸 헤더(curl -v에서는 > Authorization: Basic …으로 출력됨)를 디코딩해 예상한 값과 비교하세요. 비밀번호 관리자에서 복사하면서 딸려 온 공백이나 끝의 줄 바꿈이 흔한 원인입니다. 프록시는 같은 형식의 별도 헤더 Proxy-Authorization을 씁니다.
자주 묻는 질문
Basic 인증 헤더는 어떻게 만들어지나요?
사용자 이름과 비밀번호를 콜론으로 잇고, 그 문자열을 UTF-8 바이트로 인코딩한 다음 바이트를 Base64로 인코딩하고 앞에 Basic 을 붙입니다. Aladdin과 open sesame은 Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==가 됩니다.
Basic 인증은 안전한가요?
HTTPS를 쓸 때만 안전합니다. Base64는 아무것도 숨기지 않으므로 요청을 볼 수 있는 사람은 누구나 순식간에 비밀번호를 디코딩할 수 있습니다. TLS 위에서는 헤더도 요청의 나머지 부분과 함께 암호화됩니다.
비밀번호에 콜론이 들어가도 되나요?
됩니다. 서버는 첫 번째 콜론에서 나누므로 그 뒤의 모든 것은 비밀번호에 속합니다. 콜론이 들어가면 안 되는 쪽은 사용자 이름입니다.
비 ASCII 비밀번호가 일부 서버에서 실패하는 이유는 무엇인가요?
RFC 7617은 서버가 UTF-8을 요구할 수 있게 하지만, 오래된 서버는 헤더를 ISO-8859-1로 디코딩합니다. test:123£는 UTF-8로 dGVzdDoxMjPCow==, Latin-1로 dGVzdDoxMjOj입니다. 다른 문자 인코딩을 시도하거나 ASCII만 쓰세요.