Node.js의 crypto.randomFill() 메서드는 crypto.randomBytes() 메서드와 거의 동일하게 작동합니다. 두 메서드의 유일한 차이점은 randomFill()에서는 첫 번째 인수로 채워질 버퍼 자체를 전달한다는 점입니다. 또한 콜백이 설정된 경우에만 오류 발생 시 해당 콜백 함수가 호출됩니다.
이 메서드는 암호학적으로 안전한(cryptographically secure) 난수를 기존 버퍼에 채워 넣을 때 유용하며, 불필요한 메모리 할당을 줄일 수 있다는 장점이 있습니다.
문법
crypto.randomFill(buffer, [offset], [size], [callback])
매개변수
buffer – 채워질 데이터를 담는 필드입니다. 사용 가능한 타입은 string, TypedArray, Buffer, ArrayBuffer, DataView이며, 버퍼 크기는 2**31-1을 초과할 수 없습니다.
offset – randomFill이 시작될 위치의 오프셋 값입니다. 기본값은 0입니다.
size – 오프셋 이후 채워질 버퍼의 크기입니다. 즉 (buffer.length - offset)이며, 이 값 역시 2**31-1을 초과할 수 없습니다.
callback – 오류가 발생했을 때 호출될 함수입니다.
예제 1: Buffer 객체 사용
randomFill.js라는 이름의 파일을 생성하고 아래 코드를 복사한 뒤, 다음 명령어로 실행해 보겠습니다.
node randomFill.js
randomFill.js
// crypto.randomFill() 메서드의 동작을 보여주는 Node.js 프로그램
// crypto 모듈 가져오기
const crypto = require('crypto');
const fs = require("fs");
// 버퍼 바이트 값 초기화
const buf = Buffer.alloc(6);
// 버퍼와 콜백을 인수로 randomFill 메서드 호출
crypto.randomFill(buf, (err, buf) => {
if (err) throw err;
// 채워진 후의 버퍼 데이터 출력
console.log(buf.toString('ascii'));
});
// 위에서 정의한 모든 매개변수를 사용해 randomFill 호출
crypto.randomFill(buf, 3, 2, (err, buf) => {
if (err) throw err;
// 버퍼에 새로 채워진 랜덤 데이터 출력
console.log(buf.toString('base64'));
});
// 아래 함수의 출력 결과도 위와 동일함을 확인할 수 있습니다
crypto.randomFill(buf, 3, 3, (err, buf) => {
if (err) throw err;
console.log(buf.toString('base64'));
});
출력 결과
C:\home\node>> node randomFill.js
f!]"+–
ZqHdoit8
ZqHdoit8
예제 2: DataView 객체 사용
이번에는 DataView를 활용한 예제를 살펴보겠습니다.
// crypto.randomFill() 메서드의 동작을 보여주는 Node.js 프로그램
// crypto 모듈 가져오기
const crypto = require('crypto');
const fs = require("fs");
// DataView를 사용해 버퍼 바이트 값 초기화
const data = new DataView(new ArrayBuffer(16));
// 버퍼와 콜백을 인수로 randomFill 메서드 호출
crypto.randomFill(data, (err, buf) => {
if (err) throw err;
// 인코딩을 지정해 randomFill 데이터 출력
console.log(Buffer.from(buf.buffer,
buf.byteOffset, buf.byteLength).toString('ascii'));
});
출력 결과
C:\home\node>> node randomFill.js
>h(Be#D8h0
정리
crypto.randomFill()은 기존 버퍼에 암호학적으로 안전한 난수를 직접 채우는 메서드로, 새로운 버퍼를 반환하는 randomBytes()와 달리 메모리를 효율적으로 사용할 수 있습니다. offset과 size 매개변수를 조합하면 버퍼의 특정 구간만 선택적으로 채울 수 있으며, 콜백 방식뿐 아니라 Promise 기반(promises API)으로도 사용 가능합니다.