D+32
어떤 페이지 구현할 것인지
로그인/회원가입 화면 구현하기
DB에 정보 저장할 수 있게 구현하기
mySQL/mongoDB사용
mysql설치하기
[node.js+mysql] 회원가입/로그인 구현하기
mysql을 사용하기 위해 먼저 app.js파일에 연결 설정을 해주어야 한다.
1 2 3 4 5 6 7 8 9 10 11 12 | // mysql 모듈 불러오기 var mysql = require('mysql');
//MySQL 연결 설정 var pool = mysql.createPool({ connectionLimit : 10, host : 'localhost', user : 'root', password : '123456', database : 'test', debug : false }); |
관계형 데이터베이스에 연결할 때에는 보통 커넥션 풀(connection pool)을 사용한다. 이는 데이터베이스 연결 객체가 너무 많이 만들어지는 것을 막고 한 번 만든 연결을 다시 사용할 수 있게 한다. 커넥션 풀은 createPool 메소드에 객체를 추가하여 만든다. 객체의 종류에는 connectionLimit, host, port, user, password, database, debug가 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | //사용자를 등록하는 함수 var addUser = function(id, name, age, password, callback) { console.log('addUser 호출됨 : ' + id + ', ' + password + ', ' + name + ', ' + age);
// 커넥션 풀에서 연결 객체를 가져옴 pool.getConnection(function(err, conn) { if (err) { if (conn) { conn.release(); // 반드시 해제해야 함 } callback(err, null); return; } console.log('데이터베이스 연결 스레드 아이디 : ' + conn.threadId);
// 데이터를 객체로 만듦 var data = {id:id, name:name, age:age, password:password};
// SQL 문을 실행함 var exec = conn.query('insert into users set ?', data, function(err, result) { conn.release(); // 반드시 해제해야 함 console.log('실행 대상 SQL : ' + exec.sql);
if (err) { console.log('SQL 실행 시 에러 발생함.'); console.dir(err); callback(err, null); return; } callback(null, result); });
conn.on('error', function(err) { console.log('데이터베이스 연결 시 에러 발생함.'); console.dir(err); callback(err, null); }); }); } |
사용자를 등록하는 함수 즉, 회원가입 하는 함수이다. 데이터를 객체로 만드는 부분은 회원가입 과정에서 이름, 아이디, 패스워드 등을 입력할 때 한 묶음으로 정보를 저장하기 위한 과정이다. 객체 안의 정보가 하나라도 틀리면 그는 일치하는 정보가 아닌 것이다. SQL문으로 표현하면 다음과 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | // 사용자를 인증하는 함수 var authUser = function(id, password, callback) { console.log('authUser 호출됨 : ' + id + ', ' + password);
// 커넥션 풀에서 연결 객체를 가져옴 pool.getConnection(function(err, conn) { if (err) { if (conn) { conn.release(); // 반드시 해제해야 함 } callback(err, null); return; } console.log('데이터베이스 연결 스레드 아이디 : ' + conn.threadId);
var columns = ['id', 'name', 'age']; var tablename = 'users';
// SQL 문을 실행합니다. var exec = conn.query("select ?? from ?? where id = ? and password = ?" , [columns, tablename, id, password], function(err, rows) { conn.release(); // 반드시 해제해야 함 console.log('실행 대상 SQL : ' + exec.sql);
if (rows.length > 0) { console.log('아이디 [%s], 패스워드 [%s] 가 일치하는 사용자 찾음.', id, password); callback(null, rows); } else { console.log("일치하는 사용자를 찾지 못함."); callback(null, null); } });
conn.on('error', function(err) { console.log('데이터베이스 연결 시 에러 발생함.'); console.dir(err); callback(err, null); }); }); } |
사용자를 인증하는 함수 즉, 로그인 하는 함수이다. 클라이언트로부터 전달받는 파라미터는 아이디와 비밀번호이다. authUser함수는 두 개의 파라미터와 함께 콜백 함수를 전달 받는다. 그 안에서 getConnection 메소드를 통해 커넥션 풀에서 연결 객체를 가져온다. 그 다음에는 연결 객체의 쿼리 메소드로 SQL문을 실행하는데 데이터를 조회해야 하기 때문에 select문을 사용한다. 쿼리 메소드로 전달하는 첫 번째 파라미터는 SQL문이고 두 번째 파라미터는 배열객체이다. 쿼리문은 ?? 또는 ? 기호를 통해 나타낸다.
OAuth와 JWT
JWT는 토큰 유형이고 OAuth는 토큰을 발급하고 인증하는 방식이다. 또한 bearer기반의 토큰방식이다. access token은 주로 세션에 담아서 관리한다. refresh token은 중요하기 때문에 주로 데이터베이스에 저장하고 관리한다.
oauth2-server 모듈 사용
app.oauth = oauthserver({
model : require(‘./oauth/model’), //oauth2의 각종 인증 함수를 구현해 놓은 곳
grants : [‘password’],
debug : true
});
[oauth2-server 모듈 공부하기]
https://www.npmjs.com/package/node-oauth2-server - 참고하기
https://oauth2-server.readthedocs.io/en/latest/docs/getting-started.html - 여기도 참고하기
'동계현장실습' 카테고리의 다른 글
19.02.25 월요일 (0) | 2019.02.26 |
---|---|
19.02.20 수요일 (0) | 2019.02.21 |
19.02.18 월요일 (0) | 2019.02.19 |
19.02.14 목요일 (0) | 2019.02.15 |
19.02.13 수요일 (0) | 2019.02.13 |