🗝️ Apache Basic 인증(.htpasswd) 파일 만드는 법

APR1-MD5 해시로 .htpasswd 생성하는 법

사내 테스트 서버나 스테이징 환경에 간단히 아이디·비밀번호 잠금을 걸고 싶을 때 가장 손쉬운 방법이 HTTP Basic 인증입니다. 이 글에서는 Basic 인증의 동작 원리, .htpasswd 파일의 형식, 그리고 실제 서버 설정에 적용하는 방법을 다룹니다.

HTTP Basic 인증이란

HTTP Basic 인증은 HTTP 프로토콜 자체에 정의된 가장 단순한 인증 방식입니다. 서버가 보호된 리소스에 대한 요청을 받으면 401 Unauthorized 응답과 함께 WWW-Authenticate: Basic 헤더를 돌려주고, 브라우저는 아이디·비밀번호 입력창을 띄웁니다. 이후 요청부터는 Authorization: Basic base64(사용자명:비밀번호) 헤더가 매 요청에 붙어 전송됩니다. 로그인 세션이나 쿠키 없이도 별도의 애플리케이션 코드 작성 없이 웹 서버 설정만으로 접근을 제한할 수 있다는 것이 장점입니다.

.htpasswd 파일과 서버 설정

.htpasswd는 "사용자명:해시된 비밀번호" 형식의 줄이 나열된 텍스트 파일입니다. Apache는 .htaccess 또는 서버 설정 파일에서 이 파일을 참조해 인증을 처리합니다. 예를 들어 Apache라면 다음과 같이 설정합니다.

Nginx는 .htaccess 대신 auth_basicauth_basic_user_file 지시어를 서버 블록에 직접 씁니다. 파일 형식은 동일하므로 같은 .htpasswd 파일을 그대로 재사용할 수 있습니다.

APR1-MD5 해시 형식

.htpasswd 파일에 비밀번호를 평문으로 저장하면 안 되므로 해시값을 저장합니다. Apache 전용 방식인 APR1-MD5(htpasswd -m 옵션)는 일반적인 MD5와는 다른, Apache가 자체적으로 변형한 crypt 알고리즘입니다. 결과는 $apr1$salt$hash 형태의 문자열로 나타나는데, 예를 들면 $apr1$Rg9uS37e$vT8OZzXqM3.Dj7L2b1pXe. 같은 모양입니다. $apr1$은 알고리즘 식별자, 그 다음이 무작위 salt, 마지막이 실제 해시값입니다. 같은 비밀번호라도 salt가 매번 다르게 생성되므로 생성할 때마다 결과 문자열이 달라지는 것이 정상입니다. 최신 Apache는 더 강력한 bcrypt(-B 옵션)도 지원하지만, APR1-MD5는 여전히 가장 널리 쓰이는 기본 형식입니다.

보안 주의사항

Basic 인증은 반드시 HTTPS와 함께 사용해야 합니다. Authorization 헤더에 담기는 값은 Base64로 인코딩될 뿐 암호화되지 않으므로, HTTP 평문 연결에서는 누구나 패킷을 가로채 아이디·비밀번호를 그대로 복원할 수 있습니다. 또한 APR1-MD5는 반복 연산으로 무차별 대입을 다소 늦추긴 하지만 bcrypt·scrypt 같은 현대적 알고리즘만큼 강하지 않으므로, 서비스 로그인 등 중요한 용도보다는 임시 접근 제한 목적에 적합합니다.

사용자명과 비밀번호만 입력하면 APR1-MD5 해시가 적용된 .htpasswd 한 줄을 바로 만들어주는 도구가 있습니다. 브라우저 안에서만 계산되므로 비밀번호가 서버로 전송되지 않습니다.

🗝️ 이 작업, 도구로 바로 해보세요

Apache Basic 인증(.htpasswd) 파일 만드는 법 — APR1-MD5 해시로 .htpasswd 생성하는 법

다른 가이드

🔁
도메인 IP 주소 확인하는 방법
도메인이 가리키는 실제 서버 IP를 찾는 법
🛰️
DNS 전파 확인하는 방법 (TTL이란?)
네임서버 변경 후 전파 여부와 TTL 개념 정리
📡
내 IP 주소 확인하는 가장 쉬운 방법
공인 IP·사설 IP 차이와 확인 방법
📐
CIDR 표기법과 서브넷 마스크 계산법
/24 같은 CIDR 표기를 서브넷 마스크로 바꾸는 법
🩺
SSL 인증서 만료일 확인하는 방법
브라우저 없이 인증서 만료일을 확인하는 법
🪪
JWT 토큰 구조 이해하고 디코딩하는 방법
Header·Payload·Signature 3부분 구조 설명
🔑
안전한 비밀번호 만드는 기준과 생성 방법
길이·문자 조합·엔트로피로 보는 비밀번호 강도
🔐
Base64 인코딩이란? 언제 어떻게 쓰나
이메일 첨부·데이터 URI에 쓰이는 이유
📘
JSON Formatter로 API 응답 가독성 높이기
압축된 JSON을 보기 좋게 정리하는 법
🗓️
유닉스 타임스탬프 변환하는 방법
1970년 기준 초 단위 시간을 날짜로 바꾸는 법
🗃️
지저분한 SQL 쿼리 포맷팅하는 방법
한 줄 SQL을 절 단위로 정렬하는 법
🎨
HEX RGB HSL 색상 코드 변환하는 방법
세 가지 색상 표기법의 차이와 변환법
🔠
카멜케이스 스네이크케이스 등 표기법 정리
camelCase·snake_case·PascalCase 언제 쓰나
🆚
두 텍스트 파일 차이 비교하는 방법
코드·문서 버전 간 차이를 빠르게 찾는 법