Skip to content

htpasswd 생성기 — bcrypt, Apache MD5 (apr1) & Basic Auth

bcrypt, Apache MD5 (apr1), SHA-1 등으로 htpasswd 항목을 생성하는 웹 도구. Apache, nginx, Docker 설정 스니펫 포함. 100% 브라우저에서 처리 — 업로드 없음.

트래킹 없음 브라우저 실행 무료
100% 브라우저에서 처리 — 비밀번호가 기기를 떠나지 않습니다.
서버
bcrypt 비용: 12
htpasswd 항목
Authorization 헤더
 
기존 해시 검증
해시 정확성 및 Basic Auth 표준 준수를 위해 검토됨 — Go Tools 엔지니어링 팀 · Jun 4, 2026

htpasswd 파일이란?

An .htpasswd 파일은 HTTP Basic 인증에 사용되는 자격증명을 저장합니다. 각 줄은 username:hash 쌍으로, 해시는 비밀번호의 단방향 다이제스트이며 평문은 저장되지 않습니다. 웹 서버는 이 파일을 읽어 보호된 URL에 누가 접근할 수 있는지 결정합니다. Apache에서는 .htaccess 파일(또는 <Directory> 블록)이 .htpasswd 파일을 참조하여 페이지를 제공하기 전에 브라우저에 사용자 이름과 비밀번호를 요청합니다.

해시 형식은 어떤 알고리즘으로 생성했느냐에 따라 달라집니다. Apache의 htpasswd 도구는 여러 형식을 지원합니다: bcrypt($2y$로 시작)는 가장 강력하며 Apache, Docker Registry, Caddy에 권장됩니다; apr1(Apache MD5, $apr1$로 시작)는 가장 이식성이 높고 nginx의 안전한 기본값입니다; SHA-1({SHA}로 시작)은 솔트가 없어 안전하지 않습니다; crypt(전통적인 DES)는 레거시이며 8자에서 잘립니다; plain은 비밀번호를 평문으로 저장하며 운영 환경에서는 절대 사용해서는 안 됩니다.

이 생성기는 완전히 브라우저 내에서 실행됩니다 — 사용자 이름, 비밀번호, 해시가 절대 업로드되지 않습니다. 강력한 비밀번호가 필요하다면 랜덤 비밀번호 생성기를 이용하세요. Authorization: Basic 헤더를 직접 만들려면, 자격증명은 단순히 base64(user:password)이며 Base64 인코더로 생성할 수 있습니다. 엔드포인트를 보호한 뒤에는 cURL 명령 빌더로 명령줄에서 테스트해보세요.

# Apache htpasswd CLI equivalents (apache2-utils / httpd-tools)

# bcrypt entry, printed to stdout (recommended; -B = bcrypt, -n = no file, -b = password on CLI)
htpasswd -Bbn admin 's3cret'
# → admin:$2y$10$N9qo8uLOickgx2ZMRZoMye...

# apr1 (Apache MD5) entry, portable for nginx — no apache2-utils needed
printf "admin:$(openssl passwd -apr1 's3cret')\n"
# → admin:$apr1$k3l4Hj9.$qN8...

# Append a user to an existing file from the shell
htpasswd -B /etc/apache2/.htpasswd alice

# Note: nginx delegates bcrypt to the system crypt(); on Alpine/musl or old
# glibc that fails — prefer apr1 for nginx to stay portable.

주요 기능

다양한 해시 알고리즘

bcrypt ($2y$), apr1 / Apache MD5 ($apr1$), SHA-1 ({SHA}) 항목을 생성하고, 테스트용 plain(평문) 옵션도 제공합니다. 형식이 지원하는 경우 각각 새로운 랜덤 솔트를 사용합니다.

생성 및 검증

새 항목을 만들거나 기존 항목을 검증하세요. 저장된 user:hash 줄과 후보 비밀번호를 붙여넣으면 일치 여부를 즉시 확인할 수 있어 운영 중 401 오류 디버깅에 유용합니다.

