본문 바로가기
전공 수업/웹 서버 프로그래밍(Node.js)

[7주 차] - URLSearchParams(searchParams), querystring, 단방향과 양방향 Encryption, 파일 시스템에 접근하는 모듈 fs

by TwoJun 2023. 4. 14.

    과목명 : 웹 서버 프로그래밍(Web Server-side programming with Node.js)

수업일자 : 2023년 04월 13일 (목)

Node.js & Express.js

 

 

 

 

 

1. url module - URLSearchParams (searchParams) 객체

1-1. URLSearchParams 객체

(1) URL을 처리함에 따라 WHATWG 방식의 Query String 영역 처리를 도와주는 객체입니다.

 

(2) 웹 페이지의 URL에서 Query String을 추출하여 특정 정보를 가져와야 하는 경우 URLSearchParams 객체를 사용할 수 있습니다.

 

 

 

 

1-2. URLSearchParams(searchParams) 객체의 여러 가지 메소드

(1) searchParams.getAll(Key)

- Query String 중에서 Key에 해당하는 모든 Value 값들을 가져올 수 있습니다.

 

 

(2) searchParams.get(Key)

- Query String 중에서 Key에 해당하는 첫 번째 Value 값을 가져올 수 있습니다.

 

 

(3) searchParams.has(Key)

- Query String 중에서 해당 Key가 존재하는지 검사하고 Boolean 값을 반환합니다.

 

 

(4) searchParams.keys()

- Query String 중에서 모든 Key의 값을 순회할 수 있는 Iterator 객체로 가져올 수 있습니다.

 

 

(5) searchParams.values()

- Query String 중에서 모든 Value의 값을 순회할 수 있는 Iterator 객체로 가져올 수 있습니다.

 

 

(6) searchParams.append(Key, Value)

- Query String 영역에 해당 Key-Value 한 쌍의 값을 추가시킵니다.

 

 

(7) searchParams.set(Key, Value)

- searchParams.append(Key, Value) 메소드와 동일한 역할을 수행하지만, 매개변수로 넘겨준 Key 값이 이미 존재한다면 해당 Key 값을 제거하고 매개변수로 준 한 쌍의 값으로 새로 추가하게 됩니다. (기존 Key의 값을 수정하는 역할)

 

 

(8) searchParams.delete(Key)

- Query String 중에서 해당 Key 값을 제거합니다.

 

 

(9) searchParams.toString()

- searchParams 객체를 다시 문자열의 형태로 변환합니다. 해당 문자열을 search에 대입하면 주소 객체에 반영됩니다.

 

 

 

 

1-3. searchParams 예제 Code

const { URL } = require('url');

const myURL = new URL('http://www.gilbut.co.kr/?page=3&limit=10&category=nodejs&category=javascript');
console.log('searchParams:', myURL.searchParams);
console.log('searchParams.getAll():', myURL.searchParams.getAll('category'));
console.log('searchParams.get():', myURL.searchParams.get('limit'));
console.log('searchParams.has():', myURL.searchParams.has('page'));

console.log('searchParams.keys():', myURL.searchParams.keys());
console.log('searchParams.values():', myURL.searchParams.values());

myURL.searchParams.append('filter', 'es3');
myURL.searchParams.append('filter', 'es5');
console.log(myURL.searchParams.getAll('filter'));

myURL.searchParams.set('filter', 'es6');
console.log(myURL.searchParams.getAll('filter'));

myURL.searchParams.delete('filter');
console.log(myURL.searchParams.getAll('filter'));

console.log('searchParams.toString():', myURL.searchParams.toString());
myURL.search = myURL.searchParams.toString();

 

<실행 결과>

Command : node searchParams.js

 

 

 

 

 

 

2. querystring 모듈

2-1. querystring module

(1) url Query String을 해석하고 formatting 등 url 조작을 용이하도록 도와주는 모듈이고, 기존 노드 방식에서는 url Query String을 querystring 모듈로 처리했습니다. 만약 Express.js를 사용한다면 querystring보다는 body-parser를 사용합니다.

 

(2) Node에서 require() 함수로 querystring 모듈을 불러와서 사용할 수 있습니다.

 

 

 

 

2-2. querystring.parse(Query)

- url의 Query 부분을 자바스크립트의 객체로 분해합니다.

 

 

 

 

2-3. querystring.stringify(객체)

- 분해된 Query 객체를 문자열로 변환합니다.

 

 

 

 

2-4. querystring 모듈 예제 Code

const url = require('url');
const querystring = require('querystring');

const parsedUrl = url.parse('http://www.gilbut.co.kr/?page=3&limit=10&category=nodejs&category=javascript');
const query = querystring.parse(parsedUrl.query);
console.log('querystring.parse():', query);
console.log('querystring.stringify():', querystring.stringify(query));

 

