← 모두의 툴

Math.random() vs crypto.getRandomValues() — 비밀번호 엔트로피 계산법

가이드 · 2026-08-19 최종 확인

브라우저에서 "랜덤 문자열"을 만드는 방법은 두 가지가 있습니다. 하나는 Math.random(), 다른 하나는 crypto.getRandomValues()입니다. 둘 다 겉보기엔 똑같이 무작위 값을 뱉지만, 비밀번호나 API 키처럼 보안이 걸린 곳에 쓰면 결과가 완전히 달라집니다.

1. 두 API의 근본적인 차이

Math.random()은 JS 엔진 내부의 의사난수 생성기(PRNG)를 씁니다. 속도가 빠르고 게임의 셔플, UI 애니메이션, 무작위 샘플링 같은 용도엔 전혀 문제가 없습니다. 하지만 이 PRNG는 예측 불가능하도록 설계된 것이 아닙니다 — 내부 상태(시드)를 알거나 충분한 출력값을 관찰하면, 이론적으로 다음에 나올 값을 역산할 수 있다는 사실이 여러 보안 연구에서 지적된 바 있습니다. 그래서 MDN을 포함한 공식 문서들도 "보안이 중요한 곳에 Math.random()을 쓰지 말라"고 명시하고 있습니다.

반면 crypto.getRandomValues()는 Web Crypto API의 일부로, 운영체제가 제공하는 암호학적으로 안전한 난수 생성기(CSPRNG)를 사용합니다. 실제 하드웨어 엔트로피 소스(마우스 움직임, 타이밍 지터, 전용 난수 하드웨어 등)를 기반으로 하기 때문에, 출력값을 아무리 많이 관찰해도 다음 값을 예측할 수 없도록 설계되어 있습니다. 토큰, 비밀번호, 암호화 키 생성에는 반드시 이쪽을 써야 합니다.

이 도구의 실제 구현: 랜덤 문자열 생성기의 소스 코드를 확인한 결과, crypto.getRandomValues(arr)를 사용하고 있습니다. Math.random()이 아닌 올바른(안전한) 방식으로 구현되어 있어, 생성된 문자열을 비밀번호나 API 키로 사용해도 안전합니다.

2. 엔트로피란 무엇이고 어떻게 계산하나

비밀번호의 "강도"는 흔히 엔트로피(entropy)라는 값으로 표현합니다. 공식은 단순합니다.

엔트로피(비트) = log₂(문자셋 크기) × 문자열 길이

예를 들어 영문 대소문자+숫자(62자: a-z 26개 + A-Z 26개 + 0-9 10개)를 쓰는 경우, log₂(62) ≈ 5.95비트가 문자 하나당 엔트로피입니다. 업계에서 널리 쓰이는 실용적 보안 기준인 "128비트 엔트로피"(당분간의 무차별 대입 공격에 충분히 안전하다고 여겨지는 수준)에 도달하려면:

128 ÷ 5.95 ≈ 21.5 → 최소 22자가 필요합니다.

3. 문자셋 크기에 따라 필요한 길이가 달라진다

문자셋크기문자당 엔트로피128비트에 필요한 길이
소문자만 (a-z)26≈4.7비트≈28자
영문 대소문자+숫자62≈5.95비트≈22자
영문 대소문자+숫자+특수문자≈94≈6.55비트≈20자

특수문자를 추가하면 문자셋이 커져서 문자당 엔트로피가 올라가고, 같은 보안 수준을 더 짧은 길이로 달성할 수 있습니다. 반대로 소문자만 쓰면 같은 128비트를 위해 훨씬 더 긴 문자열이 필요합니다.

4. 실무 가이드

자주 묻는 질문

Q. Math.random()을 쓰면 실제로 뚫린 사례가 있나요?

A. 네. 여러 보안 연구에서 특정 JS 엔진의 Math.random() 내부 상태를 충분한 출력 샘플로 역산해 다음 출력을 예측한 사례가 보고됐습니다. 실제 공격 난이도는 상황에 따라 다르지만, 애초에 "예측 불가능"을 보장하도록 설계된 API가 아니므로 보안 용도로는 권장되지 않습니다.

Q. crypto.getRandomValues()는 모든 브라우저에서 되나요?

A. 네, Web Crypto API는 모든 최신 브라우저(Chrome, Firefox, Safari, Edge)에서 지원되는 표준 API입니다. HTTPS 환경(또는 localhost)에서 사용 가능합니다.

Q. 128비트가 아니라 더 높은 엔트로피가 필요한 경우도 있나요?

A. 장기간 보관되는 마스터 키나 매우 민감한 암호화 키의 경우 256비트를 요구하는 경우도 있습니다. 다만 일반적인 비밀번호·세션 토큰·API 키 수준에서는 128비트가 실용적으로 충분한 기준으로 널리 통용됩니다.

Q. 이 도구가 생성하는 32자 문자열의 실제 엔트로피는?

A. 영문 대소문자+숫자(62자) 기준 32자를 선택하면 32 × 5.95 ≈ 190비트입니다. 128비트 기준을 훨씬 상회하는 안전한 수준입니다.