본문 바로가기
Programming

[Security] HTTP session이란 ? (session cookie 차이)

by 개발자 염상진 2022. 6. 7.

 

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

 

 

 

[Security] HTTP Cookie란?

Cookie란? 우리가 알고 있기로는 분명 HTTP 프로토콜은 stateless(상태를 가지고 있지 않음) 성질을 가지고 있다. 즉 서버 클라이언트 간 관계에서 서버입장에서는 클라이언트에 대한 정보를 가지고

about-tech.tistory.com

 

 

[Security] HTTP vs HTTPS 차이

HTTPS 프로토콜 HTTPS(Hyper Text Transfer Protocol Secure Socket Layer)란 HTTP over SSL(TLS) 혹은 HTTP over Secure라고 불린다. HTTPS는 서버와 클라이언트 간 통신하는 과정에서 내용을 SSL || TLS 알고리..

about-tech.tistory.com

 

 

[Node.js] Express 미들웨어 함수

미들웨어(Middleware) 함수 Express는 자체적인 최소한의 기능을 가진 라우팅 및 미들웨어 웹 프레임워크다. Express 애플리케이션은 일련의 미들웨어 함수를 호출한다. 미들웨어 함수란 요청 오브젝트

about-tech.tistory.com

 

댓글