비밀번호 생성기

사용자 정의 가능한 길이와 문자 집합으로 강력한 임의 비밀번호 생성

길이20
개수5

비밀번호 생성기란?

비밀번호 생성기는 사용자 계정, API 키, 데이터베이스 자격 증명, 암호화 비밀 키에 사용할 무작위 문자열을 생성합니다. 사람이 직접 선택한 비밀번호와 달리, 생성된 비밀번호는 가능한 모든 문자 조합 공간에서 추출되므로 사전 공격 및 패턴 기반 추측에 강합니다. 이 도구는 브라우저에 내장된 암호학적 난수 생성기를 사용하여 강력한 무작위 비밀번호를 온라인으로 생성합니다.

비밀번호 강도는 두 가지 요소에 따라 결정됩니다: 길이와 문자 다양성. 대문자, 소문자, 숫자, 특수문자를 모두 사용하는 20자 비밀번호는 약 131비트의 엔트로피를 가집니다. 이 수준에서는 초당 1조 번의 추측을 시도하는 무차별 대입 공격으로도 모든 조합을 시도하는 데 우주의 나이보다 더 긴 시간이 필요합니다. 계산 방식은 간단합니다: 엔트로피 = 길이 × log2(문자 집합 크기).

NIST SP 800-63B와 같은 표준은 최소 8자 이상의 비밀번호를 권장하며 검증자가 상한선을 강제하지 않도록 하고, '정확히 특수문자 하나 포함'과 같은 강제 조합 규칙보다는 긴 패스프레이즈를 권장합니다. 기계 간 자격 증명 및 서비스 계정의 경우, 대부분의 보안 프레임워크 및 규정 준수 체계에서 전체 문자 집합에서 추출한 20자 이상의 무작위 문자가 기본 기준으로 인정됩니다.

왜 비밀번호 생성기를 사용해야 할까요?

사람은 좋은 난수 생성기가 아닙니다. 비밀번호를 재사용하거나, 사전에 있는 단어를 선택하거나, 예측 가능한 패턴으로 문자를 치환하고(@를 a로, 3을 e로), 짧은 문자열을 기본값으로 사용합니다. 비밀번호 생성기는 이 과정에서 인간의 편향을 제거합니다.

🔐
개인 정보 우선 생성
비밀번호는 Web Crypto API를 사용하여 브라우저에서 완전히 생성됩니다. 어떤 문자도 기기를 떠나지 않으며, 기록되지 않고, 생성 중 네트워크 요청이 발생하지 않습니다.
즉각적인 일괄 출력
한 번의 클릭으로 최대 20개의 비밀번호를 한꺼번에 생성합니다. 개별 비밀번호를 복사하거나 자격 증명 저장소 및 프로비저닝 스크립트에 사용하기 위해 전체를 한 번에 복사할 수 있습니다.
🛡️
계정 불필요
가입, 이메일, 생성된 비밀번호를 추적하는 쿠키가 없습니다. 페이지를 열고 옵션을 설정한 다음 생성하세요.
🎛️
완전한 문자 집합 제어
대문자, 소문자, 숫자, 특수문자를 독립적으로 설정할 수 있습니다. 시스템이나 정책의 요구 사항에 맞게 4자에서 128자까지 길이를 설정하세요.

비밀번호 생성기 활용 사례

프론트엔드 개발
폼 유효성 검사, 입력 길이 테스트, 인증 흐름 개발을 위한 테스트 비밀번호를 생성합니다. 로그인 폼이 128자 비밀번호와 특수문자를 올바르게 처리하는지 확인하세요.
백엔드 및 DevOps
인프라 구성 중 데이터베이스 자격 증명, API 토큰, 서비스 계정 비밀번호를 생성합니다. 일괄 생성을 사용하여 단일 세션에서 여러 서비스를 프로비저닝하세요.
보안 엔지니어링
암호화 키, HMAC 서명, JWT 비밀 키 교체를 위한 고엔트로피 비밀 값을 생성합니다. 256비트 이상의 엔트로피가 필요한 비밀 값에는 64자 이상으로 길이를 설정하세요.
QA 및 침투 테스트
특정 문자 집합을 포함하거나 제외한 문자열을 생성하여 비밀번호 정책 적용 여부를 테스트합니다. 시스템이 최소 길이 또는 복잡성 요건 미달 비밀번호를 올바르게 거부하는지 확인하세요.
데이터 엔지니어링
테스트 환경, 스테이징 데이터베이스, CI/CD 파이프라인 비밀 값에 사용할 무작위 자격 증명을 생성합니다. 환경별로 새로운 자격 증명을 생성하여 테스트 데이터에서 운영 비밀번호 재사용을 방지하세요.
개인 계정 보안
각 온라인 계정에 고유한 비밀번호를 생성합니다. 이 생성기를 비밀번호 관리자와 함께 사용하여 암기할 필요 없는 자격 증명을 저장하세요.

