기타

쿠키, 세션

js0616 2024. 7. 30. 09:09

사용자의 상태를 관리 하기 위한 방법

클라이언트와 서버 간의 상태를 유지하고 정보를 저장하는 데 사용됩니다.

 

HTTP 프로토콜의 특징으로

 

1. Connectionless (비연결지향)    

클라이언트가 서버에 요청을 보내면, 서버는 해당 요청에 대한 응답을 전송한 후 연결을 끊는다는 것을 의미합니다.

 

Keep-Alive

HTTP/1.1부터 지원되는 기능으로, 하나의 TCP 연결을 여러 HTTP 요청과 응답 사이에서 재사용할 수 있게 해줍니다.

서버 부하 감소: 서버는 매 요청마다 TCP 연결을 설정하는 작업을 줄일 수 있으므로 서버 부하를 감소시킬 수 있습니다.

 

HTTP/1.0에서는 명시적으로 설정

HTTP/1.1에서는 기본적으로 활성화

HTTP/2에서는 다중 요청과 응답을 하나의 연결에서 병렬로 처리

 

 

2. Stateless (상태정보 유지 안함)    

클라이언트와 서버 간의 이전 상호작용과 관계 없이 각 요청은 독립적으로 처리됩니다.

 

 

--> 정보가 유지되지 않으면, 

매번 페이지를 이동할 때마다 로그인을 다시 하거나,

상품을 선택했는데, 구매 페이지에서 선택한 상품의 정보가 없거나 하는 등의 일이 발생할 수 있다.

 

쿠키나 세션을 사용하여 해결할 수 있다.

 

 

 

 

Q. 세션을 쓰면되는데 굳이 쿠키를 사용하는 이유?

자원관리 차원에서 쿠키와 세션을 적절한 요소 및 기능에 병행 사용하여,서버 자원의 낭비를 방지하며 웹사이트의 속도를 높일 수 있다.

 

 

 

쿠키(Cookie)

HTTP에서 클라이언트의 상태 정보를 클라이언트의 PC에 저장하였다가 필요시에 정보를 참조하거나 재사용할 수 있다.

 

쿠키의 구성 요소

  • 이름 : 각각의 쿠키를 구별하는 데 사용되는 이름
  • 값 : 쿠키의 이름과 관련된 값
  • 유효시간 : 쿠키의 유지시간
  • 도메인 : 쿠키를 전송할 도메인
  • 경로 : 쿠키를 전송할 요청 경로

쿠키의 동작 방식

  1. 클라이언트가 페이지를 요청
  2. 서버에서 쿠키를 생성
  3. HTTP 헤더에 쿠키를 포함 시켜 응답
  4. 브라우저가 종료되어도 쿠키 만료 기간이 있다면 클라이언트에서 보관하고 있음
  5. 같은 요청을 할 경우 HTTP 헤더에 쿠키를 함께 보냄
  6. 서버에서 쿠키를 읽어 이전 상태 정보를 변경 할 필요가 있을 때, 쿠키를 업데이트 하여 변경된 쿠키를 HTTP 헤더에 포함시켜 응답


사용 예시

1. 방문했던 사이트에 다시 방문 하였을 때 아이디와 비밀번호 자동 입력, 저장

2. 팝업창을 통해 "오늘 이 창을 다시 보지 않기" 체크

 

1. 쿠키(Cookie) 사용 예시 (Node.js + Express)

const express = require('express');
const cookieParser = require('cookie-parser');

const app = express();
app.use(cookieParser());

app.get('/setcookie', (req, res) => {
  // 쿠키 설정
  res.cookie('username', 'john', { maxAge: 900000, httpOnly: true });
  res.send('쿠키가 설정되었습니다.');
});

app.get('/getcookie', (req, res) => {
  // 쿠키 읽기
  const username = req.cookies.username;
  if (username) {
    res.send(`안녕하세요, ${username}님!`);
  } else {
    res.send('쿠키를 찾을 수 없습니다.');
  }
});

app.listen(3000, () => {
  console.log('서버가 3000 포트에서 실행 중입니다.');
});

 

 

 

세션(Session)

일정 시간동안 같은 사용자(브라우저)로부터 들어오는일련의 요구를 하나의 상태로 보고, 그 상태를 일정하게 유지시키는 기술이다.여기서 일정 시간은 방문자가 웹 브라우저를 통해웹 서버에 접속한 시점으로부터 웹 브라우저를 종료하여 연결을 끝내는 시점을 말한다.즉, 방문자가 웹 서버에 접속해 있는 상태를 하나의 단위로 보고 그것을 세션이라고 한다.


