웹서버에서 로그인 기능을 구현할 때 유저를 인증해야 하는 상황이 생긴다.
예를 들어 구글을 방문할 때마다 로그인을 해야 한다면 정말 번거로울 것이다.
브라우저는 이런 번거로움을 줄이기 위해 쿠키와 세션을 사용한다.
쿠키(Cookie)
쿠키에는 유저의 정보를 담을 수 있다.
쿠키는 이름, 값, 만료일(저장 기간 설정), 경로 정보로 구성되어 있다.
웹서버는 클라이언트로부터의 요청에 응답하기 전 필요에 따라 쿠키를 생성해 유저에게 전달한다.
도메인마다 각각 다른 쿠키를 제공하는데, 만약 클라이언트가 같은 도메인에 다시 방문하면
갖고 있던 쿠키를 서버에 전송하게 되고 서버는 쿠키에 있는 정보를 보고 유저를 인증한다.
쿠키는 텍스트 형태로 사용자의 PC에 저장되고 저장할 수 있는 용량에 한계가 있다.
세션(Session)
서버에 클라이언트의 상태 정보를 저장하는 기술이다.
브라우저는 클라이언트에게 Session ID를 부여하는데
이것을 쿠키에 넣어서 서버에 전송하면 서버는 Session ID를 보고 유저를 인증할 수 있다.
Object의 형태이며 사용자의 PC에 저장되는 쿠키와 달리 서버에 저장되고 용량 제한이 없다.
그리고 파일로 저장되는 쿠키에 비해 보안이 강하다는 장점이 있다.
Cookie, Session 사용법
Node.js에서 쿠키와 세션을 사용하는 방법이다.
npm i express-session
먼저 위의 명령어로 라이브러리를 설치해준다.
그리고 express-session 라이브러리를 import 한다.
const session = require('express-session')
package.json을 사용한다면 아래처럼도 가능하다.
import session from "express-session";
클라이언트가 아무것도 하지 않고 가만히 있는 동안에는 서버와의 교류가 없다.
클라이언트가 서버에 요청을 보내고 서버가 응답을 하는 순간에만 정보를 주고받을 수 있기 때문에
쿠키, 세션은 요청과 응답의 중간인 미들웨어를 통해서 구현해야 한다.
먼저 간단한 서버를 만들어보겠다.
import express from "express";
const app = express();
app.get("/", (req, res) => {
res.send("Welcome!");
});
app.listen(4000, () => {});
화면에 Welcome! 을 출력해주는 간단한 서버이다.
이제 코드에 세션을 추가해보겠다.
import express from "express";
import session from "express-session";
const app = express();
app.use(
session({
secret: "asdfasfsdf",
resave: false,
saveUninitialized: false,
cookie: {
maxAge: 14 * 24 * 60 * 60 * 1000,
},
})
);
app.get("/", (req, res) => {
res.send("Welcome!");
});
app.listen(4000, () => {});
앞서 말했듯이 미들웨어 함수인 app.use를 통해 세션을 생성해야 한다.
세션에는 여러 가지 매개변수를 설정할 수 있다.
secret
secret에 들어간 값을 이용해서 세션 ID가 생성된다.
보안상 중요한 값이기 때문에 .env 파일에 넣어서 사용해야 한다.
resave
세션 ID가 변경되지 않았을 때 다시 저장할 것인지를 설정할 수 있다.
웬만한 경우에는 다시 저장하는 것이 서버 작동 효율을 떨어뜨릴 수 있기 때문에
false 값을 적용한다.
saveUninitialized
true 값을 적용하면 새로운 유저가 유입될 때마다 세션 ID를 생성한다.
모든 유저를 데이터베이스에 저장하면 용량이 부담되기 때문에
꼭 필요한 경우가 아니면 false 값을 적용한다.
보통은 유저가 로그인을 할 때 세션 ID를 생성한다.
cookie-MaxAge
쿠키의 사용 기간을 정한다.
밀리초 단위로 설정해야 하므로 위의 코드는 2주를 의미한다.
유저의 세션 ID를 생성하면 서버에도 세션 ID가 저장된다.
그래서 다음에 방문할 때 유저의 쿠키에 있는 세션 ID를 저장된 ID와 비교해서 유저를 인증할 수 있다.
하지만 세션 ID를 서버에 저장하면 서버가 재시작될 때마다 저장된 ID가 사라진다.
그래서 세션 ID는 데이터베이스에 저장해야 한다.
세션을 데이터베이스에 저장하려면 추가로 라이브러리를 설치해야 한다.
각각의 데이터베이스마다 설치방법이 다르지만 나는 MongoDB를 사용하기 때문에
npm i connect-mongo
import MongoStore from "connect-mongo";
위처럼 connect-mongo를 설치 후 import 해준다.
그리고 세션에 store값을 추가해준다.
import express from "express";
import session from "express-session";
import MongoStore from "connect-mongo";
const app = express();
app.use(
session({
secret: "asdfasfsdf",
resave: false,
saveUninitialized: false,
cookie: {
maxAge: 14 * 24 * 60 * 60 * 1000,
},
store: MongoStore.create({ mongoUrl: "mongodb://127.0.0.1:48945/project" }),
})
);
app.get("/", (req, res) => {
res.send("Welcome!");
});
app.listen(4000, () => {});
이렇게 MongoDB에 세션을 연결시킬 수 있다.
mongoUrl 역시 자신만 알 수 있게 .env 파일에 저장하는 것이 좋다.
이번 포스팅에서는 쿠키와 세션, 세션 설치 후 세팅, 그리고 MongoDB에 연결하는 것까지 알아봤다.
다음에는 세션을 어떻게 사용하는지 다뤄보겠다.