session이란?
session은 네트워크 환경에서 사용자 및 컴퓨터 간 대화를 위한 논리적인 연결 또는 컴퓨터의 프로세스들 사이에 통신하기 위해 메시지를 교환하여 서로를 인식한 이후부터 통신을 마칠 때 까지의 시간을 의미한다. 세션은 통신 주체들 사이에 활성화된 접속이므로 일정 시간이 지나면 세션이 종료되어야 하고, 비인가자에 대한 세션 가로채기(Session Hijaking)을 통제할 필요가 있다.
일반적인 웹 페이지에서 세션을 이용한 통신구조는 아래와 같다. 사용자가 본인의 아이디와 비밀번호를 통해 로그인을 하면 서버는 인증(Authentication)에 성공했다고 판단한다. 인증에 따라 사용자의 적절한 인가(Authorization)이 달라지기 때문에 사용자는 본인에게 인가된 서비스를 마음껏 이용할 수 있다.
사용자가 적절한 인가 서비스에 접근하기 위해서 서버는 사용자가 인증에 성공한 사용자라는 사실을 알아야 하고, 클라이언트는 인증 성공을 증명할 수단을 가지고 있어야 한다. 사용자가 인증에 성공하여 서버와 클라이언트간 통신이 확립된 상태를 세션(session)이라고 한다.
인증에 성공한 사용자의 최초 요청에 대해 서버는 session Store에 세션 정보를 저장하게 된다. 보통 redis DB를 사용해서 세션 정보를 저장한다. 세션이 한번 생성되면 세션을 구분할 수 있는 세션ID가 발급되고 이것이 클라이언트가 본인이 인증에 성공한 사용자라는 증명이 된다. 즉, 서버가 클라이언트에 유일하고 암호화된 ID를 부여하는 것이 세션ID다.
로그인 상태를 유지하기 위해서 세션정보는 cookie에 저장된다. 반드시 쿠키를 사용해서 세션 정보를 저장해라는 규칙은 없지만 대다수의 웹 사이트에서 쿠키에 세션정보를 저장한다.(사용하기 가장 간편하기 때문임) 이 때 세션을 위해 사용하는 쿠키를 세션 쿠키라고 한다. 따라서 JS로 접근하는 XSS 공격에 취약하기 때문에 세션ID는 암호화된 상태로 cookie에 저장된다. 이 후 클라이언트는 서버로 부터 받은 sessionID를 cookie에 저장하고 있다가 header에 태워 요청함으로써 본인에게 인가된 적절한 서비스를 받을 수 있게 된다.
Logout?
Logout은 서버와 클라이언트간 통신이 종료됨을 의미한다. 하지만 session은 서버에 저장되어 있고, cookie는 클라이언트에 저장되어 있기 때문에 서버가 관리중인 session 정보는 삭제할 수 있지만 클라이언트가 보관하고 있는 cookie에 담긴 sessionID에 접근할 수 없다.
Logout을 위해서는 서버가 먼저 세션정보를 삭제하고, 클라이언트의 cookie을 갱신해야 한다. 서버는 set-cookie로 세션 아이디의 키값을 무효한 값으로 대체함으로써 더이상 클라이언트가 인증된 사용자라는 증명서를 파기하고, 세션이 종료되게 된다.
cookie VS session
cookie는 별다른 옵션이 없는한 무기한 데이터가 저장되는 저장소다. 따라서 민감한 user 정보를 담은 인증정보를 cookie에 저장하는 것은 현명한 선택이 아니다. 반면 session은 클라이언트 인증 정보를 담아서 cookie에 전송한다. 즉 민감한 인증 정보를 서버에서 관리할 수 있기 때문에 보안성이 높다.
desc | 상태 저장 경로 | 장점 | 단점 | |
cookie | HTTP stateless 보완 도구 | 클라이언트 | 서버 부담 경감 | 인증 수단 부적절 |
session | 접속 상태를 서버에서 관리하며, 접속 상태와 권한 부여를 위해 sessionID를 cookie에 저장 | 서버 | 인증된 클라이언트 여부를 서버에서 체크할 수 있음 | - 하나의 서버에 대한 접속 상태를 가지고 있기 때문에 분산 서비스에는 부적절. - 가용 메모리 갉아먹음 |
세션은 cookie에 비해 보안성이 높지만 세션 정보를 서버에서 관리하기 때문에 서버의 가용 메모리를 갉아먹는다는 단점을 가지고 있다. 이 때문에 세션 정보를 저장하기 위한 데이터베이스 서버를 따로 관리하는 이유다. 또한 session이 cookie를 완전히 대체하는 수단이 아니기 때문에 HttpOnly 옵션이 걸려있지 않은 cookie에 session 정보를 저장하는 경우 XSS 공격에 취약한 단점을 가지고 있다.
Node.js session 모듈 express-session
session을 관리해주는 Node.js 모듈로는 express-session이 존재한다. express-session은 쉽게 말해 세션을 위한 미들웨어로써 세션을 다룰 수 있는 공간을 쉽게 생성해주는 역할이다. 추가로 필요한 경우 세션 ID를 cookie에 저장하고 해당 session ID에 종속되는 session 정보를 서버 메모리에 저장해준다.
express-session에서 req.session이 바로 세션 객체다. 각각의 세션들은 독립적인 존재이므로 각각 다른 데이터를 저장할 수 있게 된다. req.session을 사용해서 세션 데이터를 저장하거나 읽어올 수 있게 된다. express-session에는 cookie에 관한 옵션 뿐만 아니라 세션에 관한 설정을 지정해준다.
express-session options
- resave : 요청이 들어오는 경우 세션에 수정 사항이 생기지 않더라도 세션을 다시 저장할지 지정
- saveUninitialized : 세션에 저장할 내역이 없는 경우라 할지라도 처음부터 세션을 생성할지 지정
- secret : session 정보를 cookie에 저장할 때 암호화 하기 위한 값
- cookie : 암호화된 세션정보를 쿠키에 담기 위한 옵션. 쿠키 옵션 더 알아보기
- name : 세션 정보를 특정할 수 있는 이름
express-session 예시
const session = require('express-session');
app.use(session({
resave : false,
saveUninitialized : false,
secret : process.env.COOKIE_SECRET,
cookie : {
httpOnly : true,
secure : false,
expires : new Date(Date.now() + 12),
maxAge : 12,
},
name : 'session-cookie'
}))
Reference
'Programming' 카테고리의 다른 글
[Algorithm] 삽입 정렬(insert sort) Javascript 구현하기 (0) | 2022.06.09 |
---|---|
[Security] JWT 토큰 기반 인증이란? (0) | 2022.06.08 |
[Security] HTTP Cookie란? (0) | 2022.06.07 |
[Security] HTTP vs HTTPS 차이 (0) | 2022.06.07 |
[회고록] 코드스테이츠 블록체인 부트캠프 국비 후기 (Digital Training 과정) (9) | 2022.06.07 |
댓글