Apache나 Nginx에서 HTTP Basic 인증을 설정하려면 .htpasswd 파일이 필요합니다. 이 파일은 사용자 이름과 해시된 비밀번호 쌍을 저장하는 텍스트 파일입니다. 올바른 해시를 생성하는 것이 첫 번째 과제입니다. 이 가이드에서는 htpasswd란 무엇인지, 어떤 알고리즘을 선택해야 하는지, Apache와 Nginx 설정 방법, 그리고 htpasswd 생성기가 왜 브라우저 내에서 완전히 동작해야 하는지를 설명합니다.

.htpasswd 파일이란

.htpasswd 파일은 HTTP Basic 인증을 위한 사용자 이름과 비밀번호 쌍을 저장합니다. 각 줄의 형식은 다음과 같습니다:

사용자이름:$해시비밀번호

Apache는 요청을 검증할 때 이 파일을 읽습니다. Nginx는 auth_basic_user_file 지시어로 동일한 형식을 사용합니다. 여러 사용자를 기록할 수 있으며, 한 줄에 한 사용자입니다.

.htpasswd 파일 예시:

alice:$2y$10$abcdefghijklmnopqrstuuVwXyZabcdefghijklmnopqrstuuVwXyZ
bob:$apr1$xyz12345$abcdefghijklmnopqrstuvwx
carol:{SHA}W6ph5Mm5Pz8GgiULbPgzG37mj9g=

htpasswd 알고리즘 비교

알고리즘 선택은 보안에 중요한 영향을 미칩니다:

알고리즘접두사보안성설명
bcrypt$2y$권장조정 가능한 작업 인수, 느리게 설계
APR1 MD5$apr1$허용 가능Apache 전용 MD5 변종, 스트레칭 포함
SHA1{SHA}약함솔트 없음, 레인보우 테이블에 취약
평문(없음)없음프로덕션에서 절대 사용 금지

bcrypt를 사용하세요. 조정 가능한 작업 인수를 가진 유일한 알고리즘입니다. 하드웨어 성능이 향상될수록 비용을 높일 수 있습니다. SHA1은 솔트가 없어 사전 계산된 해시 테이블로 쉽게 깨집니다. 평문은 비밀번호를 그대로 저장하기 때문에 파일이 유출되면 모든 계정이 즉시 위험에 처합니다.

bcrypt 해시 구조

$2y$10$Rlm8Mzv3bKNv1Pz5h3W1Ou6G7SjkUzW9C5h4RpYNi6TmVjD8sLYi

각 필드 설명:

  • $2y$ — bcrypt, Apache 호환 변종
  • 10 — 비용 인수 (2^10 = 1024 라운드)
  • 나머지 53자는 솔트 + 해시를 인코딩

Apache Basic 인증 설정

1단계 — htpasswd 파일 생성. htpasswd 생성기 또는 커맨드라인을 사용합니다:

# 첫 번째 사용자로 새 파일 생성
htpasswd -cB /etc/apache2/.htpasswd alice

# 사용자 추가 (-c 플래그 없이 — 붙이면 파일이 덮어씌워짐)
htpasswd -B /etc/apache2/.htpasswd bob

-B 플래그는 bcrypt를 강제합니다. 이 플래그 없이는 대부분의 시스템에서 MD5가 기본값입니다.

2단계 — 가상 호스트 또는 디렉터리 설정:

<Directory "/var/www/html/private">
    AuthType Basic
    AuthName "제한 구역"
    AuthUserFile /etc/apache2/.htpasswd
    Require valid-user
</Directory>

또는 보호할 디렉터리에 .htaccess 파일을 작성합니다 (서버 설정에서 AllowOverride AuthConfig 필요):

AuthType Basic
AuthName "제한 구역"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user

3단계 — Apache 리로드:

sudo systemctl reload apache2

Nginx Basic 인증 설정

Nginx에는 htpasswd 명령어가 없지만 동일한 파일 형식을 읽습니다.