서버별 자동 선택

Apache, nginx, Docker, Caddy 중 하나를 선택하면 올바른 알고리즘이 자동으로 선택됩니다 — 지원되는 경우 bcrypt, nginx 이식성을 위해 apr1 — 무음 crypt() 실패를 방지합니다.

바로 붙여넣을 수 있는 설정 블록

Apache .htaccess, nginx auth_basic, Docker, Kubernetes ingress-nginx, Caddy, Traefik 등 6가지 복사 준비 설정 스니펫이 생성된 .htpasswd 항목에 맞게 제공됩니다.

100% 클라이언트 사이드

모든 해싱은 Web Crypto와 번들된 bcrypt 구현을 통해 브라우저 로컬에서 처리됩니다. 사용자 이름, 비밀번호, 해시가 서버로 전송되지 않으므로 운영 자격증명을 안전하게 생성할 수 있습니다.

예시

bcrypt 항목 (권장)

admin:$2y$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy

$2y$ 접두사와 비용 10의 bcrypt 항목입니다. 가장 강력하고 이식성 높은 형식으로 Apache, Docker Registry, Caddy, Traefik에 사용하세요.

apr1 항목 (이식성 높은 nginx용)

admin:$apr1$kl3H9j2.$qN8vY7tLp2mZ0xW5cR4fK1

$apr1$ 마커 뒤에 8자 솔트가 붙은 Apache MD5 (apr1) 항목입니다. nginx의 bcrypt 검증이 불안정한 시스템 crypt()에 의존하기 때문에 nginx의 안전한 기본 형식입니다.

SHA-1 항목 (레거시)

admin:{SHA}W6ph5Mm5Pz8GgiULbPgzG37mj9g=

{SHA} 항목은 솔트 없는 SHA-1 다이제스트의 base64입니다. Apache와 nginx가 허용하지만 솔트가 없어 안전하지 않습니다 — 레거시 호환성 목적으로만 포함됩니다.

Authorization: Basic 헤더

Authorization: Basic YWRtaW46czNjcmV0

동일 사용자의 클라이언트 측 자격증명: base64('admin:s3cret'). .htpasswd 파일 없이 curl -H나 Postman으로 이 헤더를 전송해 인증하세요.

다중 사용자 .htpasswd 파일

admin:$2y$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy
alice:$2y$10$3bQ8xY7tLp2mZ0xW5cR4fO9vK1jH6sD2nG8aQ5wE3rT7uI4oP1cm
bob:$apr1$mZ0xW5cR$4fK1jH6sD2nG8aQ5wE3rT2

사용자당 username:hash 줄 하나씩. 같은 파일에 알고리즘을 혼합할 수 있습니다 — 여기서는 bcrypt 항목 두 개와 apr1 항목 하나가 세 사용자를 위해 공존합니다.

사용 방법

  1. 1

    서버 및 알고리즘 설정

    대상 서버(Apache, nginx, Docker, Caddy)를 선택하세요. 적합한 알고리즘이 자동으로 선택됩니다 — Apache/Docker/Caddy에는 bcrypt, 이식성 높은 nginx에는 apr1. 직접 변경하거나 bcrypt 비용을 조정할 수도 있습니다.

  2. 2

    해시 생성

    사용자 이름과 비밀번호를 입력하거나(또는 랜덤 비밀번호 클릭) 생성 버튼을 클릭하세요. 해시는 새로운 랜덤 솔트로 로컬에서 계산됩니다. 언제든지 솔트를 재생성해 새 항목을 만들 수 있습니다.

  3. 3

    항목 복사

    .htpasswd 파일용 user:hash 줄을 복사하거나, 셸용 echo >> 추가 명령어를 복사하거나, curl과 Postman용 Authorization: Basic 헤더를 복사하세요.

  4. 4

    설정 배포

    생성된 설정 블록을 Apache .htaccess, nginx 서버 블록, Docker, Kubernetes 인그레스, Caddy, 또는 Traefik 설정에 붙여넣고, .htpasswd 파일 경로를 지정한 뒤 서버를 재시작하세요.