세션의 동작 방식

  1. 클라이언트가 서버에 접속 시 세션 ID를 발급 받음
  2. 클라이언트는 세션 ID에 대해 쿠키를 사용해서 저장하고 가지고 있음
  3. 클라이언트는 서버에 요청할 때, 이 쿠키의 세션 ID를 같이 서버에 전달해서 요청
  4. 서버는 세션 ID를 전달 받아서 별다른 작업없이 세션 ID로 세션에 있는 클라언트 정보를 가져와서 사용
  5. 클라이언트 정보를 가지고 서버 요청을 처리하여 클라이언트에게 응답

세션의 특징

  • 각 클라이언트에게 고유 ID를 부여
  • 세션 ID로 클라이언트를 구분해서 클라이언트의 요구에 맞는 서비스를 제공
  • 보안 면에서 쿠키보다 우수
  • 사용자가 많아질수록 서버 메모리를 많이 차지하게 됨

세션의 사용 예

  • 로그인 같이 보안상 중요한 작업을 수행할 때 사용

 

2. 세션(Session) 사용 예시 (Node.js + Express)

const express = require('express');
const session = require('express-session');

const app = express();

app.use(session({
  secret: 'mySecretKey', // 세션 데이터를 암호화할 키
  resave: false,
  saveUninitialized: true,
  cookie: { secure: false } // HTTPS를 사용할 때 true로 설정
}));

app.get('/setsession', (req, res) => {
  // 세션 설정
  req.session.username = 'john';
  res.send('세션이 설정되었습니다.');
});

app.get('/getsession', (req, res) => {
  // 세션 읽기
  const username = req.session.username;
  if (username) {
    res.send(`안녕하세요, ${username}님!`);
  } else {
    res.send('세션을 찾을 수 없습니다.');
  }
});

app.listen(3000, () => {
  console.log('서버가 3000 포트에서 실행 중입니다.');
});

 

 

 

 

쿠키에 세션 ID 가 들어있다 -> 쿠키는 보안이 취약하다 -> 세션 ID 를 훔쳐서 사용한다 -> 세션 하이재킹 !!

 

 

  • 쿠키 스니핑(Cookie Sniffing): 네트워크에서 쿠키를 가로채어 세션 ID를 탈취하는 공격입니다.
  • XSS(Cross-Site Scripting): 악의적인 스크립트를 삽입하여 사용자 브라우저에서 실행되게 하여, 세션 ID를 탈취하는 공격입니다.
  • 세션 fixation: 공격자가 유효한 세션 ID를 사용자에게 주입하여, 사용자가 해당 세션 ID를 사용하도록 유도하여 세션을 탈취하는 공격입니다.

 

 

예방

 

  • HTTPS 사용: HTTPS를 사용하여 데이터를 암호화하고 중간에서의 데이터 탈취를 방지합니다.
  • Secure 및 HttpOnly 쿠키 설정: 쿠키에 secure 속성과 httpOnly 속성을 설정하여 중간자 공격과 XSS 공격을 방지합니다.
  • 세션 만료 관리: 적절한 세션 만료 정책을 설정하여 세션이 오랫동안 유효하지 않도록 합니다.
  • 랜덤한 세션 ID: 예측 불가능하고 무작위로 생성된 세션 ID를 사용하여 세션 하이재킹의 가능성을 줄입니다.
  • 사용자 인증 및 보안 검사: 사용자의 IP 주소, 브라우저 정보 등과 같은 추가적인 보안 검사를 수행하여, 비정상적인 세션 사용을 감지하고 차단할 수 있습니다.

 

 


 

기타 공격

 

XSS

Target Website에 악성코드가 심어져있는 경우 사용자는 악성코드가 심어진 페이지에 접근하면 사용자 브라우저는 서버에서 페이지의 코드를 가져오는데 악성 자바스크립트 코드도 같이 가져오기 때문에 사용자의 권한으로 할 수 있는 행동들을 자바스크립트 코드를 통해 실행할 수 있다. 따라서 사용자의 쿠키 값을 탈취할 수 있고 웹 페이지를 다른 fake 페이지로 변경할 수 있다.

 

 

https://www.youtube.com/watch?v=DoN7bkdQBXU

 

해당 글을 클릭시 스크립트가 실행됨 ..! (사용자를 공격)

 

 


 

CSRF 공격

클라이언트의 권한 도용을 통해서 서버를 대상으로 공격한다. 희생자가 악성 웹사이트에 방문하면 사용자의 신분으로 Target Website에 위조된 요청을 보낸다. 서버에서 위조된 Cross-Site 요청을 알아채지 못하면 공격 성공이다.

 

 

해당 글을 클릭시, 글을 작성하게 됨 . (서버를 공격)

 

 

https://www.youtube.com/watch?v=nzoUgKPwn_A

 

 

 


 

 

 

 

 

https://interconnection.tistory.com/74

 

 

https://js0616.tistory.com/275

 

https://hahahoho5915.tistory.com/32