비밀번호 엔트로피 참고표

엔트로피는 비밀번호의 예측 불가능성을 측정합니다. log2(문자_집합_크기 ^ 길이)로 계산됩니다. 엔트로피가 높을수록 공격자가 탐색해야 할 가능한 조합이 많아집니다. NIST와 OWASP는 높은 보안 수준의 애플리케이션에 최소 80비트의 엔트로피를 권장합니다.

길이문자 집합엔트로피무차별 대입 소요 시간
8lower + digits~41 bitsMinutes to hours
12lower + upper + digits~71 bitsCenturies (offline)
16all character sets~105 bitsBeyond brute-force
20all character sets~131 bitsBeyond brute-force
32all character sets~210 bitsBeyond brute-force
64all character sets~419 bitsBeyond brute-force

해독 시간은 초당 1조 번 추측(현대 GPU를 사용한 오프라인 공격) 기준입니다. 속도 제한이 있는 온라인 공격은 수십억 배 더 느립니다.

비밀번호 생성 시 CSPRNG vs Math.random()

무작위성의 출처는 비밀번호 길이만큼 중요합니다. 예측 가능한 난수 생성기로 생성된 비밀번호는 알고리즘과 시드 상태를 아는 공격자가 재구성할 수 있습니다. 이 도구는 모든 현대 브라우저에 내장된 암호학적으로 안전한 유사난수 생성기(CSPRNG)인 crypto.getRandomValues()를 사용합니다.

crypto.getRandomValues()
운영 체제 엔트로피 소스(하드웨어 RNG, 인터럽트 타이밍 등)를 사용합니다. 공격자가 이전 출력을 모두 알더라도 출력을 예측할 수 없습니다. 보안에 민감한 작업을 위해 W3C Web Crypto 명세에서 요구합니다.
Math.random()
제한된 엔트로피 풀에서 시드된 결정적 알고리즘을 사용합니다. 시드 상태를 알면 출력을 예측할 수 있습니다. ECMAScript 명세는 Math.random()이 암호학적으로 안전한 난수를 제공하지 않는다고 명시합니다. 비밀번호 생성에 절대 사용하지 마세요.

코드 예시

다양한 언어로 프로그래밍 방식으로 비밀번호를 생성합니다. 아래의 모든 예시는 Math.random() 또는 이와 동등한 취약한 PRNG가 아닌 암호학적으로 안전한 무작위 소스를 사용합니다.

JavaScript (Web Crypto API)
// Generate a random password in the browser or Node.js 19+
function generatePassword(length = 20) {
  const charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*'
  const values = new Uint32Array(length)
  crypto.getRandomValues(values)
  return Array.from(values, v => charset[v % charset.length]).join('')
}

console.log(generatePassword())    // → "kR7!mZp$Xw2&nLq9@Yf3"
console.log(generatePassword(32))  // → "Hd4%tNx!Qw8#mKp2Rv6&Zj0*Ls3Yb7@"
Python
import secrets
import string

def generate_password(length: int = 20) -> str:
    """Generate a cryptographically secure random password."""
    alphabet = string.ascii_letters + string.digits + string.punctuation
    return ''.join(secrets.choice(alphabet) for _ in range(length))

# Single password
print(generate_password())      # → "kR7!mZp$Xw2&nLq9@Yf3"

# Batch of 5 passwords
for _ in range(5):
    print(generate_password(24))

# Ensure at least one char from each category
def generate_strong(length: int = 20) -> str:
    required = [
        secrets.choice(string.ascii_uppercase),
        secrets.choice(string.ascii_lowercase),
        secrets.choice(string.digits),
        secrets.choice(string.punctuation),
    ]
    remaining = length - len(required)
    alphabet = string.ascii_letters + string.digits + string.punctuation
    all_chars = required + [secrets.choice(alphabet) for _ in range(remaining)]
    secrets.SystemRandom().shuffle(all_chars)
    return ''.join(all_chars)
CLI (OpenSSL / /dev/urandom)
# OpenSSL — generate 32 random bytes, base64-encode
openssl rand -base64 32
# → "x7Kp2mNqR4wZ8vLs1Yb0Hd6tFj3Xc9Ga5eUi+Wo="

# /dev/urandom with tr — alphanumeric + symbols, 20 chars
tr -dc 'A-Za-z0-9!@#$%^&*' < /dev/urandom | head -c 20; echo
# → "kR7!mZp$Xw2&nLq9@Yf3"