주요 활용 사례

Apache 디렉토리 보호
.htaccess 파일과 AuthUserFile 지시어를 사용해 HTTP Basic Auth로 폴더를 잠그세요. bcrypt 항목과 생성된 Apache 설정 블록을 사용하면 모든 경로에 로그인을 요구할 수 있습니다.
nginx auth_basic
auth_basic과 auth_basic_user_file로 location 또는 서버 블록을 보호하세요. apr1 형식을 사용하면 Alpine, Debian 등 다양한 베이스 이미지에서 안정적으로 동작합니다.
Docker Registry
프라이빗 Docker Registry는 bcrypt htpasswd 항목만 허용합니다. htpasswd -Bbn으로 $2y$ 줄을 생성하고, 레지스트리 컨테이너에 마운트한 뒤 docker login으로 인증하세요.
Kubernetes ingress-nginx
.htpasswd 파일로 basic-auth 시크릿을 만들고, nginx.ingress.kubernetes.io/auth-type과 auth-secret 어노테이션으로 인그레스 라우트를 보호하세요.
Caddy & Traefik
Caddy의 basic_auth 지시어와 Traefik의 basicauth 미들웨어는 모두 bcrypt 해시를 필요로 합니다. 생성된 항목을 Caddyfile이나 Traefik labels/dynamic config에 직접 붙여넣으세요.
curl & Postman Authorization 헤더
빠른 테스트를 위해 파일 없이 Authorization: Basic 헤더를 복사해 자격증명을 직접 전송하세요. curl -H 플래그나 Postman 요청에 붙여넣어 보호된 엔드포인트를 테스트할 수 있습니다.

기술 세부사항

bcrypt ($2y$)
조정 가능한 비용 인수를 가진 Blowfish 암호 기반의 적응형 솔트 해시입니다. 각 항목은 16바이트 랜덤 솔트와 비용을 내장하므로 동일한 비밀번호도 다른 해시를 생성합니다. 참고: bcrypt는 비밀번호를 72바이트에서 잘라냅니다 — 그 이상의 문자는 무시됩니다.
apr1 (Apache MD5)
Apache의 반복적 솔트 MD5 변형($apr1$ + 8자 솔트)입니다. 1,000번의 MD5 라운드를 실행하며 bcrypt의 적응형 비용보다 훨씬 약하지만, Apache와 nginx가 기본으로 구현하여 플랫폼과 베이스 이미지에서 가장 이식성 높은 형식입니다.
SHA-1 및 crypt
SHA-1 항목({SHA} + base64 다이제스트)은 솔트가 없어 동일한 비밀번호가 동일한 해시를 생성하고 레인보우 테이블에 취약합니다 — 레거시 호환성 목적으로만 포함됩니다. 전통적인 crypt (DES)는 더욱 약하고 비밀번호를 8자에서 무음으로 잘라냅니다.
솔트 및 반복
솔팅은 모든 해시를 고유하게 만들어 사전 계산된 (레인보우 테이블) 공격을 방지합니다. bcrypt는 설정 가능한 비용과 함께 128비트 랜덤 솔트를 사용하며, apr1은 1,000번의 고정 반복과 8자 솔트를 사용합니다. 솔트 재생성으로 동일한 비밀번호에 대한 다른 유효한 해시를 생성할 수 있습니다.
Base64 및 UTF-8 처리
비밀번호는 해시 전에 UTF-8 바이트로 인코딩되므로 비ASCII 문자가 일관되게 처리됩니다. Authorization: Basic 헤더는 원시 UTF-8 username:password 바이트의 base64이며, 서버가 수신 측에서 디코딩하는 것과 일치합니다.
주의사항 및 한계
생성된 해시는 로컬에서 계산되며 라이브 서버에서 검증되지 않습니다. 복사된 항목과 다운로드된 .htpasswd 파일은 평문 해시 형태로 클립보드와 디스크에 저장됩니다 — 비밀처럼 취급하고, 파일 권한을 제한하며, 운영 설정에 붙여넣은 후 클립보드를 지우세요.

