먼저 이번 포스팅에서 다룰 것은 제목과도 같이 어떤 것들을 주고 받는지 살펴보고자 한다.
세팅 내용
이전 포스팅에서 다뤘듯, express-session을 통해 session을 설정하고,
session.data 객체를 추가하여 내용들을 담았다.
1. express-session의 설정
//index.js
const sessionStore = new MySQLStore({
createDatabaseTable: true,
schema: {
tableName: 'sessions',
columnNames: {
session_id: 'session_id',
data: 'data',
expires: 'expires',
},
},
host: DB_HOST,
user: DB_USER,
password: DB_PASSWORD,
database: DB_NAME,
});
app.use(
session({
name: 'sessionID',
secret: key,
resave: false,
saveUninitialized: false,
store: sessionStore,
cookie: {
//세션로그인이므로 expires, maxAge 만료시간 설정 x
httpOnly: true,
},
// db에서 조회되는 sessionData 만료시간 설정하여 쿠키는 남아있더라도 세션은 유효하지 않게됨.
expires: new Date(Date.now() + 3600000),
})
);
session에서 설정한 값들은 name, secret, resave, saveUninitialized, store, cookie다.
name : 이전 포스팅에서 쿠키 이름을 설정한 방법으로, 쿠키를 확인했을 때 보이는 값이다.
기본값은 connect.sid이다. 이번에 공부하면서 sid가 sessionID임을 알았다.
secret : 세션 식별자를 서명하는 데 사용되는 비밀 키를 설정하는데, env에 설정해 두었다.
이 키를 입력하면 클라이언트가 서버로 세션을 요청했을 때 검증하는 과정에서 사용하는 것으로,
쿠키에 해당 secret의 암호화된 값이 들어가기 때문에 사용자는 암호화된 secret의 값을
쿠키를 통해 가지고 있고, 쿠키의 유효성을 검증할 때 이 secret을 통해 사용자가 맞는지 확인한다.
resave : 요청이 발생할 때마다 세션을 다시 저장할지 여부를 설정하는 것이다.
아무런 변경사항이 없어도 다시 세션을 저장하기 때문에
false로 설정하여 매 요청마다 세션을 다시 저장하지 않고 재사용하도록 했다.
saveUninitialized : 이름 그대로 uninitialized 인 세션을 저장할지 여부를 설정하는 것이다.
서명이 되지 않은 세션 즉, 유효하지 않은 세션을 저장할지 여부인데,
db에 세션을 저장하므로 유효하지 않은 세션을 굳이 저장할 이유는 없어 false로 설정했다.
-> 클라이언트의 서버 방문 횟수에 따라 등급을 달리 하고 싶을 때 쓸 수 있다고 하는데,
기록해두고 나중에 필요할 때 로직에 대해 더 공부해봐야겠다.
store : 가장 상단 sessionStore에 세션이 저장될 저장소를 지정해두었다.
mysql을 사용했고, 테이블 및 컬럼의 이름을 지정하여 sql문을 쓰지 않고 바로 insert할 수 있다.
그리고 mysql에 접근할 수 있도록 host, user, pw, db 값을 입력해 주었다.
cookie : 이 부분에 대해 이전에도 많이 다루며 공부했는데,
설정할 수 있는 부분들이 많다.
옵션으로는 요렇게 있으나, 각각의 값들을 다 설정하는 것은 과하다고 판단했고,
공부하면서 필요한 값들만 추가하기로 생각했다.
일단 지금은 httpOnly만 true로 설정하여 클라이언트에서 쿠키에 접근하는 것을 막았다.
expires와 maxAge에 대해서는 이전에 다루었듯,
쿠키의 유효기간을 설정하게 됨으로 목적인 세션로그인에서 벗어나기에 설정하지 않았다.
expires : 여기서 많이 헷갈렸는데, 쿠키랑 세션은 엄연히 구분해야 한다.
세션로그인이기에 쿠키는 만료시간을 설정하지 않고, 로그아웃했을 때만 쿠키를 없애도록 하여
로그인상태를 유지하도록 하지만, 세션 만료기간을 1시간으로 설정하여
1시간 뒤에 db에서 세션을 없애도록 하였다.
이외에도 proxy, unset 등이 있으나 아직 공부하지 않아서 사용하지는 않았다.
공부한 뒤 별도로 포스팅하고, 추후 사용할 기회가 있다면 좋을 것 같다.
2. 내가 커스터마이징한 session.data 객체에 추가한 값
//sessionController.js
const now = new Date();
const koreanTime = 9 * 60 * 60 * 1000;
const koreanNow = new Date(now.getTime() + koreanTime);
req.session.data = {
authenticateUser: true,
user: username,
createdAt: koreanNow.toISOString().slice(0, 19).replace('T', ' '),
};
사실 필요해서 넣었다기 보다는 공부하면서 어떤 값들을 넣는게 의미가 있을지를 고민하다가
필요하다고 생각이 드는 값들로 구성했다.
authenticateUser로 해당 세션이 유효한지, 로그인한 사용자의 username,
그리고 세션이 생성된 시간이다.
사실 createdAt은 expires에 대해 자세히 공부하기 전에 당연히 expires가 필요하다고 생각하여
만료시간을 효율적으로 계산하기 위해 생성된 시각도 기록해둔 것인데,
결론적으로 문제가 생겼을 때 로그를 확인할 수 있는 데이터가 되지 않을까 싶다.
'개발 > 프로젝트' 카테고리의 다른 글
[세션 / 토큰 로그인 프로젝트] 진행 과정(3) 중간점검(mvc 설계) (0) | 2023.07.13 |
---|---|
간단한 랜덤 이미지 뷰어(랜덤문제출제) feat.github api (0) | 2023.07.12 |
[세션 / 토큰 로그인 프로젝트] 진행 과정(1) 쿠키 전달한 이후 어떻게 검증할 것인가? (0) | 2023.07.08 |
[세션 / 토큰 로그인 프로젝트] 진행 전 공부 과정.. express에서 지원하는 쿠키? 세션 쿠키? 쿠키와 세션 구분하기 (0) | 2023.07.07 |
[세션 / 토큰 로그인 프로젝트] 구성 및 개요 (0) | 2023.07.06 |