1단계 — 비밀번호 파일 생성. 브라우저 기반 생성기 또는 htpasswd 도구를 사용합니다:

htpasswd -cB /etc/nginx/.htpasswd alice

2단계 — Nginx location 블록 설정:

server {
    listen 80;
    server_name example.com;

    location /private/ {
        auth_basic "제한 구역";
        auth_basic_user_file /etc/nginx/.htpasswd;
    }
}

전체 서버를 보호하려면 지시어를 location 블록 밖, server 블록 안으로 이동합니다.

3단계 — 테스트 및 리로드:

sudo nginx -t
sudo systemctl reload nginx

보안 주의사항

반드시 HTTPS를 사용하세요. HTTP Basic 인증은 자격 증명을 Base64로 인코딩해서 헤더에 담아 보낼 뿐입니다. Base64는 암호화가 아닌 단순 인코딩입니다. TLS 없이는 비밀번호가 사실상 평문으로 전송되는 것과 다름없습니다.

파일 권한을 제한하세요. .htpasswd 파일은 웹 서버 프로세스만 읽을 수 있어야 합니다:

sudo chown root:www-data /etc/apache2/.htpasswd
sudo chmod 640 /etc/apache2/.htpasswd

웹 루트 외부에 파일을 배치하세요. 공개 접근 가능한 디렉터리에 두면 누구나 다운로드할 수 있습니다.

비밀번호를 주기적으로 교체하세요. 다른 항목에 영향 없이 특정 사용자의 비밀번호만 업데이트하려면:

htpasswd -B /etc/apache2/.htpasswd alice

중요한 시스템에 Basic 인증만 사용하지 마세요. 속도 제한 없음, 세션 관리 없음, 다중 인증 미지원입니다. 실제 사용자 데이터를 다루는 시스템에는 적절한 인증 프레임워크를 사용하세요.

브라우저 기반 생성기를 사용해야 하는 이유

표준 방법은 apache2-utils 패키지의 htpasswd 커맨드라인 도구입니다. 하지만 패키지 설치와 터미널 접근이 필요합니다. Apache 유틸리티가 설치되지 않은 환경이나 원격 서버를 설정하는 경우에는 불편합니다.

온라인 생성기가 이 문제를 해결하지만, 대부분의 온라인 도구는 해싱을 위해 비밀번호를 서버로 전송합니다. 비밀번호를 다루는 방식으로는 근본적으로 잘못된 모델입니다.

zerotool.dev의 htpasswd 생성기는 완전히 브라우저 내에서 동작합니다. bcrypt 해싱(그리고 다른 모든 알고리즘 구현)이 JavaScript로 여러분의 기기에서 로컬 실행됩니다. 비밀번호는 브라우저 밖으로 나가지 않습니다. 서버 요청도, 입력 필드 로깅도 없습니다. 해시를 생성하면서 브라우저 개발자 도구의 Network 탭을 열어 확인해 보세요 — 비밀번호 필드 관련 아웃바운드 요청이 전혀 나타나지 않습니다.

프로덕션 자격 증명에도 안전하게 사용할 수 있으며, 서드파티 웹 서비스에 비밀번호를 붙여넣는 것을 금지하는 보안 정책에도 부합합니다.

htpasswd 생성기 사용하기

ZeroTool의 htpasswd 생성기는 다음을 지원합니다:

  • bcrypt (권장, $2y$ 접두사)
  • APR1 MD5 ($apr1$ 접두사, Apache 호환)
  • SHA1 ({SHA} 접두사)
  • 평문 (테스트 전용)

사용자 이름과 비밀번호를 입력하고 알고리즘을 선택하면, 생성된 줄을 바로 .htpasswd 파일에 붙여넣을 수 있습니다. 모든 계산은 로컬에서 실행되며 데이터는 브라우저 밖으로 나가지 않습니다.

htpasswd 생성기 열기 →