쿠키(Cookie) , 세션(Session)

박재현·2022년 2월 25일
0
post-custom-banner

💬 회원가입 및 로그인 기능 활용 시 쿠키, 세션 기능이 활용 될 수 있다. 기존 로그인 기능의 경우 JWT, passport 로그인 기능 구현 시 활용 했었다.
하지만 각각의 구체적인 기능 및 사용법 등에 대해서는 알지 못했고 이번에 정리해 보기로 했다.



📌 접속 상태 저장 경로 : 클라이언트
📌 장점

  • 서버에 부담을 덜어줌
  • http의 stateless한 것을 보완
  • 서버의 저장공간 절약

📌 단점

  • 보안 취약 : 요청 시 쿠키 값을 그대로 보냄
  • 웹 브라우저를 변경할 경우 다른 웹브라우저에서 저장한 쿠키값을 사용할 수 없음
  • 한번에 하나의 정보만 저장할 수 있음

💡 Session

📌 접속 상태 저장 경로 : 서버
📌 장점 :

  • 신뢰할 수 있는 유저인지 서버에서 추가로 확인 가능 (최초 접속 때를 제외하고 SessionID만 사용)
  • 큰 허용 용량 : 저장 개수나 용량 제한 없음(서버 용량 충분 시)
  • 데이터를 Hash Table에 저장. 한 번에 많은 정보를 하나의 세션 객체에 저장 가능
  • SessionID만 보내므로, 세션의 크기가 커도 네트워크 부하가 거의 없음
  • 서버에 저장되므로 클라이언트의 웹브라우저에 의존하지 않아도 됨

📌 단점

  • 서버에 부하 : 서버에 데이터를 저장하므로 세션 양이 많아질수록 서버에 부하가 커짐

보통 인증 및 로그인 기능 구현 시 접속 상태를 서버가 가지며(Stateful), 접속 상태와 권한 부여를 위해 세션 아이디를 쿠키로 전송



🔎 쿠키(Cookie)

💡 배경

  • 로그인을 통해 볼 수 있는 서비스. 장바구니 서비스. 등등 클라이언트가 정보를 유지하는 Stateful한 성격의 서비스가 점점 많아졌습니다.
  • 정보를 유지할 수 없는 Connectionless, Stateless의 성격을 가진 HTTP의 단점을 해결하기 위해 쿠키라는 개념이 도입되었습니다.

💡 쿠키(Cookie)란?

  • 사용자 인증이 유효한 시간을 명시할 수 있으며, 유효 시간이 정해지면 브라우저가 종료되어도 인증이 유지된다는 특징이 있습니다.

  • 쿠키는 클라이언트의 상태 정보를 로컬에 저장했다가 참조합니다.

  • 웹 서버가 브라우저에게 지시하여 사용자의 로컬 컴퓨터에 파일 또는 메모리에 저장하는 작은 기록 정보 파일입니다.

  • 파일에 담긴 정보는 인터넷 사용자가 같은 웹사이트를 방문할 때마다 읽히고 수시로 새로운 정보로 바뀔 수 있습니다.

  • HTTP의 stateless 특징을 보완해주는 도구로 작은 문자열을 저장

Stateless

  • 각각의 요청은 독립적이기 때문에 이전 요청에 대한 것을 기억하지 않음
  • 로그인 정보고 기억하지 못하기 때문에 로그인 정보를 쿠키에 저장
  • 세션쿠키의 경우 서버에서 (defalut) name인 connect.sid에 해당 유저의 아이디를 signed(서명)된 형태로 보내주게 됨 (connect.sid=서명된 문자열(해당 유저의 아이디))

💡 쿠키(Cookie) 살펴보기

📌 Cookie를 이용한 Server-Client 흐름

google.com 의 쿠키

💡 쿠키(Cookie) 구성요소

📌 Name: 키(Key)
📌 Value: 값(Value)
📌 Expires: 쿠키 만료 기한

쿠키에 만료일이 포함되어 있지 않으면 영구적 쿠키로 간주하기 때문에 Max-Age를 통해 지정된 만료일을 지정해 주는 것이 중요하다.

📌 Domain : 쿠키가 사용되는 도메인을 지정하여 다른 도메인이 해당 쿠키를 사용하지 못하도록 설정

  • ex) domain=nesoy.github.io

📌 Path: 쿠키를 반환할 경로를 결정

📌 Secure: 보안 연결 설정 (HttpOnly등의 설정 가능)

💡 쿠키(Cookie) 종류

📌 Session Cookie

  • 보통 만료시간(Expire date) 설정하고 메모리에만 저장되며 브라우저 종료시 쿠키를 삭제.

📌 Persistent Cookie

  • 장기간 유지되는 쿠키(예를 들어 Max-Age 1년), 파일로 저장되어 브라우저 종료와 관계없이 사용.

📌 Secure Cookie

  • HTTPS에서만 사용, 쿠키 정보가 암호화 되어 전송.

📌 Third-Party Cookie

  • 방문한 도메인과 다른 도메인의 쿠키 보통 광고 베너 등을 관리할 때 유입 경로를 추적하기 위해 사용.

🔎 세션(Session)

💡 배경

  • 쿠키의 트래픽 문제와 쿠키를 변경하는 보안적 이슈를 해결하기 위해 등장
  • 인증 및 로그인 구현 기능 시 해당 사용자에 대한 고유한 개인 저장소 역할

💡 세션(HTTP Session)이란?

  • HTTP Session id를 식별자로 구별하여 데이터를 사용자의 브라우저에 쿠키형태가 아닌 접속한 서버 DB에 정보를 저장 합니다.
  • 클라이언트는 HTTP Session id를 쿠키로 메모리 저장된 형태로 가지고 있습니다.
  • 메모리에 저장하기 때문에 브라우저가 종료되면 사라지게 됩니다.
  • 로그인 및 인증 기능 시 사용자의 수 만큼 서버 메모리를 차지한다.

💡세션(Cookie) 구성요소

// 세션: req.session => 해당 사용자에 대한 고유한 개인 저장소 역할
const session = require('express-session');

const sessionOption = {
  // 요청이 왔을 때 세션에 수정사항이 생기지 않더라도 다시 저장할지 여부
  resave: false,
  // 세션에 저장할 내역이 없더라도 세션을 저장할지
  saveUninitialized: false,
  // signed 되어 있기 때문에 읽을 수 없는 문자열로 되어 있음
  secret: process.env.COOKIE_SECRET,
  cookie: {
    // 자바스크립트 공격 방지
      httpOnly: true,
      secure: false,
  }
  // name: 'connect.sid', //default 이름
}

app.use(session(sessionOption))

💡세션(Cookie) 절차

  1. 클라이언트가 서버에 Resource를 요청합니다.
  2. 서버에서는 HTTP Request를 통해 쿠키에서 Session id를 확인을 한 후에 없으면 Set-Cookie를 통해 새로 발행한 Session-id 보냅니다.
  3. 클라이언트는 HTTP Request 헤더에 Session id를 포함하여 원하는 Resource를 요청을 합니다.
  4. 서버는 Session id를 통해 해당 세션을 찾아 클라이언트 상태 정보를 유지하며 적절한 응답을 합니다.
post-custom-banner

0개의 댓글