본문 바로가기
nodejs

[node.js] express - session : 로그인

by jinbro 2017. 6. 19.
[HTTP]
- 무상태성!


[쿠키 그대로 사용한다면]
- 쿠키에 모든 사용자 정보를 담아서 클라이언트에 전달
- 보안에 취약 : 중간 탈취, 쿠키 스토리지 탈취


[세션이란]
- 클라이언트 요청 시 사용자를 식별할 수 있는 id값이 담긴 쿠키 응답
- 헤더에 쿠키 그리고 요청 : 서버에서 쿠키를 받아 사용자 id값을 가지고 서버 측 db에 저장된 사용자 정보를 가지고 응답 할 때 사용
=> 동일한 session-id값을 가지고 요청하면 동일 클라이언트

- node 모듈 중 express 서버에서 session을 쉽게 구현할 수 있는 미들웨어를 제공하는 express-session이 있음
- 설치하기 : npm i express-session 


[express-session 사용하기 : 로그인 정보 유지]
- 1.5.0 version부터 cookie-parser를 같이 사용하지않아도 됨 : req, res 객체로 쿠키를 직접 받고 응답함
=> 부딪칠 수 있는 설정값이 있으므로, 함께 사용하기위해서 api 문서를 읽고 설정값을 맞춰주면 됨
=> express-session은 쿠키에 sid를 담아 클라이언트에 응답(최초 응답 시)함 : sid를 가지고 동일한 브라우저인지 판단
=> sid 구분없이 데이터를 리턴한다면 cookie-parser를…..?!


1) express 서버 구현 : 코드 생략

2) express-session 사용하기
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
41
42
43
44
45
46
47
/* middleware */
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(session({
  secret: '1q2w3e4r',
  resave: false,
  saveUninitialized: true
}));
 
 
/* route */
/* mypage */
app.get('/user', (req, res) => {
 
  let content;
 
  if(req.session.userName){
      /* 리얼 쿠키값에 저장된 아이디를 뷰에서 사용할 수 있도록 함 : session-id값에 맞는 아이디를 줄 수 있도록 설계를 해야겠지 원래는?  */
      /* 리얼 쿠키가 있을 때 로그인 정보가 나옴(sid에 맞는 리얼 cookie에 저장된 값) */
      content = `<h1>${req.session.userName} 님 안녕하세요.</h1>`;
    } else {
      content = `<form action='/user' method='post'>
<p>아이디 : <input type='text' name='name' /></p>
<p>비밀번호 : <input type='password' name='pwd' /></p>
<input type='submit' value='로그인' />
</form>`;
    }
 
  res.send(content);
});
 
 
/* login */
app.post('/user', (req, res) => {
  /* 로그인 할 때 세션 쿠키에 session-id값 넣어서 주고, 리얼 쿠키에 아이디 저장 그리고 메인 페이지로 리다이렉트 */
 
  /* req.body로 받은 정보 db랑 확인하고 맞다면 세션쿠키와 리얼쿠키  */
  let isRight = false;
  if(userInfo.nick === req.body.name && userInfo.pwd === req.body.pwd){
    isRight = true;
  }
 
  if(isRight){
    req.session.userName = userInfo.name;
  } else {
    res.status(401).redirect('/user');
  }
 
  res.redirect(301'/user'); /* 상태 코드를 달리할 수 있음 : 3XX 코드 참고*/
});
 
cs

- req.session : 요청 객체의 객체 프로퍼티 - 쿠키값(실제 데이터 값), 쿠키 설정이 담긴 객체

=> sessionID 발급해줄 때 쿠키값 설정 : req.session 내 저장



- req.sessionID : 클라이언트 구분 session-id
=> 두개의 브라우저에 리턴된 req.sessionID값 콘솔 로그찍어본 결과

- 흐름 : session id가 담긴 쿠키를 첫 응답 시 주고, session id에 일치하는 쿠키값을 가지고 서버에서 처리 후 응답
- 아래는 세션이 유지되는지 확인한 짤


3) 정리
- 세션은 쿠키를 가지고 쿠키 방식 클라이언트 구별을 보안한 방법 
- session id 구별은 express-session을 사용해서 쉽게 처리
- ejs와 같은 뷰 템플릿을 활용하면 js 코드에서 태그를 쓰지않아도됨....
- db를 활용해서 정보를 조회하고 req.body에 담긴 내용과 비교 후 세션 발급을 하면 되겠음


[더하기]
- 세션 스토리지


[참고자료]
- github, express-session readme.md : https://github.com/expressjs/session


댓글