<실행 결과>

Command : node querystring.js

 

 

 

 

 

 

3. One-way encryption (단방향 암호화, crypto)

3-1. One-way encryption

(1) 암호화는 가능하지만 복호화는 불가능한 일방향적인 암호화 방식입니다.

 

(2) Node에서 require() 함수로 crypto 모듈을 불러와서 사용할 수 있습니다.

 

 

 

 

3-2. Encryption & Decryption?

(1) Encryption(암호화)

- 평문(Plaintext)을 암호로 변환하는 과정입니다.

 

(2) Decryption(복호화)

- 암호화된 암호문을 다시 평문으로 해독하는 과정입니다.

 

 

 

 

3-3. 단방향 암호화의 대표적인 알고리즘 : 해시(Hash) 기법

(1) 해시(Hash) 기법은 기존 문자열을 해시 함수(Hash function)를 이용해 고정된 길이의 암호화된 문자열로 바꾸는 암호화 기법을 의미합니다.

Hash function

 

 

 

 

3-4. Hash 기법 예제 Code

(1) crypto.createHash(알고리즘)

- 매개변수에는 사용할 Hash 알고리즘을 넣어줄 수 있습니다.

 

- md5, sha1, sha256, sha512 등의 알고리즘이 있으며 md5와 sha1 알고리즘의 경우 현재 취약점이 발견된 상태입니다.

 

- 현재 상태로는 sha512 정도로 충분하지만 추후에 sha512도 취약점이 공개된다면 보다 더 강화된 알고리즘 사용이 필요합니다.

 

 

(2) crypto.createHash(알고리즘).update(문자열)

- 매개변수로 암호화에 사용될 기존 문자열을 넣습니다.

 

 

(3) crypto.createHash(알고리즘).update(문자열).digest(인코딩)

- 매개변수로 인코딩에 사용할 알고리즘을 넣습니다.

 

- base64, hex, latin1이 주로 사용되는데 base64가 결과 문자열이 가장 짧은 편에 속해 자주 사용됩니다.

 

- 결과물로 변환된 문자열을 반환합니다.

const crypto = require('crypto');

console.log('base64:', crypto.createHash('sha512').update('비밀번호').digest('base64'));
console.log('hex:', crypto.createHash('sha512').update('비밀번호').digest('hex'));
console.log('base64:', crypto.createHash('sha512').update('다른 비밀번호').digest('base64'));

 

<실행 결과>

Command : node hash.js

 

 

 

 

3-5. pbkdf2 알고리즘

(1) 암호화에서 해당 pbkdf1 및 pbkdf2 알고리즘은 무차별 암호 대입 공격에 대한 취약성을 감소시키는데 사용되는 슬라이딩 계산 비용이 존재하는 핵심 파생 함수이고, 패스워드 암호화 알고리즘의 한 종류입니다. (Wikipedia 정의)

 

 

(2) 최근 컴퓨터의 발달로 기존 암호화 알고리즘이 위협받고 있습니다.

- sha512가 취약해진다면 sha3 알고리즘이 사용되어야 합니다.

 

- 현재는 pbkdf2나 *bcrypt, scrypt 알고리즘으로 비밀번호를 암호화하고 있습니다.

 

- Node의 경우 pbkdf2와 scrypt지원합니다.

 

- *bcrypt, scrypt : 패스워드 암호화에 사용되는 알고리즘의 종류

pbkdf2

 

 

 

 

3-6. pbkdf2 알고리즘 예제 Code

(1) crypto.randomBytes(bytes)

- 해당 crypto 모듈의 randomBytes() 메소드로 Random string을 쉽게 얻을 수 있습니다.

 

- randomBytes() 메소드로 64 Byte 문자열을 생성하는 것 → salt 역할

 

 

(2) crypto.pbkdf2('암호화할 문자열(비밀번호)', salt, 반복 횟수, 출력 바이트, 해시 알고리즘)

- 반복 횟수를 조정하여 암호화하는 데 1초 정도 소요되도록 설정해 주는 것이 권장되고 있습니다.

const crypto = require('crypto');

crypto.randomBytes(64, (err, buf) => {
  const salt = buf.toString('base64');
  console.log('salt:', salt);
  crypto.pbkdf2('비밀번호', salt, 100000, 64, 'sha512', (err, key) => {
    console.log('password:', key.toString('base64'));
  });
});

 

<실행 결과>

Command : node pbkdf2.js

 

 

 

 

 

 

4. Two-way encryption (양방향 암호화)

4-1. Two-way encryption

(1) 암호화된 데이터에 대한 복호화가 가능한 암호화의 방식을 의미합니다.

 

