[파이썬] 크로스 사이트 요청 변조(CSRF) 공격

CSRF Attack

안녕하세요! 이번 블로그 글에서는 크로스 사이트 요청 변조(CSRF) 공격에 대해 알아보겠습니다. CSRF는 웹 보안 공격의 한 형태로, 악의적인 공격자가 피해자의 권한으로 안전하지 않은 동작(요청)을 수행하게 만드는 공격입니다.

CSRF 공격이란?

CSRF 공격은 웹 애플리케이션의 보안상 취약점을 이용하여 공격자가 사용자의 동의 없이 특정 동작을 수행하도록 하는 공격입니다. 대부분의 웹 애플리케이션은 사용자의 인증 정보를 쿠키에 저장하고, 이를 통해 사용자 요청을 식별합니다. 하지만, CSRF 공격에서는 공격자가 피해자의 브라우저를 이용하여 인증된 사용자처럼 요청을 보낼 수 있습니다.

CSRF 공격의 방법

일반적으로 CSRF 공격은 다음과 같은 과정으로 진행됩니다:

  1. 사용자는 특정 웹 사이트 A에 로그인합니다.
  2. 사용자는 악의적인 웹 사이트 B를 방문합니다.
  3. 웹 사이트 B는 페이지에 포함된 설명, 이미지, 링크 등을 통해 웹 사이트 A에 악의적인 요청을 보냅니다.
  4. 사용자의 브라우저는 웹 사이트 B의 요청을 자동으로 처리하여, 사용자는 자신도 모르게 악의적인 행동을 수행하게 됩니다.

CSRF 방어 방법

CSRF 공격을 방어하기 위해서는 다음과 같은 방법을 사용할 수 있습니다:

1. CSRF 토큰 사용

애플리케이션은 모든 요청에 고유한 CSRF 토큰을 포함시켜야 합니다. 이 토큰은 사용자의 세션에 연결되어 있으며, 요청 처리 시 해당 토큰이 유효한지 검사합니다. 이렇게 하면 악의적인 사이트가 CSRF 토큰을 알지 못해 정상적인 요청을 보내기 어렵습니다.

예시 코드:

from flask import Flask, session, request
import secrets

app = Flask(__name__)

# CSRF 토큰 생성
def generate_csrf_token():
    if 'csrf_token' not in session:
        session['csrf_token'] = secrets.token_hex(16)
    return session['csrf_token']

# 요청 처리 시 CSRF 토큰 검사
@app.before_request
def csrf_protect():
    if request.method == 'POST':
        csrf_token = session.get('csrf_token', None)
        if csrf_token is None or csrf_token != request.form.get('csrf_token'):
            return "Invalid CSRF Token", 403

# CSRF 토큰을 폼에 포함시키는 함수
def include_csrf_token():
    csrf_token = generate_csrf_token()
    return f"<input type='hidden' name='csrf_token' value='{csrf_token}'>"


@app.route('/', methods=['GET', 'POST'])
def index():
    if request.method == 'POST':
        # CSRF 토큰 검증이 성공한 경우 요청 처리
        return "Request processed successfully"
    else:
        # 폼에 CSRF 토큰 추가
        csrf_token_field = include_csrf_token()
        return f"<form method='POST'> {csrf_token_field} <button type='submit'>Submit</button> </form>"

if __name__ == '__main__':
    app.run()

2. SameSite 속성 설정

SameSite 속성을 사용하여 쿠키가 같은 출처에서만 전송되도록 할 수 있습니다. SameSite 속성이 설정된 쿠키는 외부 사이트로 전송되지 않으므로, CSRF 공격을 방어할 수 있습니다.

예시 코드:

response.set_cookie('cookie_name', 'cookie_value', samesite='Strict')

3. 추가 보안 검사

CSRF 방어를 위해 추가적인 보안 검사를 수행하는 것이 중요합니다. 예를 들어, 요청이 사용자의 동의에 따른 것인지 확인하거나, 중요한 동작(예: 사용자 정보 변경)에 대해서는 추가적인 인증 절차를 요구할 수 있습니다.

마무리

이제 크로스 사이트 요청 변조(CSRF) 공격에 대해 알게 되었습니다. CSRF 공격은 악의적인 공격자가 사용자의 인증 정보를 탈취하거나 악용하는 위험성이 있습니다. 따라서 웹 애플리케이션을 개발할 때는 CSRF 방어 기능을 구현하여 사용자의 보안을 강화해야 합니다. 위에서 소개한 방법을 사용하여 CSRF 공격으로부터 안전한 애플리케이션을 개발해보세요!