# pwgen (install: apt install pwgen / brew install pwgen)
pwgen -sy 20 5
# Generates 5 passwords, 20 chars each, with symbols
Go
package main

import (
    "crypto/rand"
    "fmt"
    "math/big"
)

func generatePassword(length int) (string, error) {
    charset := "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()"
    result := make([]byte, length)
    for i := range result {
        idx, err := rand.Int(rand.Reader, big.NewInt(int64(len(charset))))
        if err != nil {
            return "", err
        }
        result[i] = charset[idx.Int64()]
    }
    return string(result), nil
}

func main() {
    pwd, _ := generatePassword(20)
    fmt.Println(pwd) // → "kR7!mZp$Xw2&nLq9@Yf3"
}

자주 묻는 질문

비밀번호 길이는 얼마가 적당한가요?
사용자 계정의 경우 혼합 문자 집합을 사용한 16자 비밀번호가 100비트 이상의 엔트로피를 제공하며, 현재의 모든 위협 모델에 충분합니다. 기계 비밀 값(API 키, 암호화 키)에는 32자 이상을 사용하세요. NIST SP 800-63B는 최소 8자를 설정하지만, 시스템이 잘림 없이 훨씬 긴 비밀번호를 허용할 것을 권장합니다.
이 비밀번호 생성기는 안전하게 사용할 수 있나요?
예. 비밀번호는 Web Crypto API(crypto.getRandomValues)를 사용하여 브라우저에서 생성됩니다. 어떤 데이터도 서버로 전송되지 않습니다. 브라우저의 네트워크 탭을 열어 생성 버튼 클릭 시 요청이 발생하지 않음을 직접 확인할 수 있습니다. 소스 코드는 브라우저 개발자 도구에서 확인 가능한 클라이언트 측 JavaScript입니다.
비밀번호 엔트로피란 무엇인가요?
엔트로피는 비트 단위로 표현된 무작위성의 척도입니다. N비트 엔트로피를 가진 비밀번호는 2^N개의 가능한 값을 가집니다. 예를 들어, 95개의 출력 가능한 ASCII 문자에서 추출한 20자 비밀번호는 log2(95^20) = 131.1비트의 엔트로피를 가집니다. 비트가 하나 추가될 때마다 공격자가 필요한 추측 횟수가 두 배로 늘어납니다.
비밀번호에 특수문자를 포함해야 하나요?
특수문자를 포함하면 문자 집합이 62개(문자 + 숫자)에서 95개(출력 가능한 ASCII)로 늘어나, 문자당 약 6.1비트의 엔트로피가 추가됩니다. 일부 시스템은 허용되는 특수문자를 제한합니다. 특정 특수문자를 거부하는 시스템이라면 특수문자 옵션을 비활성화하고 더 긴 비밀번호로 보완하세요. 24자 영숫자 비밀번호는 특수문자를 포함한 16자 비밀번호보다 엔트로피가 높습니다.
비밀번호 생성에 Math.random()을 사용하면 안 되는 이유는?
Math.random()은 암호학적으로 안전하지 않습니다. 대부분의 JavaScript 엔진은 보안이 아닌 시뮬레이션과 게임을 위해 설계된 xorshift128+ 또는 유사한 빠른 PRNG로 구현합니다. 몇 가지 출력을 관찰한 공격자는 내부 상태를 복원하고 이후의 모든 출력을 예측할 수 있습니다. Web Crypto API는 예측 불가능한 운영 체제 엔트로피 소스를 사용합니다.
생성된 비밀번호를 API 키와 토큰에 사용할 수 있나요?
예. 다만 대상 시스템의 형식 요건을 고려하세요. 일부 API는 임의 문자가 아닌 Base64 인코딩 키나 16진수 문자열을 요구합니다. 원시 비밀 값 생성에는 32자 이상의 전체 문자 집합을 사용하세요. Base64 키의 경우, Base64를 비밀번호 문자 집합으로 취급하는 대신 무작위 바이트를 생성하여 별도로 인코딩하세요.
비밀번호를 얼마나 자주 교체해야 하나요?
NIST SP 800-63B(2017년, 2024년 업데이트)는 사용자 비밀번호의 강제적 정기 교체를 권장하지 않습니다. 이는 더 약한 비밀번호 선택으로 이어지기 때문입니다. 침해 증거가 있을 때만 교체하세요. 기계 비밀 값과 서비스 계정은 조직의 위험 모델에 따라 교체하며, 일반적으로 높은 권한 자격 증명은 90일마다 교체합니다.