(2) 암호화 시 Key가 사용되며 대표적으로 대칭키, 공개키 암호화(Symmetric-key, Public-key encryption) 방식이 존재합니다.

 

(3) 암호화, 복호화 진행 시 같은 Key를 사용하여 진행할 수 있습니다.

 

(4) Node에서 require() 함수로 crypto 모듈을 불러와서 사용할 수 있습니다.

 

 

 

 

4-2. 양방향 암호화에 사용되는 메소드와 예제 Code

(1) crypto.createCipher(Algorithm, Key)

- 암호화 알고리즘과 Key를 매개변수로 넣습니다. 암호화 알고리즘은 aes-256-cbc를 사용할 수 있고 다른 암호화 알고리즘을 사용해도 됩니다. 사용 가능한 알고리즘 목록은 crypto.getCiphers() 메소드를 통해 확인할 수 있습니다.

 

 

(2) cipher.update(String(data), Input_encoding, Output_encoding)

- 암호화할 대상과 대상의 인코딩, 출력 결과물의 인코딩을을 매개변수로 넣습니다. 보통 데이터로 들어가는 문자열은 utf8 인코딩을 사용하고 암호는 base64 기법을 많이 사용합니다.

 

 

(3). cipher.final(Output encoding)

- 출력 결과물의 인코딩을 매개변수로 넣어주면 암호화가 완료됩니다.

 

 

(4) crypto.createDecipher(Algorithm, Key)

- 복호화할 때 많이 사용하고, 매개변수로 암호화할 때 사용했던 알고리즘과 Key를 그대로 넣어주어야 합니다.

 

 

(5) decipher.update(String(data), Input_encoding, Output_encoding)

- 암호화된 문장, 해당 문장의 인코딩, 복호화할 인코딩을 매개변수로 넣습니다. createCipher의 update()에서 utf8, base64 순으로 넣었다면 createDecipher의 update()에서는 base64, utf8 순으로 넣어주면 됩니다.

 

 

(6) decipher.final(Output_encoding)

- 복호화 결과물의 인코딩을 매개변수로 넣어줄 수 있습니다. (출력 결과물의 인코딩을 매개변수로 넣어주면 복호화 완료)

 

const crypto = require('crypto');

const algorithm = 'aes-256-cbc';
const key = 'abcdefghijklmnopqrstuvwxyz123456';
const iv = '1234567890123456';

const cipher = crypto.createCipheriv(algorithm, key, iv);
// encryp, decryp => 입력 문자열이 한글인 경우 utf8 추가.
let result = cipher.update('encryption statement', 'utf8', 'base64');
result += cipher.final('base64');
console.log('encryption value:', result);

const decipher = crypto.createDecipheriv(algorithm, key, iv);
let result2 = decipher.update(result, 'base64', 'utf8');
result2 += decipher.final('utf8');
console.log('decryption value:', result2);

 

<실행 결과>

Command : node cipher.js

 

 

 

 

 

 

5. 파일 시스템에 접근할 수 있는 module : fs

5-1. fs module

(1) fs 모듈의 경우 파일 시스템에 접근하여 파일 처리와 관련된 전반적인 작업을 할 수 있도록 해 주는 모듈입니다.

 

(2) 파일이나 디렉토리 생성, 삭제, 읽기, 쓰기가 가능합니다.

 

(3) 웹 브라우저에서는 제한적이었으나 Node는 해당 권한을 가지고 있습니다.

 

(4) require() 함수로 모듈을 불러와서 사용합니다.

 

 

 

 

5-2. 파일 읽기 예제 Code

const fs = require('fs');

fs.readFile('./readme.txt', (err, data) => {
  if (err) {
    throw err;
  }
  console.log(data);
  console.log(data.toString());
});

 

<실행 결과>

Command : node readFile.js

 

 

 

 

5-3. 파일 생성하기 예제 Code

const fs = require('fs');

fs.writeFile('./writeme.txt', 'writeme.txt example', (err) => {
  if (err) {
    throw err;
  }
  fs.readFile('./writeme.txt', (err, data) => {
    if (err) {
      throw err;
    }
    console.log(data.toString());
  });
});

 

<실행 결과>

Command : node writeFile.js

 

 

 

 

 

 

6. Reference

Node.js 교과서(Node.js Textbook) - 저자 : 조현영 

https://www.zerocho.com/book/1 

 

ZeroCho Blog

ZeroCho의 Javascript와 Node.js 그리고 Web 이야기

www.zerocho.com

 

 

 

- 학부에서 수강했던 전공 수업 내용을 정리하는 포스팅입니다.

- 내용 중에서 오타 또는 잘못된 내용이 있을 시 지적해 주시기 바랍니다.

댓글