[node, express] 세션 session
시작에 앞서 쿠키는 웹 브라우저에 저장되는 key = value 타입의 데이터이다 따라서 누구나 key에 따른 value를 알수 있기에 정보를 쉽게 탈취 당할 수 있으므로 중요 정보를 넣는 역할은 적절하지 않다
Session은 이러한 문제점을 고려 쿠키를 업그레이드 했다고 비유해도 무방하지 않다
왜나하면 쿠키와 달리 서버에 데이터를 저장하고 웹 브라우저는 session ID만을 가지고 있기에
비교적 안전하기 때문이다
세션의 동작을 간단하게 나누어 보면
- 서버는 웹 브라우저에게 세션 값을 보내준다 (sid 라고 하며, 아무런 의미도 없는 단순 식별자)
- 클라이언트가 접속할때 자신이 가지고 있는 sid를 서버에 전달
- 서버는 클라이언트가 보내준 sid를 가지고 해당 유저를 식별
대신 저장소를 사용하는 것이 아니기에 공식 사이트에서도 같이 사용할 패키지 등을 설명하고 있다
그중애서 mysql을 사용한다고 치자
(1) express-session 설정
var session = require('express-session'); (1)
var MySQLStore = require('express-mysql-session')(session); (2)
var options ={ (3)
host: 'localhost',
port: 3306,
user: '',
password: '',
database: ''
};
var sessionStore = new MySQLStore(options); (4)
app.use(session({ (5)
secret:"asdfasffdas",
resave:false,
saveUninitialized:true,
store: sessionStore (6)
}))
-
express-session 모듈을 로드합니다.
-
express-mysql-session 모듈을 로드하되, 인자로 session을 넘겨줍니다.
-
데이터베이스에 접속하는 것이므로, host, port, user, password, database 정보를 객체로 저장해둡니다.
-
앞서 저장한 객체를 MySQLStore() 함수의 인자로 넘겨줍니다. 이 때 생성되는 객체를 sessionStore라는 변수에 저장합니다.
-
session() 미들웨어를 설치합니다. secret은 keyboard cat으로 랜덤한 값을 입력해줍니다. secret 값은 공개되어서는 안됩니다. resave와 saveUninitialized는 세션을 다시 저장하냐, 초기화하냐 정도의 옵션인 것 같은데 저도 잘 모르겠습니다.. 보통 false와 true로 설정한다고 합니다.
-
저장소를 앞서 DB 연결로 생성된 sessionStore 객체로 지정합니다. (제가 지정한 DB에 session 테이블이 생성됨을 확인할 수 있습니다.)
(2) session 사용하기
app.get('/login', function(req,rsp){
var post = req.body;
db.query('select member.id as id, password, author_id,name from member left join author on member.author_id = author.id where member.id=? and password=?',
[post.id,post.password], function(err,result){
if(err) throw err;
if(result[0]!==undefined){
req.session.uid = result[0].id; (1)
req.session.author_id = result[0].author_id;
req.session.isLogined = true;
//세션 스토어가 이루어진 후 redirect를 해야함.
req.session.save(function(){ (2)
rsp.redirect('/');
});
}
});
}
DB에서 데이터를 읽고 사용자가 보낸 id,password와 일치하는지 확인하고 일치한다면 세션에 데이터를 기록하는 코드이다
(여기에는 hash없이 비밀번호를 저장하지만 원래는 그렇게 하면 안된다)
express-session을 사용하면 request.sesstion 객체가 생성됨 해당 객체에 property를 할당 함으로써 세션에 값을 줍니다
세션을 세션스토어에 저장이 끝나면 function() 이 실행 save() 부분이 없으면 session store에 저장하는 일보다 redirect가 먼저 실행되어 로그인 상태가 유지가 안되는 버그(?)가 발생할 수 있습니다.
(3) session 데이터 삭제하기
delete req.session.uid;
delete req.session.isLogined;
delete req.session.author_id;
req.session.save(function(){
rsp.redirect('/');
});
이 방법은 session에 할당되었던 값을 지우는 방법입니다. 이 방법은 세션 자체를 삭제하는 것이 아니므로 DB에 세션값이 삭제되지 않습니다. 위의 코드와 마찬가지로 DB에 반영을 끝낸 후 redirect하는 것이 포인트입니다.
Author And Source
이 문제에 관하여([node, express] 세션 session), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@dnjswls1459/node-express-세션-session저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)