HTTP Basic Authentication은 리소스를 비밀번호로 보호하는 가장 오래되고 가장 단순한 방법이다. 브라우저가 사용자 이름과 비밀번호를 요청하면, 이 정보는 모든 요청마다 서버로 함께 전송된다. 이 단순함이 곧 가장 큰 약점이기도 하다.
Authorization 헤더가 만들어지는 방식
사용자 이름과 비밀번호를 콜론으로 연결한 뒤(username:password), 전체 문자열을 Base64로 인코딩하여 Authorization: Basic <인코딩된_문자열> 헤더에 담는다. 브라우저는 첫 로그인에 성공한 이후 모든 후속 요청에 이 헤더를 자동으로 다시 첨부한다.
Base64가 보안이 아닌 이유
Base64는 암호화가 아니라 인코딩 방식일 뿐이다 — 누구든 어떤 키도 없이 몇 초 만에 이 문자열을 다시 username:password로 디코딩할 수 있다. 보호되지 않은 공용 Wi-Fi처럼 요청이 가로채이면 인증 정보는 즉시 노출된다.
한글 아이디·비밀번호와 Base64 크기
Base64는 문자가 아니라 바이트를 인코딩하기 때문에 원본 문자열의 인코딩 방식이 중요하다. 영문 알파벳은 UTF-8에서 1바이트를 차지하지만, 한글 완성형 한 글자는 3바이트를 차지한다. 예를 들어 비밀번호123처럼 한글이 포함된 비밀번호는 같은 글자 수의 영문 비밀번호보다 Base64 토큰이 눈에 띄게 길어진다. Basic Auth 명세는 원래 ASCII 사용자 이름·비밀번호만 염두에 두고 설계되었고, non-ASCII 문자의 처리 방식은 오랫동안 표준화되어 있지 않았다 — 2015년 RFC 7617에 이르러서야 클라이언트와 서버가 해석을 맞추기 위한 선택적 charset="UTF-8" 파라미터가 공식적으로 추가되었다.
어디에 쓰는가
- 개발 중인 스테이징 서버나 사내 도구를 빠르게 비밀번호로 보호한다.
- curl이나 Postman으로 API를 수동 테스트하기 위한 올바른 Authorization 헤더를 만든다.
- 일반 HTTP(비-HTTPS)에서 Basic Auth를 사용하는 것이 왜 심각한 보안 취약점으로 간주되는지 이해한다.
Basic Auth에는 내장된 로그아웃 기능이 없다
브라우저는 인증 정보를 캐시해두고, 탭이 닫힐 때까지 동일한 origin으로 가는 모든 후속 요청에 Authorization 헤더를 자동으로 첨부한다 — 프로토콜 자체에 표준 "로그아웃" 버튼이 존재하지 않는다. 사용자를 강제로 로그아웃시키기 위해 서버는 편법을 쓴다: 의도적으로 다른 realm 값으로 401을 반환하거나, 사용자가 브라우저 탭을 직접 모두 닫아주기를 기대하는 식이다.