내장모듈 OS, path, url , dns, crypto, util
# os
운영 체제와 관련된 정보에 접근할 수 있는 기능을 제공합니다. 이 모듈을 사용하여 운영 체제의 정보를 가져오거나 조작할 수 있습니다.
메서드 | 설명 |
os.userInfo([options]) | 현재 사용자에 대한 정보를 제공하는 메서드입니다. 기본적으로 현재 사용자의 이름, UID, 그룹 ID, 홈 디렉토리 및 쉘을 반환합니다. |
os.hostname() | 호스트 이름을 반환합니다. |
os.platform() | 현재 운영 체제 플랫폼을 반환합니다. |
os.totalmem() 및 os.freemem() | 시스템의 총 메모리 및 사용 가능한 메모리를 바이트 단위로 반환합니다. |
os.cpus() | 시스템의 CPU 정보를 반환합니다. |
os.networkInterfaces() | 시스템의 네트워크 인터페이스 정보를 반환합니다. |
os.userInfo([options])
const os = require('os');
const userInfo = os.userInfo();
console.log(userInfo);
os.hostname()
const hostname = os.hostname();
console.log('Hostname:', hostname);
os.platform()
const platform = os.platform();
console.log('Platform:', platform);
os.totalmem() 및 os.freemem()
const totalMemory = os.totalmem();
const freeMemory = os.freemem();
console.log('Total Memory:', totalMemory, 'bytes');
console.log('Free Memory:', freeMemory, 'bytes');
os.cpus()
const cpus = os.cpus();
console.log('CPU Information:', cpus);
os.networkInterfaces()
const networkInterfaces = os.networkInterfaces();
console.log('Network Interfaces:', networkInterfaces);
os.arch()
운영 체제의 CPU 아키텍처를 반환 , 문자열 ('x64', 'arm', 'ia32' 등)
const os = require('os');
console.log(os.arch()); // 'x64'
os.platform()
운영 체제의 플랫폼을 반환 , 문자열 ('darwin', 'win32', 'linux' 등)
console.log(os.platform()); // 'win32'
os.type()
운영 체제의 이름을 반환 , 자열 ('Linux', 'Darwin', 'Windows_NT' 등)
console.log(os.type()); // 'Windows_NT'
os.tmpdir()
운영 체제의 임시 파일 저장 경로를 반환
console.log(os.tmpdir()); // '/tmp'
# path : 경로
파일 및 디렉토리 경로와 관련된 작업을 수행하는 데 사용됩니다. 이 모듈을 사용하면 플랫폼 간의 경로 구분자를 올바르게 처리하고, 상대 경로를 절대 경로로 변환하거나 경로의 구성 요소를 추출할 수 있습니다.
파일 및 디렉토리 경로를 조작하고 처리할 수 있습니다.
메서드 | 설명 |
path | node.js |
path.join([...paths]) | 주어진 모든 경로 세그먼트를 하나의 경로로 연결합니다. |
path.resolve([...paths]) | 주어진 모든 경로 세그먼트를 절대 경로로 변환합니다. |
path.basename(path[, ext]) | 경로의 마지막 세그먼트(파일 이름)를 반환합니다. |
path.dirname(path) | 경로의 디렉토리 이름을 반환합니다. |
path.extname(path) | 파일의 확장자를 반환합니다. |
path.parse(pathString) | 파일 경로를 구성 요소로 분해하여 객체로 반환합니다. |
path.join([...paths])
경로를 합쳐서 하나의 경로 만
const path = require('path');
const fullPath = path.join(__dirname, 'files', 'example.txt');
console.log('Full Path:', fullPath);
path.resolve([...paths])
절대 경로로 변환
const absolutePath = path.resolve('files', 'example.txt');
console.log('Absolute Path:', absolutePath);
path.basename(path[, ext])
경로에서 파일명(혹은 디렉터리명)만을 반환
const filename = path.basename('/path/to/file/example.txt');
console.log('Filename:', filename);
path.dirname(path)
경로의 디렉터리 부분만 반환
const directory = path.dirname('/path/to/file/example.txt');
console.log('Directory:', directory);
path.extname(path)
경로의 확장자를 반환
const ext = path.extname('/path/to/file/example.txt');
console.log('Extension:', ext);
path.parse(pathString)
경로를 객체로 분리하여 반환
const pathObj = path.parse('/path/to/file/example.txt');
console.log('Parsed Path:', pathObj);
# fs : 파일 시스템
파일 시스템을 다루는 데 사용되는 주요 모듈은 fs (File System) 모듈
파일 및 디렉토리를 생성, 읽기, 쓰기, 삭제 및 수정하는 데 사용됩니다.
fs | node.js |
fs.readFile() | 메서드를 사용하여 파일을 비동기적으로 읽을 수 있습니다. |
fs.writeFile() | 메서드를 사용하여 파일을 비동기적으로 쓸 수 있습니다. |
fs.mkdir() | 메서드를 사용하여 디렉토리를 생성할 수 있습니다. |
fs.readdir() | |
fs.writeFile() | 메서드를 사용하여 파일을 생성할 수 있습니다. |
fs.unlink() | 메서드를 사용하여 파일을 삭제할 수 있습니다. |
fs.rmdir() | 메서드를 사용하여 디렉토리를 삭제할 수 있습니다. |
fs.readdir(path, [options], callback)
디렉터리의 내용을 비동기적으로 읽고 파일 및 디렉터리 이름 목록을 반환
const fs = require('fs');
fs.readdir('.', (err, files) => {
if (err) {
console.error(err);
}
console.log(files);
});
파일 읽기 (Reading Files):
fs.readFile()
const fs = require('fs');
fs.readFile('example.txt', 'utf8', (err, data) => {
if (err) {
console.error('Error reading file:', err);
return;
}
console.log('File content:', data);
});
파일 쓰기 (Writing Files):
fs.writeFile()
const fs = require('fs');
const content = 'Hello, world!';
fs.writeFile('example.txt', content, 'utf8', (err) => {
if (err) {
console.error('Error writing file:', err);
return;
}
console.log('File saved successfully.');
});
파일 및 디렉토리 생성 (Creating Files and Directories)
fs.mkdir(), fs.writeFile()
const fs = require('fs');
// 디렉토리 생성
fs.mkdir('newDir', (err) => {
if (err) {
console.error('Error creating directory:', err);
return;
}
console.log('Directory created successfully.');
});
// 파일 생성
const content = 'Hello, world!';
fs.writeFile('newFile.txt', content, 'utf8', (err) => {
if (err) {
console.error('Error creating file:', err);
return;
}
console.log('File created successfully.');
});
파일 삭제 (Deleting Files):
fs.unlink()
const fs = require('fs');
fs.unlink('example.txt', (err) => {
if (err) {
console.error('Error deleting file:', err);
return;
}
console.log('File deleted successfully.');
});
디렉토리 삭제 (Deleting Directories):
fs.rmdir()
const fs = require('fs');
fs.rmdir('newDir', (err) => {
if (err) {
console.error('Error deleting directory:', err);
return;
}
console.log('Directory deleted successfully.');
});
fs.createWriteStream
파일에 데이터를 스트림 방식으로 쓰기 위한 메서드 , 파일을 열고, 데이터가 준비될 때마다 비동기적으로 스트림에 쓰는 방식으로 데이터를 처리할 수 있습니다. 큰 파일을 다룰 때 유용
const fs = require('fs');
// 파일 스트림 생성
const writeStream = fs.createWriteStream('output.txt');
// 데이터 쓰기
writeStream.write('첫 번째 라인\n');
writeStream.write('두 번째 라인\n');
// 스트림을 종료하고 파일을 닫음
writeStream.end('마지막 라인\n');
- writeStream.write(data[, encoding][, callback]): 스트림에 데이터를 쓸 때 사용합니다. encoding은 기본적으로 'utf8'이고, 비동기적으로 완료되면 callback이 호출됩니다.
- writeStream.end([data][, encoding][, callback]): 더 이상 쓸 데이터가 없을 때 스트림을 종료합니다. 선택적으로 마지막 데이터를 쓸 수도 있습니다.
- writeStream.on(event, listener): 특정 이벤트를 처리할 수 있습니다. 자주 사용하는 이벤트는 다음과 같습니다:
- finish: 모든 데이터가 성공적으로 쓰여졌을 때 발생.
- error: 스트림 쓰기 중 오류가 발생했을 때 발생.
# events 모듈
이벤트 기반 프로그래밍을 지원하는 핵심 모듈 중 하나입니다. 이 모듈은 이벤트를 정의하고 처리하기 위한 기능을 제공합니다.
events 모듈을 사용하여 커스텀 이벤트를 정의하고, 해당 이벤트를 발생시키고 처리하는 것이 가능합니다. 일반적으로 이 모듈을 사용하여 각종 라이브러리나 프레임워크에서 이벤트 기반의 프로그래밍을 구현합니다.
const EventEmitter = require('events');
// 이벤트 발생기 생성
const myEmitter = new EventEmitter();
// 이벤트 핸들러 등록
myEmitter.on('event', () => {
console.log('이벤트가 발생했습니다.');
});
// 이벤트 발생
myEmitter.emit('event');
events 모듈을 불러와서 EventEmitter 클래스를 이용하여 이벤트 발생기를 생성합니다. 그 후 on 메서드를 사용하여 특정 이벤트에 대한 핸들러를 등록하고, emit 메서드를 사용하여 해당 이벤트를 발생시킵니다.
events 모듈은 Node.js에서 매우 중요한 역할을 하는데, 예를 들어 HTTP 요청, 파일 시스템 작업, 네트워크 통신 등에서 이벤트를 사용하여 비동기적인 작업을 처리합니다.
# URL
URL(Uniform Resource Locator)을 파싱하고 조작하는 데 사용됩니다. 이 모듈을 사용하면 URL의 다양한 구성 요소를 추출하고 조작할 수 있습니다
메서드 | 설명 |
url.parse(urlString[, parseQueryString[, slashesDenoteHost]]) | 주어진 URL 문자열을 파싱하여 URL 객체로 반환합니다. 기본적으로 쿼리 문자열도 파싱합니다. |
url.format(urlObject) | URL 객체를 문자열로 변환하여 반환합니다. |
url.resolve(from, to) | 기본 URL과 상대 URL을 기반으로 절대 URL을 생성합니다. |
url.parse(urlString[, parseQueryString[, slashesDenoteHost]])
주어진 URL 문자열을 파싱하여 URL 객체를 반환
- 인자:
- urlString: 파싱할 URL 문자열.
- parseQueryString: true로 설정하면 쿼리 문자열을 객체로 변환하여 query 속성에 저장합니다. 기본값은 false.
- slashesDenoteHost: true로 설정하면 슬래시(//)로 시작하는 부분을 호스트로 인식합니다.
- 반환값: URL 객체.
const url = require('url');
const urlString = 'https://www.example.com/path/to/resource?param1=value1¶m2=value2';
const parsedUrl = url.parse(urlString, true);
console.log('Parsed URL:', parsedUrl);
const url = require('url');
const parsedUrl = url.parse('https://example.com:8080/pathname?name=John&age=30#hash', true);
console.log(parsedUrl);
/*
{
protocol: 'https:',
slashes: true,
auth: null,
host: 'example.com:8080',
port: '8080',
hostname: 'example.com',
hash: '#hash',
search: '?name=John&age=30',
query: { name: 'John', age: '30' },
pathname: '/pathname',
path: '/pathname?name=John&age=30',
href: 'https://example.com:8080/pathname?name=John&age=30#hash'
}
*/
url.format(urlObject)
URL 객체를 문자열로 반환합니다. url.parse()와 반대되는 작업을 수행
- 인자:
- urlObject: URL 객체. url.parse()로 생성된 객체 또는 직접 작성된 객체.
- 반환값: 문자열로 구성된 URL.
const url = require('url');
const urlObject = {
protocol: 'https:',
hostname: 'example.com',
port: '8080',
pathname: '/pathname',
query: { name: 'John', age: '30' },
hash: '#hash'
};
const formattedUrl = url.format(urlObject);
console.log(formattedUrl); // 'https://example.com:8080/pathname?name=John&age=30#hash'
const urlObject = {
protocol: 'https:',
host: 'www.example.com',
pathname: '/path/to/resource',
query: { param1: 'value1', param2: 'value2' }
};
const formattedUrl = url.format(urlObject);
console.log('Formatted URL:', formattedUrl);
url.resolve(from, to)
- 기본 URL from에서 상대 URL to를 기준으로 완전한 URL을 생성합니다.
- 인자:
- from: 기준이 되는 기본 URL.
- to: 상대 URL.
- 반환값: 완전한 URL 문자열.
const from = 'https://www.example.com/base/path/';
const to = '../relative/resource';
const resolvedUrl = url.resolve(from, to);
console.log('Resolved URL:', resolvedUrl);
url.URL
WHATWG URL API를 사용하여 URL을 파싱하거나 조작할 수 있는 클래스입니다. Node.js의 전통적인 url.parse()보다 더 엄격하게 URL을 파싱합니다.
const { URL } = require('url');
const myUrl = new URL('https://example.com:8080/pathname?name=John&age=30#hash');
console.log(myUrl.hostname); // 'example.com'
console.log(myUrl.port); // '8080'
console.log(myUrl.pathname); // '/pathname'
console.log(myUrl.searchParams.get('name')); // 'John'
url.URLSearchParams
const { URLSearchParams } = require('url');
const params = new URLSearchParams('name=John&age=30');
console.log(params.get('name')); // 'John'
console.log(params.has('age')); // true
params.append('job', 'developer');
console.log(params.toString()); // 'name=John&age=30&job=developer'
params.delete('age');
console.log(params.toString()); // 'name=John&job=developer'
사용목적
URL의 쿼리 문자열을 조작하는 인터페이스를 제공합니다. 쿼리 문자열을 쉽게 추가, 삭제, 조회할 수 있습니다.
myUrl.searchParams
url.URL 객체의 searchParams 속성을 사용하여 쿼리 문자열을 조작할 수 있습니다. URLSearchParams 객체를 반환합니다.
const { URL } = require('url');
const myUrl = new URL('https://example.com/pathname?name=John&age=30');
myUrl.searchParams.append('job', 'developer');
console.log(myUrl.href); // 'https://example.com/pathname?name=John&age=30&job=developer'
myUrl.searchParams.delete('age');
console.log(myUrl.href); // 'https://example.com/pathname?name=John&job=developer'
- url.parse(): URL을 파싱하여 객체로 반환.
- url.format(): URL 객체를 문자열로 반환.
- url.resolve(): 상대 URL을 기준으로 완전한 URL 생성.
- url.URL: WHATWG URL API를 사용하여 URL을 조작.
- url.URLSearchParams: 쿼리 문자열을 쉽게 조작할 수 있는 인터페이스 제공.
- myUrl.searchParams: URL 객체에서 쿼리 문자열을 조작할 수 있는 URLSearchParams 객체 반환.
URLSearchParams 메서드
- append(name, value): 쿼리 파라미터를 추가.
- set(name, value): 쿼리 파라미터를 설정(기존 값 덮어쓰기).
- get(name): 첫 번째 쿼리 파라미터 값을 반환.
- getAll(name): 모든 쿼리 파라미터 값을 배열로 반환.
- has(name): 쿼리 파라미터의 존재 여부 확인.
- delete(name): 쿼리 파라미터 삭제.
- keys(): 모든 쿼리 파라미터의 키를 반복 가능한 객체로 반환.
- values(): 모든 쿼리 파라미터의 값을 반복 가능한 객체로 반환.
- entries(): 모든 쿼리 파라미터의 키-값 쌍을 반복 가능한 객체로 반환.
- forEach(callback, [thisArg]): 각 쿼리 파라미터에 대해 콜백 실행.
- sort(): 쿼리 파라미터를 사전순으로 정렬.
- toString(): 쿼리 문자열로 반환.
append(name, value)
지정된 이름과 값을 가진 새로운 쿼리 파라미터를 추가합니다. 동일한 이름의 파라미터가 여러 개 있을 수 있습니다.
const { URLSearchParams } = require('url');
const params = new URLSearchParams('name=John');
params.append('age', '30');
params.append('name', 'Jane');
console.log(params.toString()); // 'name=John&age=30&name=Jane'
set(name, value)
지정된 이름과 값을 가진 쿼리 파라미터를 설정합니다. 동일한 이름의 파라미터가 이미 존재하면, 그 값을 새로운 값으로 덮어씁니다.
const { URLSearchParams } = require('url');
const params = new URLSearchParams('name=John&age=30');
params.set('name', 'Jane');
console.log(params.toString()); // 'name=Jane&age=30'
get(name)
지정된 이름의 첫 번째 쿼리 파라미터 값을 반환합니다. 해당 이름의 파라미터가 없으면 null을 반환합니다.
const { URLSearchParams } = require('url');
const params = new URLSearchParams('name=John&age=30&name=Jane');
console.log(params.get('name')); // 'John'
getAll(name)
지정된 이름을 가진 모든 쿼리 파라미터의 값을 배열로 반환
const { URLSearchParams } = require('url');
const params = new URLSearchParams('name=John&age=30&name=Jane');
console.log(params.getAll('name')); // ['John', 'Jane']
has(name)
지정된 이름의 쿼리 파라미터가 존재하는지 여부를 확인
const { URLSearchParams } = require('url');
const params = new URLSearchParams('name=John&age=30');
console.log(params.has('name')); // true
console.log(params.has('job')); // false
delete(name)
지정된 이름의 모든 쿼리 파라미터를 삭제
const { URLSearchParams } = require('url');
const params = new URLSearchParams('name=John&age=30&name=Jane');
params.delete('name');
console.log(params.toString()); // 'age=30'
keys()
URLSearchParams 객체의 모든 키를 반복 가능한(iterable) 객체로 반환
const { URLSearchParams } = require('url');
const params = new URLSearchParams('name=John&age=30');
for (const value of params.values()) {
console.log(value);
}
// 출력: 'John', '30'
entries()
URLSearchParams 객체의 모든 키-값 쌍을 반복 가능한(iterable) 객체로 반환
const { URLSearchParams } = require('url');
const params = new URLSearchParams('name=John&age=30');
for (const [key, value] of params.entries()) {
console.log(`${key}: ${value}`);
}
// 출력: 'name: John', 'age: 30'
forEach(callback, [thisArg])
각 쿼리 파라미터에 대해 콜백 함수를 실행
const { URLSearchParams } = require('url');
const params = new URLSearchParams('name=John&age=30');
params.forEach((value, key) => {
console.log(`${key}: ${value}`);
});
// 출력: 'name: John', 'age: 30'
sort()
쿼리 파라미터를 이름의 사전순으로 정렬
const { URLSearchParams } = require('url');
const params = new URLSearchParams('b=2&a=1&c=3');
params.sort();
console.log(params.toString()); // 'a=1&b=2&c=3'
toString()
URLSearchParams 객체를 쿼리 문자열 형태로 반환
const { URLSearchParams } = require('url');
const params = new URLSearchParams({ name: 'John', age: '30' });
console.log(params.toString()); // 'name=John&age=30'
- URL 파싱: 주어진 URL 문자열을 파싱하여 해당 URL의 구성 요소를 추출합니다. 이를 통해 프로토콜, 호스트, 경로, 쿼리 매개변수 등의 정보를 가져올 수 있습니다.
- URL 생성: URL의 각 구성 요소를 조합하여 새로운 URL을 생성할 수 있습니다. 이는 동적으로 URL을 생성하여 웹 페이지나 API 엔드포인트로 리디렉션하는 데 사용될 수 있습니다.
- URL 해석 및 검증: 주어진 URL이 유효한지 확인하고, 필요한 구성 요소를 포함하고 있는지 검증할 수 있습니다. 이는 사용자가 입력한 URL을 검증하거나, 외부에서 받은 URL을 안전하게 처리하는 데 사용될 수 있습니다.
- 상대 URL 해석: 상대 URL과 기본 URL을 결합하여 절대 URL을 생성할 수 있습니다. 이를 통해 상대적인 URL 경로를 절대 경로로 변환하여 리소스에 대한 정확한 위치를 찾을 수 있습니다.
- URL 문자열 포맷팅: URL 객체를 문자열로 변환하여 사용자에게 전달하거나 로그에 기록할 수 있습니다. 이를 통해 디버깅이나 로깅 작업을 수행할 수 있습니다.
dns 모듈
Domain Name System(DNS)과 관련된 기능을 제공합니다. 이 모듈을 사용하여 도메인 이름을 IP 주소로 해석하거나, IP 주소를 도메인 이름으로 해석할 수 있습니다.
사용 목적
- 도메인 이름 해석: 주어진 도메인 이름에 대한 IP 주소를 찾습니다. 이를 통해 도메인 이름을 IP 주소로 변환하여 네트워크 통신에 사용할 수 있습니다.
- 역방향 DNS 조회: 주어진 IP 주소에 대한 도메인 이름을 찾습니다. 이를 통해 IP 주소를 도메인 이름으로 변환하여 웹 로그 등에서 사용자의 방문 도메인을 확인할 수 있습니다.
메서드 | 설명 |
dns.lookup(hostname[, options], callback) | 주어진 도메인 이름에 대한 IP 주소를 찾습니다. |
dns.resolve(hostname[, rrtype], callback) | 주어진 도메인 이름에 대한 IP 주소나 다른 DNS 레코드를 찾습니다. |
dns.reverse(ip, callback) | 주어진 IP 주소에 대한 도메인 이름을 찾습니다. |
dns.lookup(hostname[, options], callback)
const dns = require('dns');
dns.lookup('www.example.com', (err, address, family) => {
if (err) {
console.error('Error:', err);
} else {
console.log('IP Address:', address);
console.log('IP Version:', family); // IPv4 또는 IPv6
}
});
dns.resolve(hostname[, rrtype], callback)
dns.resolve('www.example.com', 'A', (err, addresses) => {
if (err) {
console.error('Error:', err);
} else {
console.log('IP Addresses:', addresses);
}
});
dns.reverse(ip, callback)
dns.reverse('8.8.8.8', (err, hostnames) => {
if (err) {
console.error('Error:', err);
} else {
console.log('Hostnames:', hostnames);
}
});
crypto : 암호화
다양한 암호화 및 해시 함수를 제공하여 데이터 보안에 사용됩니다.
- 암호화: 데이터를 암호화하여 안전하게 저장하거나 전송할 수 있습니다. 대칭 및 비대칭 암호화 알고리즘을 지원합니다.
- 해시: 데이터의 해시를 생성하여 데이터의 무결성을 검증하거나 암호화 없이 데이터를 안전하게 저장할 수 있습니다.
- 서명 및 검증: 데이터에 디지털 서명을 추가하여 데이터의 출처를 검증하고, 데이터의 무결성을 보장할 수 있습니다.
- 암호화 키 및 인증서 관리: 암호화에 필요한 키 및 인증서를 생성, 저장 및 관리할 수 있습니다.
- crypto.createHash: 해시 생성 (SHA256, MD5 등).
- crypto.createHmac: HMAC 생성 (서명, 인증).
- crypto.createCipheriv / crypto.createDecipheriv: 대칭키 암호화 및 복호화.
- crypto.generateKeyPairSync: 비대칭키(공개 키, 개인 키) 생성.
- crypto.randomBytes: 보안상 안전한 랜덤 바이트 생성.
- crypto.pbkdf2: 패스워드 기반 키 파생 함수(PBKDF2) 사용.
- crypto.createSign / crypto.createVerify: 디지털 서명 생성 및 검증.
대칭 암호화 (AES):
const crypto = require('crypto');
const secretKey = 'my_secret_key';
const plainText = 'Hello, world!';
// 암호화
const cipher = crypto.createCipher('aes-256-cbc', secretKey);
let encryptedText = cipher.update(plainText, 'utf8', 'hex');
encryptedText += cipher.final('hex');
console.log('Encrypted Text:', encryptedText);
// 복호화
const decipher = crypto.createDecipher('aes-256-cbc', secretKey);
let decryptedText = decipher.update(encryptedText, 'hex', 'utf8');
decryptedText += decipher.final('utf8');
console.log('Decrypted Text:', decryptedText);
해시 함수 (SHA-256):
const crypto = require('crypto');
const plainText = 'Hello, world!';
const hash = crypto.createHash('sha256');
hash.update(plainText);
console.log('Hash:', hash.digest('hex'));
crypto.createHash로 해시 객체를 생성하고, update 메서드를 통해 데이터를 처리한 후, digest 메서드로 임의 길이의 데이터를 고정된 길이의 해시 값으로 변환
hash.digest([encoding])
- encoding: 결과 해시 값을 출력할 형식(인코딩). 기본값은 Buffer 객체로 반환되며, hex, base64, latin1 등의 문자열 인코딩을 사용할 수 있습니다.
- 반환값: 해시 값 (문자열 또는 Buffer 객체)
디지털 서명 및 검증 (RSA):
const crypto = require('crypto');
const privateKey = crypto.generateKeyPairSync('rsa', {
modulusLength: 2048,
publicKeyEncoding: { type: 'spki', format: 'pem' },
privateKeyEncoding: { type: 'pkcs8', format: 'pem' }
}).privateKey;
const publicKey = crypto.createPublicKey(privateKey);
const data = 'Hello, world!';
const sign = crypto.sign('sha256', Buffer.from(data), { key: privateKey,
padding: crypto.constants.RSA_PKCS1_PSS_PADDING });
console.log('Signature:', sign.toString('base64'));
const verified = crypto.verify('sha256', Buffer.from(data), { key: publicKey,
padding: crypto.constants.RSA_PKCS1_PSS_PADDING }, sign);
console.log('Verified:', verified);
SHA(Secure Hash Algorithm)는 데이터 무결성을 보장하기 위해 사용되는 암호화 해시 함수의 집합입니다. SHA 알고리즘은 다양한 버전으로 제공되며, 각 버전은 해시 길이와 보안 수준이 다릅니다. 여기서는 주요 SHA 알고리즘의 종류와 특징을 설명하겠습니다.
1. SHA-1
- 해시 길이: 160비트 (20바이트)
- 설명: 1993년 미국 국가안보국(NSA)에 의해 개발된 초기 SHA 알고리즘 중 하나입니다. SHA-1은 한때 널리 사용되었지만, 2005년에 충돌 공격에 대한 취약성이 발견되었습니다. 이로 인해 현재는 보안 용도로 권장되지 않습니다.
- 사용 예시: Git에서의 버전 관리, 오래된 디지털 인증서 등(현재는 SHA-256 등의 알고리즘으로 대체 중).
2. SHA-2
SHA-2는 여러 해시 함수의 집합으로, 해시 길이에 따라 SHA-224, SHA-256, SHA-384, SHA-512 등의 알고리즘이 포함됩니다. SHA-2 계열은 SHA-1의 단점을 보완하고 강화된 보안성을 제공합니다.
2.1 SHA-224
- 해시 길이: 224비트 (28바이트)
- 설명: SHA-256의 축소 버전으로, 해시 길이가 짧은 변형입니다. 보안성은 SHA-256과 유사하지만 해시 길이가 더 짧습니다.
2.2 SHA-256
- 해시 길이: 256비트 (32바이트)
- 설명: 가장 널리 사용되는 SHA-2 알고리즘입니다. SHA-1의 대체로, 다양한 보안 프로토콜과 응용 프로그램에서 사용됩니다. 현재까지 매우 안전한 것으로 간주됩니다.
- 사용 예시: 블록체인(예: 비트코인), SSL/TLS 인증서, 디지털 서명.
2.3 SHA-384
- 해시 길이: 384비트 (48바이트)
- 설명: SHA-512의 축소 버전으로, 더 짧은 해시 길이를 제공합니다. 고급 보안이 요구되는 경우에 사용됩니다.
2.4 SHA-512
- 해시 길이: 512비트 (64바이트)
- 설명: SHA-2 계열 중 가장 강력한 해시 알고리즘 중 하나로, 긴 해시 길이를 통해 높은 보안성을 제공합니다. 금융, 정부, 군사 등 고도의 보안이 필요한 환경에서 사용됩니다.
- 사용 예시: 금융 거래, 정부기관 보안, 군사 시스템.
2.5 SHA-512/256 및 SHA-512/224
- 해시 길이: SHA-512/256은 256비트 (32바이트), SHA-512/224는 224비트 (28바이트)
- 설명: SHA-512의 구조를 기반으로 하되, 해시 길이를 각각 256비트와 224비트로 줄인 버전입니다. SHA-256 또는 SHA-224보다 약간 더 나은 성능을 제공할 수 있습니다.
3. SHA-3
- 해시 길이: 가변적 (SHA3-224, SHA3-256, SHA3-384, SHA3-512 등)
- 설명: SHA-3는 SHA-2와는 전혀 다른 구조(Keccak 알고리즘)를 사용하여 개발된 새로운 해시 알고리즘입니다. 2015년에 NIST에 의해 표준으로 채택되었습니다. SHA-3는 SHA-2에 대한 잠재적 취약성을 해결하기 위해 개발되었으며, 이론적으로 더 높은 보안성을 제공합니다.
- 사용 예시: 매우 높은 보안이 요구되는 시스템에서 사용될 수 있지만, 실질적인 차이는 크지 않으며 현재 대부분의 애플리케이션은 여전히 SHA-2를 사용하고 있습니다.
SHA 알고리즘의 사용 예시
- 데이터 무결성 검증: 파일이 전송되는 동안 변조되지 않았는지 확인하기 위해 해시를 계산하고 비교합니다.
- 디지털 서명: 메시지나 문서에 대한 디지털 서명을 생성할 때 해시를 사용하여 원본 데이터를 서명합니다.
- 비밀번호 저장: 비밀번호를 저장할 때, 원본 비밀번호 대신 해시 값을 저장하여 보안을 강화합니다.
- 블록체인: 블록체인 기술에서 거래의 무결성을 보장하기 위해 해시 함수가 사용됩니다.
정리
- SHA-1: 현재 보안 용도로는 권장되지 않음.
- SHA-2 계열 (SHA-224, SHA-256, SHA-384, SHA-512): 현재 대부분의 보안 애플리케이션에서 사용되는 표준 해시 알고리즘. 특히, SHA-256과 SHA-512가 널리 사용됨.
- SHA-3: SHA-2의 대안으로 개발된 알고리즘. 이론적으로 더 안전하지만, 실질적인 차이는 크지 않으며 현재 SHA-2가 널리 사용됨.
util: 유틸리티
유틸리티 함수와 기능을 제공하여 개발자가 코드를 작성하고 디버깅하는 데 도움을 줍니다.
- 상속 (Inheritance): 객체 지향 프로그래밍에서 클래스 간 상속을 쉽게 구현할 수 있도록 도와줍니다.
- 유틸리티 함수 (Utility functions): 자주 사용되는 함수들로, 디버깅, 포맷팅, 오류 처리 등을 보다 간편하게 수행할 수 있도록 도와줍니다.
메서드 | 설명 |
util.inherits(constructor, superConstructor) | 클래스 간 상속을 구현합니다. |
util.format(format[, ...args]) | 문자열을 포맷합니다. console.log()와 비슷한 형태로 사용됩니다. |
util.inspect(object[, options]) | 객체를 문자열로 변환하여 디버깅에 사용됩니다. |
util.promisify(original) | 콜백 패턴을 사용하는 함수를 프로미스로 변환합니다. |
util.inherits(constructor, superConstructor)
const util = require('util');
function Parent() {
this.name = 'Parent';
}
Parent.prototype.sayHello = function() {
console.log('Hello from', this.name);
};
function Child() {
this.name = 'Child';
}
util.inherits(Child, Parent);
const child = new Child();
child.sayHello(); // Hello from Child
util.format(format[, ...args])
const util = require('util');
const name = 'John';
const age = 30;
const formattedString = util.format('Name: %s, Age: %d', name, age);
console.log(formattedString); // Name: John, Age: 30
util.inspect(object[, options])
const util = require('util');
const obj = {
name: 'John',
age: 30,
nestedObj: {
key: 'value'
}
};
console.log(util.inspect(obj));
// { name: 'John', age: 30, nestedObj: { key: 'value' } }
util.promisify(original)
const util = require('util');
const fs = require('fs');
const readFileAsync = util.promisify(fs.readFile);
readFileAsync('example.txt', 'utf8')
.then(data => console.log(data))
.catch(err => console.error(err));
# console
console.log(message[, ...args]): 메시지를 콘솔에 출력합니다.
console.log('Hello, world!');
console.error(message[, ...args]): 에러 메시지를 콘솔에 출력합니다.
console.error('An error occurred!');
console.info(message[, ...args]): 정보 메시지를 콘솔에 출력합니다.
console.info('Information message');
console.warn(message[, ...args]): 경고 메시지를 콘솔에 출력합니다.
console.warn('Warning message');
console.dir(object[, options]): 객체의 속성 및 메서드 목록을 콘솔에 출력합니다.
const obj = { name: 'John', age: 30 };
console.dir(obj);
console.table(data[, columns]): 데이터를 테이블 형식으로 콘솔에 출력합니다.
const data = [
{ name: 'John', age: 30 },
{ name: 'Jane', age: 25 }
];
console.table(data);
console.time(label) 및 console.timeEnd(label): 코드 실행 시간을 측정하는 데 사용됩니다.
console.time('timer');
// 코드 실행
console.timeEnd('timer');
- 디버깅: 코드 실행 중 발생하는 오류를 추적하고 디버깅하는 데 사용됩니다. console.log()를 통해 중간 결과를 확인하거나, console.error()를 사용하여 오류 메시지를 기록합니다.
- 로깅: 애플리케이션의 실행 상태나 이벤트를 로그로 남기는 데 사용됩니다. 이는 나중에 애플리케이션의 동작을 분석하고 문제를 해결하는 데 도움이 됩니다.
- 성능 모니터링: 코드 실행 시간을 측정하고 성능 분석을 위해 console.time() 및 console.timeEnd()를 사용합니다.
- 정보 제공: 프로그램이 실행되는 동안 중요한 정보를 콘솔에 출력하여 사용자에게 제공하는 데 사용됩니다. 예를 들어, 애플리케이션의 설정 값이나 특정 이벤트 발생 여부 등을 콘솔에 기록할 수 있습니다.
- 테스트: 테스트 코드에서 예상한 결과와 실제 결과를 비교하여 테스트 결과를 콘솔에 출력하는 데 사용됩니다.
- 개발 환경 설정: 개발 중인 프로젝트의 개발 환경 설정을 확인하고 디버깅하는 데 사용됩니다.
console 객체는 개발 중에는 주로 사용되지만, 프로덕션 환경에서도 일부 로깅 및 모니터링 용도로 사용될 수 있습니다. 그러나 보안 및 성능 상의 이유로 프로덕션 환경에서는 로깅을 최소화하는 것이 좋습니다. 대신, 로깅 라이브러리를 사용하여 로그를 파일 또는 데이터베이스에 저장하는 것이 일반적입니다.
# 타이머 메서드
타이머 메서드를 사용하면 특정 시간이 지난 후에 함수를 실행하거나 일정한 간격으로 함수를 반복 실행할 수 있습니다
- setTimeout(callback, delay[, ...args]): 지정된 시간(밀리초)이 지난 후에 콜백 함수를 실행합니다.
- setInterval(callback, delay[, ...args]): 지정된 간격(밀리초)마다 콜백 함수를 반복 실행합니다.
- setImmediate(callback[, ...args]): 현재 이벤트 루프의 다음 반복에서 콜백 함수를 실행합니다.
- clearTimeout(timeout): setTimeout()으로 생성된 타이머를 취소합니다.
- clearInterval(interval): setInterval()로 생성된 타이머를 취소합니다.
- clearImmediate(immediate): setImmediate()로 생성된 타이머를 취소합니다.
setTimeout(callback, delay[, ...args]): 지정된 시간(밀리초)이 지난 후에 콜백 함수를 실행합니다.
setTimeout(() => {
console.log('Delayed message');
}, 1000); // 1초 후에 실행
setInterval(callback, delay[, ...args]): 지정된 간격(밀리초)마다 콜백 함수를 반복 실행합니다.
setInterval(() => {
console.log('Interval message');
}, 2000); // 2초마다 실행
setImmediate(callback[, ...args]): 현재 이벤트 루프의 다음 반복에서 콜백 함수를 실행합니다.
setImmediate(() => {
console.log('Immediate message');
});
clearTimeout(timeout): setTimeout()으로 생성된 타이머를 취소합니다.
const timeoutId = setTimeout(() => {
console.log('This message will not be displayed');
}, 1000);
clearTimeout(timeoutId);
clearInterval(interval): setInterval()로 생성된 타이머를 취소합니다.
const intervalId = setInterval(() => {
console.log('This message will not be displayed repeatedly');
}, 2000);
clearInterval(intervalId);
clearImmediate(immediate): setImmediate()로 생성된 타이머를 취소합니다.
const immediateId = setImmediate(() => {
console.log('This message will not be displayed immediately');
});
clearImmediate(immediateId);
- 비동기 작업 스케줄링: 특정 시간이 지난 후에 함수를 실행하거나 반복적으로 실행할 때 사용됩니다. 이는 특정 이벤트나 작업을 예약하여 나중에 실행되도록 하는 데 유용합니다.
- 타임아웃 처리: 일정 시간 동안 응답이 없는 경우 타임아웃을 설정하고 처리할 수 있습니다. 예를 들어, HTTP 요청이 일정 시간 내에 응답하지 않으면 연결을 닫는 등의 작업을 수행할 수 있습니다.
- 정기적인 작업 실행: 일정한 간격으로 함수를 실행하여 주기적으로 작업을 수행하는 데 사용됩니다. 예를 들어, 주기적으로 데이터베이스를 청소하거나 백그라운드 작업을 실행할 때 사용됩니다.
- 애니메이션 및 게임 루프: 게임 개발이나 애니메이션 개발에서 프레임 간의 간격을 제어하여 게임 루프를 구현하는 데 사용될 수 있습니다.
- 성능 모니터링: 코드 실행 시간을 측정하여 성능을 분석하는 데 사용됩니다. 코드의 실행 시간을 측정하고 특정 부분의 성능을 개선하는 데 도움이 됩니다.
주요 타이머 객체로는 setTimeout(), setInterval(), setImmediate() 등이 있습니다. 이러한 타이머 객체들을 사용하여 비동기적으로 코드를 실행하고 시간에 따라 이벤트를 관리하는 데 유용하게 사용됩니다.
'Node.js' 카테고리의 다른 글
[ Node ] 용어 (0) | 2024.09.28 |
---|---|
[ Node.js ] 05. 포스트맨 postman (0) | 2024.08.30 |
[ Node.js ] 04. crud , HTTP method, MySQL 연동 (0) | 2024.04.30 |
[ Node.js ] 03. express 서버 만들기 (0) | 2024.04.28 |
[ Node.js ] 01. 노드(node.js)의 정의 (0) | 2024.04.28 |