2018년 4월 16일 월요일

Node.js - 스터디 4주차 - Auth (OrientDB / MySQL)

https://opentutorials.org/course/2136/
생활코딩 강의를 이용해 진행하는 스터디 4주차.

4/16(월) :: 34강 'Auth - OrientDB' 부터 35강 'Auth - MySQL' 까지.

Auth - OrientDB


참고로 OrientDB엔 OUser, ORestricted와 같은 사용자 관련 내장 인증 체계를 가지고 있는데 이를 이용하면 직접 사용자와 관련된 것을 구축하는데 소요되는 시간과 노력을 덜 수 있다고 한다. Storage 단에서 뭘 얼마나 더 편하게 해주는지 궁금하긴 하지만 일단 pass.

스키마 설정

Schema에 들어가서 user란 클래스를 만들자. 그리고 애플리케이션에서 사용하는 프로퍼티를 등록해주자. 애플리케이션에서 필수로 받아야 하는 authId, displayName 속성엔 Mandatory, Not Null를 부여한다. 그리고 user.authId를 UNIQUE 타입의 Index로 지정하자. Index를 생성해줌으로써 authId를 이용한 쿼리에 대한 검색 성능을 향상시킬 수 있다.

애플리케이션 세팅

세션에 대한 처리와 사용자 정보 읽기/쓰기 작업을 해주어야 한다. 우선 예전 강의에서처럼 session의 store 타입을 OrientoStorage로 지정해준다. 프로그램을 다시 시작하면 OrientDB의 Session 테이블에 정보가 자동으로 추가되는 것을 확인할 수 있다.

var OrientoStore = require('connect-oriento')(session);
var config = {
  session: {
    server: "host=localhost&port=2424&username=root&password=111111&db=02"
  }
}
app.use(session({
  secret: 'my-secret-key', // for encrypt session id.
  resave: false,
  saveUninitialized: true,
  store: new OrientoStore(config.session)
}));

그리고나서 사용자 정보를 읽고 쓰는 과정인 Register / Login을 구현해주어야 한다. OrientDB 사용을 위해 'orientjs' 모듈을 가져온 후, OrientDB 접속을 위한 객체를 생성하고, 사용 선언을 한다. 코드는 아래와 같다.

var OrientDB = require('orientjs');
var server = OrientDB({
  host:
  port:
  username:
  password:
});
var db = server.use('o2');

마지막으로 메모리 레벨에서 동작하던 users 관련 코드를 OrientDB 버전의 insert, select구문으로 변경해주면 된다.


Auth - MySQL


OrientDB 버전에서와 마찬가지로 사용자 정보를 관리할 테이블을 생성한다.

스키마 설정

create table users(
    id INT NOT NULL AUTO_INCREMENT,
    authId VARCHAR(50) NOT NULL,
    username VARCHAR(30),
    password VARCHAR(255),
    salt VARCHAR(255),
    displayName VARCHAR(50),
    PRIMARY KEY(id),
    UNIQUE(authId)
) ENGINE = InnoDB;

애플리케이션 세팅

session의 store 타입을 다시 mysql로 지정해준 후 애플리케이션을 재시작하면 MySQL이 sessions 테이블을 자동으로 생성하고 관련 세션 정보를 기록하는 것을 확인할 수 있다.

var MySQLStore = require('express-mysql-session')(session);
app.use(session({
  secret: 'my-secret-key', // for encrypt session id.
  resave: false,
  saveUninitialized: true,
  store: new MySQLStore({
    host: 'localhost',
    port: 3306,
    user: 'root',
    password: '111111',
    database: 'o2'
  })
}));

사용자 정보를 읽고 쓰기 위해 mysql 모듈을 로드한다. Session 스토어는 단순히 브라우져 세션 데이터를 관리하기 위한 장치이고, 실제 사용자 등록과 로그인 과정은 MySQL과 passport.js를 이용해 직접 구현해주어야 한다. MySQL에 대한 초기화 코드는 아래와 같다.

var mysql = require('mysql');
var conn = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: '111111',
  database: 'o2'
});
conn.connect();

사용자 등록

앞선 강의에서 보았듯 MySQL 모듈에서 치환자는 '?'를 사용하는데 여기서 나아가 key-value 객체를 바로 쿼리에 할당할 수 있는 편의 기능이 지원된다.

app.post('/auth/register', function(req, res) {
  hasher({password: req.body.password}, function(err, pass, salt, hash) {
    var user = {
      authId: 'local:' + req.body.username,
      displayName: req.body.displayName,
      username: req.body.username,
      password: hash,
      salt: salt
    }
    var sql = 'INSERT INTO users SET ?';
    conn.query(sql, user, function(err, results) {

위 구문과 같이 치환자 '?' 하나로 원하는 파라미터를 넣어줄 수 있다. user 객체의 property는 db 스키마의 column 이름과 같아야 한다.

댓글 없음:

댓글 쓰기