모범 사례

지원되는 곳이라면 bcrypt를 우선 사용하세요
Apache, Docker, Caddy, Traefik에는 bcrypt ($2y$)를 사용하세요 — 솔트 기반, 적응형이며 apr1이나 SHA-1보다 훨씬 강력합니다. nginx에서 시스템 crypt()에 대한 bcrypt 의존성이 불안정할 때만 apr1을 사용하세요.
파일을 웹 루트 외부에 저장하세요
.htpasswd를 제공 디렉토리 외부에 보관하여 HTTP로 다운로드되지 않도록 하세요. chmod 640을 설정하고 웹 서버 사용자가 소유하도록 하여 서버는 읽을 수 있지만 다른 계정은 접근할 수 없게 하세요.
항상 HTTPS를 통해 제공하세요
Basic Auth는 모든 요청에 자격증명을 역방향 base64로 전송합니다. TLS 없이는 네트워크 경로의 누구나 비밀번호를 읽을 수 있습니다. 평문 HTTP에서는 절대 Basic Auth를 활성화하지 마세요 — 보호된 엔드포인트 앞에서 TLS를 종료하세요.
고유하고 강력한 비밀번호를 사용하세요
각 계정마다 서비스 간에 재사용하지 않는 고엔트로피 비밀번호를 가져야 합니다. 랜덤 비밀번호 생성기로 생성하고 직접 만드는 대신 비밀번호 관리자에 저장하세요.

자주 묻는 질문

