콘텐츠로 건너뛰기
ToolsMinify logo
모든 기사

Math.random과 crypto.getRandomValues ​​- 어느 것을 사용해야 합니까?

Math.random은 게임 및 UI 보풀에 적합합니다. crypto.getRandomValues는 비밀번호, 토큰 및 공정 추첨에 필요합니다. 차이점, 모듈로 바이어스 및 브라우저에서 안전한 난수 생성기를 사용해야 하는 경우에 대해 알아보세요.

업데이트됨 2026년 11월 2일8 분 읽기

난수 생성기 사용 - 무료

라이브 도구를 열고 이 가이드에서 배운 내용을 적용하십시오.

난수 생성기 열기

JavaScript는 브라우저에서 임의의 숫자를 선택하는 두 가지 일반적인 방법인 Math.random 및 crypto.getRandomValues를 제공합니다. 데모에서는 비슷해 보이지만 서로 바꿔 사용할 수는 없습니다. Math.random은 비보안 작업을 위한 빠른 의사 난수 생성기입니다. crypto.getRandomValues는 비밀, 토큰 및 공격자가 예측할 수 없는 모든 항목을 위한 암호화 보안 PRNG(CSPRNG)입니다. 이 가이드에서는 Math.random이 안전하지 않을 때의 차이점, 모듈로 바이어스가 순진한 코드에 몰래 들어가는 방법, 브라우저에서 보안 난수 정수 및 소수를 생성하는 방법에 대해 설명합니다.

빠른 답변

예측 가능성이 보안 위험이 아닌 애니메이션, 섞인 재생 목록, 외관 UI 및 게임에 Math.random을 사용하세요. 비밀번호, API 키, 세션 토큰, 추첨 추첨, 고유 샘플 및 예측에 저항해야 하는 모든 것에 대해서는 crypto.getRandomValues를 사용하십시오. ToolsMinify의 난수 생성기 및 비밀번호 생성기는 모두 웹 암호화를 사용하며 절대로 Math.random을 사용하지 않습니다.

Math.random이 실제로 하는 일

Math.random은 반 개방 범위 [0, 1)의 부동 소수점 숫자를 반환합니다. 엔진은 런타임에 의해 시드된 결정적 알고리즘을 사용하여 이를 구현합니다. 색종이 조각, 무작위 테스트 픽스처 라벨 또는 오늘의 정보 선택 등 다양한 정보만 필요할 때 빠르고 충분합니다.

비밀로 하도록 설계되지 않았습니다. 이전 환경에서는 충분한 출력을 통해 시드 또는 내부 상태를 추론할 수 있었습니다. 최신 엔진이 시드를 강화하더라도 Math.random은 플랫폼이 암호화 강도를 약속하지 않고 많은 튜토리얼에서 편향된 정수 트릭으로 래핑하기 때문에 여전히 보안을 위한 잘못된 API입니다.

  • 적합: UI 애니메이션, 게임, 셔플 데모, 민감하지 않은 샘플링
  • 나쁜 용도: 비밀번호, 토큰 재설정, 복권 스타일 추첨, 암호화 임시값, API 키
  • 보안 API가 아닌 정수가 아닌 [0, 1)의 부동 소수점을 반환합니다.

crypto.getRandomValues의 기능

crypto.getRandomValues는 Web Crypto API의 일부입니다. 형식화된 배열(예: Uint32Array)을 전달하면 브라우저는 이를 운영 체제의 엔트로피 소스에서 암호화된 강력한 임의 값으로 채웁니다. 이는 TLS 및 기타 보안 기능에 사용되는 것과 동일한 종류의 임의성 브라우저입니다.

값을 예측하기 어렵기 때문에 서버에 아무 것도 보내고 싶지 않을 때 클라이언트에서 비밀을 생성하는 데 적합합니다. 이것이 바로 개인 정보 보호를 최우선으로 하는 비밀번호 및 숫자 생성기가 Web Crypto를 선호하고 브라우저에서 완전히 실행되는 이유입니다.

  • 웹 암호화 계약에 따른 암호화 보안(CSPRNG)
  • 페이지가 로드되면 오프라인으로 작동
  • 비밀을 업로드하면 안 되는 클라이언트 측 도구에 적합

모듈로 바이어스 - 임의 정수의 조용한 버그

일반적인 스니펫은 value = randomUint32 % n입니다. n이 전체 32비트 범위를 균등하게 나누지 않으면 일부 나머지가 다른 것보다 더 자주 나타납니다. 이러한 편향은 2^32에 비해 큰 n 범위에 대해서는 작지만 실제로 존재합니다. 추첨, 주사위 또는 "승자 선택" 도구에 사용되는 작은 범위의 경우에는 이를 피해야 합니다.

