2018년 4월 9일 월요일

Node.js - 스터디 3주차 - MySQL, Cookie

https://opentutorials.org/course/2136/

생활코딩 강의를 이용해 진행하는 스터디 3주차.

4/9(월) :: 22강 'MySQL 소개 및 기본 사용법' 부터 26강 'cookie 2' 까지.

MySQL 소개 및 기본 사용법


이전 강의에서 진행한 OrientDB 버전의 글쓰기 웹 애플리케이션을 MySQL 버전으로 다시 작성하는 강의다.

MySQL이 설치되어 있지 않다면, wamp bitnami를 이용해 MySQL을 설치한다. PHP 관련 프레임워크는 설치할 필요가 없으니 최소화된 set으로 설치하도록 한다. 윈도우 기준 기본 설치 경로는 'C:\Bitnami\wampstack-7.1.16-0' 이고, bitnami에서 제공하는 manager-windows.exe를 통해 Apache 웹 서버와 MySQL의 서비스 동작 상태를 확인할 수 있다.

간단한 명령들..
접속 > mysql -uroot -p {password}
DB목록확인> show databases;
DB생성> CREATE DATABASE o2 CHARACTER SET utf8 COLLATE utf8_general_ci;
DB사용> use o2;
테이블 생성>
CREATE TABLE `topic` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `title` varchar(100) NOT NULL,
 `description` text NOT NULL,
 `author` varchar(30) NOT NULL,
 PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
show tables;

//

Node.js - MySQL 연동.


npm install node-mysql --save
사용법: https://www.npmjs.com/package/mysql

1) 이전 강의에서 진행했던 OrientDB가 RDB에서 사용하는 기본적인 형태의 SQL을 지원했기 때문에 module을 불러오고, connection을 얻는 방법, callback으로 꽂히는 데이터의 형태만 확인해보자. (SELECT에선 복수의 RowDataPacket이, INSERT/UPDATE/DELETE에선 단일 OkPacket 객체를 반환한다.)

2) 치환자는 '?'를 쓴다.
var sql = 'INSERT INTO topic (title, description, author) VALUES (?, ?, ?)';
var params = ['Supervisor', 'Watcher', 'graphittie'];
conn.query(sql, params, function (err, rows, fields) { ... });


http


http = Web browser의 요청(request), 그리고 Web server 의 응답(response)에 대한 규약. 이 규약의 핵심은 request headers와 response headers인데 Chrome 검사 도구의 Network 탭에서 상세한 내용을 확인할 수 있다.


cookie 1


쿠키는 브라우저 환경에서 사용자의 상태를 유지하기 위한 작은 기록 정보 파일을 일컫는다. 이 수단은 넷스케이프의 개발자 루 몬틀리가 고안한 뒤로 지금까지도 많이 쓰이고 있다. 쿠키는 컴퓨터내에서 프로그램처럼 실행될 수 없으며 바이러스를 옮길 수도, 악성코드를 설치할 수도 없다. 하지만 스파이웨어를 통해 유저의 브라우징 행동을 추적하는데에 사용될 수 있고, 누군가의 쿠키를 훔쳐서 해당 사용자의 웹 계정 접근권한을 획득할 수도 있다. (from wikipedia)

cookie를 테스트해보는 예제로 count 앱을 구현하기로 한다. cookie 기능을 사용하기 위해선 cookie-parser라는 미들웨어를 이용해야 한다.

설치>
npm install cookie-parser --save

설치하고 나면 코드에서는,
var cookieParser = require('cookie-parser');
app.use(cookieParser());

와 같이 해준다.
count 앱은 브라우저에 쿠키에 지정된 count 값을 출력해주는 단순한 앱이다. response의 cookie에 값을 지정하면, request의 cookie에 서버가 지정해준 값이 유지되는 것을 확인할 수 있다.

app.get('/count', function (req, res) {
  if (req.cookies.count) {
    var count = parseInt(req.cookies.count);
  } else {
    var count = 0;
  }
  count = count + 1;

  res.cookie('count', count);
  res.send('count : ' + count);

});


cookie2


두번째 예제로 쿠키를 이용해 쇼핑몰 카트와 유사한 기능에 대한 것이다. 쿠키를 이용해 사용자의 입력을 쿠키를 이용해 유지할 수 있는 구조와 동작을 구현해본다.



그리고 나서 cart 목록을 출력하는 구문을 작성한다.
uri는 '/cart', method는 'get'.


마지막으로 쿠키와 관련된 구현에서 개발자는 보안에 신경을 써주어야 한다. 쿠키 값에 대해 보안을 고려하지 않으면 자칫 민감하게 다루어져야 할 정보가 그대로 유출될 수 있기 때문이다. 특히 사용자의 아이디와 암호와 관련된 정보는 절대로 쿠키에 기록하지 않도록 하자. https나 쿠키 값에 대한 암호화를 사용한다 하더라도 이는 올바른 구현 방법이 아니다.

쿠키에 대한 암호화 방법은 다음과 같다. 우선 cookieParser 미들웨어에 대한 사용을 선언할 때 암호화-key를 지정해줄 수 있다. 그렇게 하고나서 아래와 같이 req에선 signedCookies를, res에선 { signed: true } 옵션을 지정하는 것을 통해 암호화된 쿠키 정보를 다룰 수 있다.

app.use(cookieParser('your-secret-key'));

app.get('/count', function (req, res) {
  if (req.signedCookies.count) {
    var count = parseInt(req.signedCookies.count);
  } else {
    var count = 0;
  }
  count = count + 1;

  res.cookie('count', count, { signed: true });
  res.send('count : ' + count);
});

댓글 없음:

댓글 쓰기