세션 하이재킹

  • 사용자의 세션 정보를 불법적으로 획득하거나 조작하여 공격자가 사용자 대신 시스템에 접근하는것

세션의 작동 방식은 저장 위치에 따라 서버측 세션클라이언트측 세션으로 나뉜다.

세션의 작동방식

1. 서버측 세션

  • 사용자의 세션 정보를 서버에서 관리하는 방식

    일반적으로 세션 ID(Session ID)를 클라이언트에 저장하고, 실제 세션 데이터는 서버에서 유지한다.

작동 방식

  1. 사용자가 서버에 접속하면, 서버는 새로운 세션을 생성하고 고유한 세션 ID를 부여
  2. 이 세션 ID는 쿠키 또는 URL 매개변수를 통해 클라이언트에 전달
  3. 사용자가 요청을 보낼 때 세션 ID를 함께 보내면, 서버는 해당 세션을 조회하여 사용자 상태를 유지
  4. 세션이 만료되거나 삭제되면 사용자는 다시 로그인 필요

특징

1. 보안성이 높다

  • 세션 데이터가 서버에 저장되므로 클라이언트에서 조작하기 어렵습니다.

2. 유지 관리 필요하다

  • 서버에서 세션을 지속적으로 관리해야 하며, 일정 시간이 지나면 자동으로 삭제해야 한다.

3. 서버 리소스 소모가 크다

  • 많은 사용자가 접속하면 서버 메모리나 데이터베이스 부담이 커질 수 있다.
const session = require("express-session");

app.use(
  session({
    secret: "my_secret_key", // 세션 암호화 키
    resave: false,
    saveUninitialized: true,
    cookie: { secure: false }, // HTTPS 환경에서는 true로 설정
  })
);

app.get("/set-session", (req, res) => {
  req.session.user = { id: 1, name: "Kimsu" };
  res.send("세션 설정 완료");
});

app.get("/get-session", (req, res) => {
  res.send(req.session.user);
});

2. 클라이언트측 세션

  • 사용자의 정보를 클라이언트(브라우저)의 저장소에 저장하는 방식
  • 쿠키(Cookie), 로컬 스토리지(Local Storage), 세션 스토리지(Session Storage), JWT(JSON Web Token) 등을 사용

작동 방식

  1. 서버는 클라이언트가 로그인하면, 인증 정보를 포함한 토큰(JWT 등)을 생성하여 클라이언트에 반환
  2. 클라이언트는 이 정보를 쿠키, 로컬 스토리지, 세션 스토리지 등에 저장
  3. 이후 요청 시 클라이언트가 저장된 토큰을 서버에 전달하여 인증을 수행

특징

1. 서버 부담 감소

  • 세션 데이터를 서버가 아니라 클라이언트가 관리하므로 서버 부하가 적다.

2. 보안 취약점 존재

  • 클라이언트에서 데이터가 저장되므로 조작될 가능성이 있으며, 탈취될 경우 공격자가 사용자로 가장할 수 있다.

3. 만료 및 갱신 관리 필요

  • 클라이언트측 세션을 사용할 경우 토큰의 만료 시간 및 갱신 메커니즘을 잘 설계해야한다.
// JWT 기반 클라이언트 측 세션관리
const jwt = require("jsonwebtoken");

const user = { id: 1, name: "김수정" };
const token = jwt.sign(user, "my_secret_key", { expiresIn: "1h" });

console.log(token); // JWT 토큰 발급

// 클라이언트는 로컬 스토리지에 저장 후, 요청 시 사용
localStorage.setItem("token", token);
fetch("/api/protected", {
  headers: { Authorization: `Bearer ${localStorage.getItem("token")}` },
});

서버측, 클라이언트측 세션 비교

구분 서버측 세션 클라이언트측 세션
저장 위치 서버 메모리, DB 브라우저 (쿠키, 로컬 스토리지)
보안성 높음 (서버에서 관리) 낮음 (클라이언트 조작 가능)
속도 상대적으로 느림 상대적으로 빠름
유지 비용 서버 부담 있음 서버 부담 없음
예시 로그인, 은행 시스템 등 보안이 중요한 서비스 간단한 상태 유지, JWT 기반 인증
  • 서버측 세션은 보안이 중요한 경우 적합하며, 사용자의 중요한 데이터를 서버에서 직접 관리해야 하는 경우 권장된다.
  • 클라이언트측 세션은 빠르고 확장성이 필요할 때 유리하며, JWT와 같은 방식을 활용하면 서버 부하를 줄일 수 있다.
  • 보안 및 성능을 고려하여 서비스 특성에 맞게 적절한 방식을 선택해야 한다.

세션을 가로채는 방법

1. 쿠키 도난

  • 쿠키 도난은 공격자가 사용자의 쿠키 정보를 훔쳐 세션 ID를 탈취하는 공격 세션 ID가 쿠키에 저장되어 있으면, 공격자는 해당 세션 ID를 사용하여 사용자처럼 시스템에 접근할 수 있다.

2. 중간자 공격

  • 중간자 공격은 공격자가 용자와 서버 사이의 통신을 가로채어 수정할 수 있는 공격 공격자는 사용자와 서버 간의 통신을 도청하거나 조작하여 세션 ID를 탈취하거나 세션을 조작할 수 있다.

3. CSRF 공격

  • CSRF 공격은 사용자가 이미 인증된 상태에서 공격자가 의도하지 않은 요청을 사용자의 권한으로 서버에 요청하는 공격 이를 통해 공격자는 사용자의 세션을 이용하여 악의적인 요청을 실행할 수 있다.

4. 세션 고정

  • 세션 고정은 공격자가특정 세션 ID를 강제로 사용하도록 만드는 공격 공격자는 희생자에게 세션 ID를 제공하거나, 특정 URL을 통해 세션 ID를 고정시킬 수 있다.

5. 취약한 세션 ID 활용

일부 시스템은 예측 가능한 세션 ID를 사용하거나, 취약한 랜덤성을 가진 세션 ID를 생성하여 공격자에게 쉽게 추측하거나 브루트 포스 공격을 통해 세션 ID를 탈취당할 수 있다.

이러한 세션 하이재킹 공격을 방지하기 위해서는 강력한 세션 관리 및 보안 정책을 적용하고, HTTPS와 같은 안전한 통신 프로토콜을 사용하여 데이터의 기밀성과 무결성을 보호해야 한다.


🗒️ 요약

웹사이트가 사용자를 인증하면 브라우저와 서버는 사용자간의 세션을 연다.
세션상태는 서버측에 저장하거나 암호화된 쿠키 또는 디지털 서명된 쿠키로 클라이언트 측에 저장 할 수 있다.

  1. 사용자는 해커가 세션과 쿠키를 탈취하지 못하게 보호해야한다.
  2. XSS 공격으로 세션 탈취를 방지하려면 쿠키가 자바스크립트 코드에 엑세스 할 수 없는지 확인해야한다.
  3. 중간자 공격으로 세션 하이재킹을 방지하려면 쿠키는 HTTPS 연결로만 전달되어야한다.
  4. CSRF 공격으로 세션 하이재킹을 방지하려면 쿠키의 중요한 사이트 간 요청을 삭제해야한다.
  5. HTTP 응답에 Set-Cookie 헤더를쓸때 각각 키워드 HttpOnly, SecureOnly, SameSite 를 사용하여 보호를 추가할 수 있다.

댓글남기기