로그인 구현 - 2 Express 세션과 암호화

임혁진·2024년 2월 5일
0

로빌

목록 보기
11/15

Express session 미들웨어 와 redis

로그인 기능을 만드는 중 세션을 구현하면서 express-session이라는 미들웨어를 사용한다. 그런데 이 express-session미들웨어는 겉에서 보면 마치 일반적인 cookie를 사용하는 것처럼 session내용을 파싱해준다. 그렇다면 이 마법처럼 일어나는 일은 실제로 어떻게 구현된 것일까?

// sessionMiddleware.js
const session = require("express-session");
const RedisStore = require("connect-redis").default;
const Redis = require("ioredis");
require("dotenv").config();
const SESSION_MAX_AGE = Number(process.env.SESSION_MAX_AGE);

const redisClient = new Redis({
  port: 6379,
  host: process.env.REDIS_HOST,
  password: process.env.REDIS_PASSWORD,
  db: 0,
});

const sessionMiddleware = session({
  store: new RedisStore({ client: redisClient }),
  secret: process.env.SESSION_SECRET,
  resave: false,
  saveUninitialized: true,
  cookie: { maxAge: SESSION_MAX_AGE },
});

module.exports = sessionMiddleware;

redis storage를 세션스토어로 지정한 미들웨어를 설정한 모습이다. 이 미들웨어를 추가하면 secret을 이용해 암호화한 session key를 발급해 이를 브라우저에 전달한다. 그리고 요청이 올 때마다 브라우저에서 secret을 이용해 redis에서 session데이터를 가져오고 이를 req.session 필드에 저장해준다.

미들웨어가 없다면 redis에 session key를 통해 값을 찾는 과정이 필요한데 이 과정을 캡슐화해서 마치 cookie와 같은 인터페이스로 세션 데이터에 접근할 수 있도록 한 것이다.

이후에 이 세션 스토어를 passport로 (..이후에 수정)

비밀번호 암호화

bcrypt

비밀번호를 salt와 hashing알고리즘을 통해 암호화한다. 단순히 한번의 해싱으로 비밀번호를 저장할 수도 있지만 더 난이도를 높이고 해독 비용을 조절할 수 있는 방법이 있다. 해싱을 여러번 반복해서 해독하기 위한 비용을 높이는 방법과 고유한 랜덤salt를 이용하여 레인보우 테이블에 대해 비밀번호들을 고유하게 격리시키는 방법이 있다.

bcrypt는 이러한 해싱의 수준을 scalable하게 설정할 수 있는 모듈이다. 저수준의 단순한 인터페이스(salt rounds와 password)를 통해 고비용 해싱을 얻어낼 수 있다. 또한 보안 모듈이니 만큼 많은 사람들이 쓴다는 사실도 중요하다.

bcrypt의 해싱 알고리즘

Blowfish kdf
https://d2.naver.com/helloworld/318732

profile
TIL과 알고리즘

0개의 댓글