bcrypt vs apr1 — 어떤 것을 선택해야 할까요?
Apache, Docker Registry, Caddy, Traefik에는 bcrypt를 사용하세요 — 강력한 솔트 기반 적응형 해시로 현대적 표준입니다. nginx에는 apr1 (Apache MD5)을 사용하세요. nginx는 bcrypt 검증을 시스템 crypt()에 위임하는데 많은 빌드에서 실패하지만, apr1은 내부적으로 구현되어 어디서나 작동합니다. 런타임을 직접 제어하고 bcrypt 지원을 확신할 수 있다면 bcrypt가 항상 더 강력한 선택입니다. apr1은 보안이 아닌 이식성을 위한 것입니다.
nginx는 bcrypt를 지원하나요?
간접적으로만, 그것도 신뢰할 수 없게 지원합니다. nginx는 비밀번호를 직접 해시하지 않습니다 — $2y$ 항목의 경우 C 라이브러리의 crypt() 함수에 검증을 위임하므로, 지원 여부는 전적으로 libc에 달려 있습니다. Alpine의 musl과 구형 glibc 빌드에는 blowfish (bcrypt) 방식이 포함되지 않아 인증이 무음으로 실패합니다. 이식성 높은 nginx 설정에는 apr1 형식을 사용하세요 — nginx가 모든 플랫폼에서 내부적으로 검증합니다.
nginx 오류 `crypt_r() failed (22: Invalid argument)`를 어떻게 해결하나요?
이 오류는 nginx가 blowfish 방식을 지원하지 않는 libc에서 bcrypt ($2y$) 해시를 검증하려 했다는 의미입니다 — 주로 Alpine/musl이나 구형 glibc에서 발생합니다. 해결책은 항목을 bcrypt 대신 apr1 (Apache MD5)으로 재생성하는 것입니다. apr1은 nginx가 모든 플랫폼에서 내부적으로 검증합니다. 또는 bcrypt를 지원하는 libc의 베이스 이미지로 전환할 수 있지만, apr1이 더 간단하고 이식성 높은 해결책입니다.
.htpasswd 파일은 어디에 두고 권한은 어떻게 설정해야 하나요?
.htpasswd 파일을 웹 문서 루트 외부에 저장하여 정적 파일로 제공되거나 노출되지 않도록 하세요. 일반적인 위치는 /etc/apache2/.htpasswd 또는 /etc/nginx/.htpasswd입니다. 권한을 640 (chmod 640)으로 설정하고 웹 서버가 실행되는 사용자(예: www-data 또는 nginx)가 소유하도록 하여 서버는 읽을 수 있지만 다른 계정은 접근할 수 없게 하세요.
.htaccess / nginx에서 Basic Auth를 어떻게 설정하나요?
Apache의 경우 이 도구가 AuthType Basic, AuthName, .htpasswd 경로를 가리키는 AuthUserFile, Require valid-user가 포함된 .htaccess 블록을 생성합니다. nginx의 경우 auth_basic "Restricted";와 auth_basic_user_file /path/.htpasswd;가 포함된 location 블록을 생성합니다. 서버에 맞는 설정 블록을 복사하고, 파일 경로를 조정한 뒤 재시작하세요 — 스니펫은 바로 붙여넣을 수 있습니다.
비밀번호가 어딘가에 업로드되나요?
아니요. 모든 해시는 JavaScript를 사용해 완전히 브라우저에서 계산됩니다 — 사용자 이름, 비밀번호, 생성된 해시가 네트워크를 통해 전송되지 않습니다. 생성 중에 브라우저의 개발자 도구(F12 → 네트워크 탭)를 열어 확인할 수 있습니다: 나가는 요청이 전혀 없습니다. 어떤 서버에도 저장되거나 기록되지 않으므로 실제 운영 자격증명을 안전하게 생성할 수 있습니다.
bcrypt의 $2a$, $2b$, $2y$ 접두사의 차이는 무엇인가요?
모두 동일한 bcrypt 알고리즘의 버전 접두사이며 동등한 해시를 생성합니다. 차이는 일부 구현에서 고비트 문자와 문자열 길이를 처리하는 방식의 역사적 버그 수정에서 비롯됩니다. Apache의 htpasswd는 $2y$를 출력합니다. 현대 bcrypt 라이브러리는 $2a$, $2b$, $2y$를 검증 시 상호 호환 가능하게 취급하므로, 여기서 생성된 $2y$ 항목은 Apache, Caddy, Traefik, Docker Registry에서 올바르게 검증됩니다.
bcrypt 비용은 얼마로 설정해야 하나요?
비용 12가 현대적인 기본값으로 보안과 속도의 균형이 좋습니다. 비용은 작업 인수입니다: 값을 하나 올릴 때마다 해시 계산 및 검증 시간이 두 배가 되어 무차별 대입 공격을 늦추지만 모든 로그인에 지연이 추가됩니다. 비용 10은 트래픽이 적거나 위험이 낮은 엔드포인트에 적합합니다; 중요한 데이터에는 12–14를 권장합니다. 합법적인 인증이 눈에 띄게 느려질 정도로 높이지 마세요.
htpasswd와 Authorization: Basic 헤더의 차이는 무엇인가요?
둘은 동일한 교환의 양쪽 끝에 있습니다. .htpasswd 파일은 서버 측 저장 해시 — 서버가 자격증명을 검증하는 데 사용하는 단방향 다이제스트를 가집니다. Authorization: Basic 헤더는 클라이언트 측 요청 자격증명입니다: 브라우저나 curl이 각 요청마다 전송하는 username:password의 literal base64입니다. 서버는 헤더를 base64 디코딩한 뒤 저장된 해시로 비밀번호를 확인합니다. 하나는 저장이고 다른 하나는 전송입니다.
apache2-utils가 설치되어 있지 않을 때 htpasswd 항목을 어떻게 생성하나요?
필요 없습니다 — 이 도구가 bcrypt, apr1, SHA-1 항목을 완전히 브라우저에서 생성합니다. 명령줄을 선호한다면 거의 모든 시스템에 OpenSSL이 포함되어 있습니다: openssl passwd -apr1을 실행해 apr1 해시를 얻은 뒤 username:을 앞에 붙여 줄을 완성하세요. Debian/Ubuntu에서는 apt install apache2-utils로 htpasswd 바이너리를 설치할 수 있고, RHEL/CentOS에서는 httpd-tools를 사용하세요.
htpasswd 플래그 -B, -Bbn, -bnB는 어떤 의미인가요?
각 문자는 독립적인 플래그입니다: -B는 bcrypt를 선택하고, -n은 파일에 쓰는 대신 결과를 stdout에 출력하며, -b는 비밀번호를 (프롬프트 대신) 명령줄 인수로 받습니다. 순서는 중요하지 않으므로 -Bbn과 -bnB는 동일합니다. -Bbn은 Docker Registry htpasswd 파일에 bcrypt 항목을 파이프로 전달하는 일반적인 조합입니다.
Docker Registry가 bcrypt를 필요로 하는 이유는 무엇인가요?
Docker Registry의 htpasswd 인증 백엔드는 bcrypt 형식 항목만 허용합니다; apr1, SHA-1, crypt 해시는 거부되어 로그인이 실패합니다. htpasswd -Bbn user password로 항목을 생성하거나(또는 여기서 bcrypt 옵션 사용), 파일을 레지스트리 컨테이너에 마운트하고 REGISTRY_AUTH_HTPASSWD_PATH를 지정하세요. Basic Auth 자격증명이 전송 중에 읽힐 수 있으므로 항상 TLS와 함께 사용하세요.
Basic Auth는 보안적으로 안전한가요?
HTTPS를 통해서만 안전합니다. HTTP Basic Auth는 모든 요청에 자격증명을 base64(username:password)로 전송하며, base64는 역방향 인코딩 — 암호화가 아닙니다 — 이므로 트래픽을 읽을 수 있는 누구나 즉시 비밀번호를 복원할 수 있습니다. TLS를 통하면 헤더가 전송 중에 암호화되어 Basic Auth는 간단한 접근 제어에 적합합니다. 평문 HTTP에서는 절대 사용하지 마세요, 그리고 높은 가치의 애플리케이션에는 더 강력한 인증 방식을 선호하세요.

