IT이야기/네트워크

세션 관리: 웹 보안과 사용자 상태 유지의 핵심 기술 완벽 분석

Chiba-in 2025. 2. 28. 12:45

🔹 세션이란?

1. 세션(Session)의 정의

세션(Session)웹 애플리케이션에서 사용자의 상태를 유지하기 위한 메커니즘입니다.
세션의 주요 역할:

  • 사용자 인증 상태 유지 (예: 로그인 상태 유지)
  • 사용자별 맞춤 데이터 저장 (예: 장바구니, 사용자 설정)
  • 서버-클라이언트 간 지속적인 연결 유지

📌 세션은 HTTP가 본래 "무상태(Stateless)" 프로토콜이기 때문에, 이를 보완하는 역할을 수행


🔹 세션 관리의 주요 방식

1. 쿠키 기반 세션 관리

서버가 클라이언트 브라우저에 세션 ID를 쿠키로 저장하여 인증을 유지하는 방식

✔️ 쿠키 기반 세션 동작 방식:
1️⃣ 사용자가 로그인하면 서버가 세션을 생성하고 세션 ID를 발급
2️⃣ 세션 ID를 쿠키에 저장하여 클라이언트가 요청 시 함께 전송
3️⃣ 서버는 쿠키의 세션 ID를 확인하여 사용자를 인증

✔️ 쿠키 기반 세션 예제 (Express.js)

const session = require('express-session');
app.use(session({
  secret: 'secureKey',
  resave: false,
  saveUninitialized: true,
  cookie: { secure: true }
}));

📌 쿠키는 보안 이슈(CSRF, XSS 등)가 있으므로, 적절한 보안 조치가 필요


2. 토큰 기반 세션 관리 (JWT, JSON Web Token)

클라이언트가 JWT(JSON Web Token)을 활용하여 인증을 유지하는 방식

✔️ JWT 기반 세션 동작 방식:
1️⃣ 사용자가 로그인하면 서버가 JWT(토큰)를 생성하여 클라이언트에게 전달
2️⃣ 클라이언트는 JWT를 저장하고, 요청 시 헤더에 포함하여 서버에 전송
3️⃣ 서버는 JWT를 검증하여 사용자 인증 수행

✔️ JWT 생성 예제 (Node.js + jsonwebtoken)

const jwt = require('jsonwebtoken');
const token = jwt.sign({ userId: 123 }, 'secretKey', { expiresIn: '1h' });

📌 JWT는 서버에서 상태를 유지하지 않아 확장성이 뛰어나지만, 토큰 유출 시 보안 위험이 있음


3. 세션 스토리지(Session Storage) 기반 세션 관리

클라이언트 측의 세션 스토리지에 데이터를 저장하는 방식
✔️ 브라우저에서 사용되며, 페이지를 닫으면 세션 데이터가 사라짐

✔️ 세션 스토리지 사용 예제 (JavaScript)

sessionStorage.setItem('user', JSON.stringify({ id: 123, name: "John" }));
let user = JSON.parse(sessionStorage.getItem('user'));

📌 세션 스토리지는 보안성이 낮아 민감한 정보를 저장하는 용도로는 적합하지 않음


🔹 세션 관리 보안 이슈 및 해결 방법

1. 세션 하이재킹(Session Hijacking) 방지

공격자가 세션 ID를 탈취하여 사용자의 계정을 가로챌 위험이 있음
✔️ 해결 방법:

  • HTTPOnly 및 Secure 쿠키 설정 (JavaScript 접근 및 MITM 공격 방지)
  • 세션 ID 재생성 (로그인 및 중요한 요청 시 변경)
  • IP 및 User-Agent 기반 세션 검증

✔️ 쿠키 보안 설정 예제 (Express.js)

app.use(session({
  secret: 'secureKey',
  cookie: { httpOnly: true, secure: true, sameSite: 'strict' }
}));

📌 세션 ID를 안전하게 관리하는 것이 세션 보안의 핵심 요소


2. CSRF(Cross-Site Request Forgery) 공격 방지

공격자가 사용자의 세션을 악용하여 원치 않는 요청을 서버에 전송
✔️ 해결 방법:

  • CSRF 토큰 활용 (각 요청에 보안 토큰 추가)
  • Referrer 검증

✔️ CSRF 토큰 예제 (Express.js + csurf 라이브러리)

const csrf = require('csurf');
app.use(csrf({ cookie: true }));
app.get('/form', (req, res) => {
  res.render('form', { csrfToken: req.csrfToken() });
});

📌 CSRF 방어를 위해 요청마다 고유한 토큰을 부여하여 검증


3. 세션 고정(Session Fixation) 공격 방지

공격자가 특정 세션 ID를 미리 설정하고 피해자가 이를 사용하도록 유도하는 방식
✔️ 해결 방법:

  • 로그인 시 세션 ID 재생성
  • 세션 ID를 URL에 포함하지 않음

✔️ 세션 ID 재생성 예제 (PHP)

session_start();
session_regenerate_id(true);

📌 세션 ID를 재사용하지 않고 주기적으로 변경하는 것이 중요


🔹 세션 만료 및 관리 전략

세션을 장기간 유지하면 보안 위험이 증가하므로, 적절한 만료 정책을 설정해야 함

✔️ 세션 만료 설정 예제 (Express.js)

app.use(session({
  secret: 'secureKey',
  resave: false,
  saveUninitialized: true,
  cookie: { maxAge: 30 * 60 * 1000 } // 30분 후 세션 만료
}));

📌 사용자가 일정 시간 동안 활동이 없으면 자동 로그아웃 처리


📌 결론

세션 관리는 웹 애플리케이션에서 사용자 인증 상태를 유지하는 중요한 기술이다.
쿠키 기반 세션, JWT, 세션 스토리지 등 다양한 방식이 있으며, 각각의 장단점이 존재한다.
세션 하이재킹, CSRF, 세션 고정 공격을 방지하기 위한 보안 조치가 필요하다.
적절한 세션 만료 정책을 설정하여 보안성과 사용자 편의성을 동시에 고려해야 한다.