Javascript에서 진정한 난수(랜덤한 수)를 생성하는 방법
Language/Javascript2024. 2. 28. 22:38자바스크립트의 Math.random() 함수는 간편하게 사용할 수 있는 난수 생성기이지만, 알고리즘에 의해 생성되는 의사 난수(pseudorandom number
)를 반환합니다. 이는 실제로 완벽한 무작위성을 제공하지 않습니다.
특히 보안이 중요한 애플리케이션에서는 이러한 의사 난수가 적합하지 않을 수 있습니다. 따라서, 보다 안전한 난수를 필요로 할 때는 다른 방법을 모색해야 합니다. 본 글에서는 진정한 난수를 생성하는 방법에 대해 설명합니다.
의사 난수란?
우선 의사 난수(pseudorandom number
)에 대해 알아야합니다. 의사 난수는 난수처럼 보이지만, 실제로는 초기값(seed)에 따라 결정되는 알고리즘을 통해 생성된 숫자입니다.
이는 결국 예측 가능하다는 의미이며, 같은 시드 값을 가지고 알고리즘을 시작하면 항상 동일한 숫자 시퀀스를 생성합니다.
코드로 예시를 들면, 일반적인 random() 함수는 아래와 같이 처음 생성된 난수를 다음 seed 값으로 가지기 때문에 동일한 시드가 들어오는 경우 동일한 값을 반환하게되고 그 이후 생성되는 랜덤한 값을 예측할 수 있습니다.
function pseudoRandom(seed) {
let value = seed;
return function() {
value = value * 16807 % 2147483647; // 생성된 난수를 다음 seed로 가짐 (즉, 동일한 패턴의 난수가 생성 됨)
return value;
};
}
const generator = pseudoRandom(1);
console.log(generator()); // 매번 호출할 때마다 동일한 순서로 난수를 생성 (패턴을 예측할 수 있음)
crypto.getRandomValues() 함수 사용
보다 안전한 무작위 수를 생성하기 위해, 웹 표준인 Web Cryptography API의 crypto.getRandomValues()
메서드를 사용할 수 있습니다. 이 함수는 암호학적으로 안전한 난수를 생성할 수 있으며, 게임, 랜덤 토큰 생성, 보안 등에 사용하기 적합 합니다.
crypto.getRandomValues()
메서드는 TypedArray(예: Uint32Array, Uint8Array)를 인자로 받아, 배열의 각 요소를 암호학적으로 안전한 난수를 생성하여 반환합니다.
코드를 예시로 들면,
const array = new Uint32Array(10);
window.crypto.getRandomValues(array);
console.log(array); // 10개의 암호학적으로 안전한 난수가 담긴 배열
암호학적으로 안전한 난수의 중요성
암호학적으로 안전한 난수는 예측이 불가능해야 하며, 공격자가 난수 생성 패턴을 추론할 수 없어야 합니다. Math.random()
과 같은 의사 난수 생성기는 이러한 요구 사항을 충족하지 못합니다.
따라서, 암호 키 생성, 세션 ID 등 보안에 민감한 데이터의 경우 crypto.getRandomValues()
를 사용하는 것이 좋습니다.
결론
Math.random()은 일반적인 용도의 난수 생성에는 충분하지만, 보안과 관련된 경우에는 적합하지 않을 수 있습니다. 웹 애플리케이션에서 보다 안전한 난수를 필요로 한다면, Web Cryptography API의 crypto.getRandomValues() 메서드를 사용하는 것이 바람직합니다. 이 메서드는 암호학적으로 안전한 난수를 제공하여, 보안 수준을 한층 더 높여줍니다.
'Language > Javascript' 카테고리의 다른 글
Javascript의 var / let / const 의 스코프와 재할당 가능 여부 (0) | 2024.03.07 |
---|---|
Javascript에서 random() 함수를 사용하여 랜덤한 값 생성하기 (0) | 2024.02.28 |
JavaScript ES6에서 추가된 map(), filter(), reduce() 이해하기 (0) | 2024.02.28 |
Javascript 배열의 every(), some() 함수 (0) | 2024.02.02 |
Object.assign()과 스프레드(spread) 연산자와의 차이점 (1) | 2023.10.17 |
IT 기술에 대한 글을 주로 작성하고, 일상 내용, 맛집/숙박/제품 리뷰 등 여러가지 주제를작성하는 블로그입니다. 티스토리 커스텀 스킨도 개발하고 있으니 관심있으신분은 Berry Skin을 검색바랍니다.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!