수정: 거부 샘플링

32비트 값을 그립니다. 2^32 공간 상단의 불완전한 남은 영역에 빠지면 버리고 다시 그립니다. 그런 다음에만 모듈로 n을 취하십시오. [0, n)의 모든 정수는 확률이 동일해집니다. ToolsMinify의 보안 생성기는 이 패턴을 사용합니다.

고유한 난수가 필요한 경우

보안과 공정성은 다른 작업입니다. 우승자를 반복해서는 안 되는 추첨에는 포함된 최소-최대 범위 내에서 교체 없이 샘플링(고유 추첨)이 필요합니다. 비밀번호에는 문자 세트 전체를 대체하여 높은 엔트로피가 필요합니다. 둘 다 여전히 암호화 무작위성에서 시작해야 합니다. 고유성만으로는 Math.random을 안전하게 만들 수 없습니다.

포함된 정수 범위의 경우 고유 값의 개수는 (최대 - 최소 + 1)을 초과할 수 없습니다. 소수의 경우 "고유"는 일반적으로 잘못된 모델입니다. 독립적으로 생성하거나 정수로 전환합니다.

브라우저에서 안전한 난수 생성

일상적인 사용을 위해 거부 샘플링을 직접 구현할 필요는 없습니다. 이미 Web Crypto를 사용하고 있는 클라이언트측 생성기를 열고 범위를 설정한 후 결과를 복사하세요.

  • 난수 생성기 - 브라우저에서 무작위 정수 또는 소수, 대량 목록, 선택적인 고유 추첨을 보호하세요. crypto.getRandomValues.
  • 비밀번호 생성기 - 길이와 문자 집합을 제어하는 ​​강력한 임의 비밀번호 - 동일한 Web Crypto 기반.
  • UUID 생성기 - 충돌해서는 안 되는 식별자에 대한 UUID v4/v7, ULID 및 NanoID입니다.

실용적인 체크리스트

  1. 질문: 누군가가 다음 가치를 예측하여 접근 권한, 돈 또는 불공정한 이점을 얻을 수 있습니까?
  2. 그렇다면 crypto.getRandomValues(또는 이에 기반한 도구)를 사용하십시오. 절대로 Math.random을 사용하지 마십시오.
  3. 임의의 비트를 범위에 매핑하는 경우 원시 모듈로 대신 거부 샘플링을 사용하십시오.
  4. 비밀번호와 토큰의 경우 큰 문자 풀과 충분한 길이를 갖춘 전용 생성기를 선호합니다.
  5. 비밀이 서버 로그에 도달해서는 안 되는 경우 생성 클라이언트 측을 유지하십시오.

자주 묻는 질문

Math.random은 괜찮은가요?

예 - 비보안 임의성의 경우입니다. 시각적 다양성, 실제 돈을 걸지 않는 게임, 데모 데이터는 괜찮습니다. 숫자가 비밀이거나 동기가 있는 공격자에 대해 공정해야 하는 순간에는 Web Crypto로 전환하세요.

crypto.getRandomValues가 더 느립니까?

Math.random보다 느리지만 비밀번호, 수천 개의 복권 번호 또는 테스트 ID를 생성하는 경우 브라우저에서는 차이가 중요하지 않습니다. 여기서는 마이크로 벤치마크보다 정확성과 예측 불가능성이 더 중요합니다.

보안 생성기에 서버가 필요합니까?

아니요. 브라우저는 이미 CSPRNG를 노출하고 있습니다. 클라이언트 측 도구는 로컬에서 값을 생성할 수 있으므로 비밀이 장치를 떠나지 않습니다. 이것이 ToolsMinify가 사용하는 모델입니다.

Node.js crypto.randomInt는 어떻습니까?

서버에서는 Math.random 대신 플랫폼 암호화 모듈(예: crypto.randomInt)을 사용합니다. 동일한 규칙이 적용됩니다. 보안에 민감한 임의성에는 CSPRNG API가 필요합니다.

지금 안전한 RNG를 사용해 보세요

무료 난수 생성기를 사용하여 브라우저에서 암호화 보안 정수 또는 소수를 그립니다. 최소/최대, 선택적 고유 모드를 설정한 다음 복사하세요. 아무것도 업로드되지 않았습니다.

난수 생성기 사용 - 무료

라이브 도구를 열고 이 가이드에서 배운 내용을 적용하십시오.

난수 생성기 열기

관련 기사