cURL 명령어 생성기 & 빌더

웹 & API

온라인 curl 명령어 생성기. 메서드·헤더·인증·바디를 설정하면 즉시 복사 가능한 명령어가 생성됩니다. Bearer·POST JSON·파일 업로드 프리셋. 무료, 서버 전송 없음.

진법 변환기 (Number Base Converter)

변환 도구

2진수, 16진수, 10진수, 8진수 및 임의 진법(2-36)을 즉시 변환합니다. 온라인에서 무료로 사용할 수 있으며 모든 처리는 브라우저에서 이루어집니다.

Base64 디코더 · 인코더 (Base64 Decoder & Encoder)

인코딩 & 포매팅

Base64를 온라인에서 무료로 인코딩하고 디코딩합니다. UTF-8과 이모지를 완벽 지원하는 실시간 변환으로, 100% 브라우저에서 처리되어 회원 가입이 필요 없습니다.

대소문자 변환기 — UPPERCASE, lowercase, camelCase

텍스트 도구

UPPERCASE, lowercase, camelCase, snake_case, kebab-case 등 15가지 형식으로 텍스트를 즉시 변환합니다. 무료 온라인 도구, 가입 불필요, 브라우저에서 동작.

색상 변환기 — HEX, RGB, HSL, OKLCH

변환 도구

HEX, RGB, HSL, OKLCH, OKLAB, CMYK 등 9가지 색상 형식을 브라우저에서 즉시 변환합니다. 무료 온라인 도구, 가입 불필요.

crontab 생성기 & cron 표현식 빌더

날짜 & 시간

브라우저에서 cron 표현식을 만들고 검증·해석합니다. 로컬 또는 UTC로 다음 실행을 미리 보고, POSIX 5필드 문법과 프리셋을 온라인에서 무료로 사용합니다.