세션과 쿠키와 토큰

nmy0502·2020년 5월 26일

설치

npm install --save express-session cookie-parser jsonwebtoken

expressjs

기본 사용 - 세션

const session = require('express-session');

app.use(session({
  ket: 'sid' // 세션의 키 값
  secret: 'keyboard cat', // 비밀키를 지정
  resave: false, // 세션이 변경되지 않았어도 저장할 지 여부(false를 권장)
  saveUninitialized: true, // 세션이 저장되기전에 uninitialize 상태로 만들어 저장
  store: db, // 세션이 서버 메모리가 아닌 다른 저장소에 넣을지 설정 
  cookie: { // 자동으로 생성되는 쿠키 기본 설정
  	path: '/',
    _expires: null,
    originalMaxAge: null,
    httpOnly: true
  }
}));

// 기본 쿠키 세팅값

세션 저장

Session Store
세션 스토어는 세션이 데이터를 저장하는 곳. 대표적으로 Memory Store, File Store, Mongo Store 가 있고 default값은 Memory Store이다. 메모리는 서버나 클라이언트를 껐다 키면 사라지는 휘발성 특성이 있어 기본적으로 세션은 브라우저를 종료하면 사라진다. npm 모듈인 File Store(설치필요)는 데이터를 파일로 저장한다.

npm install --save session-file-store

기본 저장소가 아닌 다른 저장소를 사용했을 때 폴더가 자동으로 생성된다.

서버에서 세션 사용하기

const showSess = (req, res) => {
   console.log(req.session)
}; // 정보 확인해서 사용!

session github
요것도 한 번 읽어보자
읽어보자2
세션이랑 쿠키랑 같이 해서 예제 잘 나온듯


기본 사용 - 쿠키

const cookieParser = require("cookie-parser");

app.use(cookieParser());

cookie('key', 'value', option)
cookie('key2', 'value2', option)

// 옵션이 없을 경우 세션 쿠키 === 브라우저를 닫으면 사라진다.
option = {
  secure: true or false, // 주소가 "https"로 시작하는 경우에만 쿠키 생성
  httpOnly: true or false, // http에서만 쿠키활용 가능. defalt: true
  
  path: '/' // 경로. 주어진 경로의 하위 디렉토리에 있는 경우에만 쿠키 설정. defalt: '/' 는 전체.
  domain: ".cookie.com", // 하위 도메인을 제외한 도메인이 일치하는 경우에만 쿠키 설정. defalt: loaded
  
  maxAge: null // 60 * 1000 = 60000 = 60초 // 쿠키가 만료되는 시간. 밀리초 단위. 0으로 설정하면 쿠키가 지워진다.
  expires: null, // 쿠키의 만료 시간을 표준 시간으로 설정
  
  signed: , // 쿠키의 서명 여부
  
  sameSite: "Strict" or "Lax" or "None" // 서로 다른 도메인간의 쿠키 전송에 대한 보안을 설정. defalt: "Lax"
  // "Strict" : 서로 다른 도메인에서 아예 전송 불가능. 보안성은 높으나 편의가 낮다.
  // "Lax" : 서로 다른 도메인이지만 일부 예외( HTTP get method / a href / link href )에서는 전송 가능.
  // "None" : 모든 도메인에서 전송 가능
  // 좀더 자세히는 https://web.dev/samesite-cookies-explained/
}

// 쿠키 생성
cookie('key', 'value', { path: '/' });
// 쿠키 삭제 - 생성할 때와 똑같은 path를 사용
clearCookie('key', { path: '/' });

쿠키정책이란게 있다고 한다.

sameSite: "Lax" 일 경우 사이트 간 요청 위조 CSRF(Cross Site Request Forgery) 취약해질 가능성이 높다.

sameSite : 서로 다른 도메인간의 쿠키 전송에 대한 보안을 설정

mdn Cookies인데..프론트용인 것 같다
자동로그인을 구현하는 예제가 잘 나와있는듯
router.get('/', function(){}) 일 때, 로그인여부를 판단하는게 맞긴한데...


기본 사용 - 토큰

const jwt = require('jsonwebtoken');

const addToken = (result) => {
  const { id, user_name } = result.dataValues;
  const userInfo = {
    user_id: id,
    user_name: user_name,
  };
  userInfo.token = jwt.sign(userInfo, process.env.JWT_SECRET || 'forSecret', {
    expiresIn: '1d',
    issuer: 'goodthing',
    subject: 'user_info'
  });
  return userInfo;
};

//

const checkToken = (req, res) => {
  const token_info = jwt.verify(req.cookies.token, process.env.JWT_SECRET || 'forSecret', function(err, token) {
    if (err) {
      return res.sendStatus(400);
    } else {
      return token;
    }
  })
  return token_info;
};

passport라는 것도 있나본데??

profile
개발자가 되기위해 공부중!

0개의 댓글