[Youtube 클론코딩] 세션 설정 마무리하기, 환경 변수

2022. 11. 4. 21:47공부/Javascript

세션 정보 DB에 저장하기

express-session - npm (npmjs.com)

 

express-session

Simple session middleware for Express. Latest version: 1.17.3, last published: 6 months ago. Start using express-session in your project by running `npm i express-session`. There are 4431 other projects in the npm registry using express-session.

www.npmjs.com

express-session에서 설명하듯 session data는 쿠키에 저장되는 것이 아니라 서버 측에 저장된다.

그리고 디폴트로 사용되는 session storage는 MemoryStore 즉, 메모리에 저장되므로 서버가 재기동하면 모든 세션 정보가 초기화된다.

 

따라서 우리는 Session data들을 DB에 저장해야 한다.

express-session은 수많은 DB에 대응하는 API들을 제공한다. 물론 Mongo DB용도 있음.

connect-mongo - npm (npmjs.com)

 

connect-mongo

MongoDB session store for Express and Connect. Latest version: 4.6.0, last published: a year ago. Start using connect-mongo in your project by running `npm i connect-mongo`. There are 685 other projects in the npm registry using connect-mongo.

www.npmjs.com

보면 session 설정을 해준 공간에 store 프로퍼티를 추가하면 된다.

예시)

세션 조건 변경하기

우리는 현재, 모든 접근에 대해 세션쿠키를 발행하며 세션에 세션 정보를 저장한다.

그러나 봇 또는 비로그인한 사용자가 계속 접근하게 되면 세션정보때문에 DB의 모든 용량을 써버리게 된다.

따라서 우리는 세션을 기억할 필요가 있는 접근(로그인한 사용자 등)만 세션쿠키를 발행할 필요가 있다.

resave

request동안 세션을(수정되지 않은 세션도 포함) 세션 스토어에 저장하는 속성.

보통 클라이언트가 서버에 두개의 병렬요청을 하고 다른 요청이 종료될 때 세션에 대한 변경 내용이 덮어쓰기 되는 경합조건을 만들 때 사용된다.

또는 내 store가 touch method를 지원하면 보통 false로, 지원하지 않고 세션에 Expiration date를 설정한 경우 resave가 필요할 수 있으므로 true로 하는것이 좋다.

saveUninitialized

uninitialized(초기화되지 않은) 세션을 저장소에 강제로 저장하는 속성.

로그인 세션을 구현하거나 서버 저장소 사용을 줄이거나 하려면 false로 설정하는게 좋다.

 

따라서 우리는 저 위의 두 옵션을 false로 만들어주게 되면 더 이상 비 로그인 사용자의 세션을 저장하지 않게 된다.

 

쿠키 프로퍼티

쿠키에는 여러가지 프로퍼티가 존재한다.

Domain

쿠키를 발급한 도메인 정보가 여기에 담긴다.

브라우저가 해당 도메인에 접근하면 도메인이 일치하는 쿠키만 서버로 전송한다.

Secret

쿠키에 서버가 사인할 때 사용하는 문자열.

session hijacking 공격을 방지하기 위해 각 서버는 자신이 발행한 쿠키임을 식별하기 위해 쿠키에 사인을 하는데

그 사인에 들어가는 문자열이 바로 secret 프로퍼티이다.

길고 복잡할수록 효과적이다.

Expires / Max-Age

Expires는 쿠키가 만료되는 시점을 나타내는 프로퍼티다.

지정하지 않을 시 쿠키는 세션 쿠키가 되어 브라우저 종료 시 삭제된다.

Max-Age는 쿠키가 언제까지 유효하는지 기간을 나타내는 프로퍼티로, 세션쿠키 또한 이 값을 가지고 있다.

단위는 ms이며 해당 기간이 지나면 쿠키는 브라우저에서 소멸한다.

 

쿠키 프로퍼티를 지정하려면 session에 cookie 속성을 추가해주면 된다.

환경 변수 설정하기

우리는 앞서 데이터베이스를 만들 때 DB의 주소를 하드코딩 했었다.

이 경우, 코드가 해킹될 경우에 매우 취약하므로 이를 숨겨주어야 한다.

dotenv - npm (npmjs.com)

 

dotenv

Loads environment variables from .env file. Latest version: 16.0.3, last published: a month ago. Start using dotenv in your project by running `npm i dotenv`. There are 30929 other projects in the npm registry using dotenv.

www.npmjs.com

dotenv는 환경변수를 사용할 수 있게 해주는 패키지다.

 

먼저 프로그램이 실행되는 가장 첫번째에 패키지를 import 해준다.

우리의 프로그램은 init.js에서 시작하므로 init.js 최상단에 저걸 적어준다.

그런데 여기서 주의할 점은 우리는 require가 아니라 import로 파일들을 불러오므로 이게 하위 파일들에 적용이 되지 않는다.

그래서 사용할 모든 파일에 전부 require문을 적어주어야 하는 불편함이 발생한다.

이를 다음처럼 고쳐주면 해결된다.

 

이후 src 폴더 바깥에 .env 파일을 생성한 뒤, 사용할 환경 변수들을 설정한다.

사용이 필요한 곳에서 process.env.환경변수 로 사용한다.

.gitignore에 .env 파일을 등록한다.

 

완성.