본문 바로가기

웹 보안 기초: XSS, CSRF 등 보안 이슈 이해

에온르 2024. 5. 19.
반응형

웹 보안은 웹 애플리케이션을 개발할 때 필수적으로 고려해야 하는 요소입니다. 특히, 교차 사이트 스크립팅(XSS)과 교차 사이트 요청 위조(CSRF)와 같은 공격은 웹사이트의 보안을 위협하며, 사용자의 데이터를 위험에 빠뜨릴 수 있습니다.

source : ifourtechnoloab

XSS (Cross-Site Scripting)

정의 및 위험성

XSS 공격은 공격자가 웹 페이지에 악의적인 스크립트를 삽입하여, 다른 사용자의 브라우저에서 실행되게 하는 보안 취약점입니다. 이 스크립트는 사용자의 세션 쿠키를 탈취하거나, 피싱 공격을 실행하거나, 악의적인 행동을 대신 수행하게 할 수 있습니다.

예방 방법

  • 입력 필터링: 사용자 입력을 적절히 필터링하고, 태그 같은 것은 실행되지 않도록 처리합니다.
  • 출력 인코딩: 데이터를 HTML로 출력하기 전에 적절히 인코딩하여, 스크립트가 실행되지 않도록 합니다.
  • 콘텐츠 보안 정책 (CSP): 외부 스크립트 소스의 사용을 제한하거나 특정 도메인의 스크립트만 허용하는 정책을 설정합니다.

상세 예제

XSS 공격은 사용자로부터 입력 받은 데이터를 검증 없이 사용할 때 발생합니다. 아래 예제는 XSS 취약점을 보여주고, 이를 방지하는 방법을 설명합니다.


취약한 코드 예제

<!-- Example of a vulnerable page -->
<form action="/search" method="GET">
  <input type="text" name="query">
  <input type="submit" value="Search">
</form>

<?php
// Dangerous: Output is directly rendered in the browser without sanitization
echo "Results for: " . $_GET['query'];
?>

위 예제에서 사용자가 검색 필드에 <script>alert('XSS')</script>와 같은 스크립트를 입력하면, 이 스크립트는 다른 사용자의 브라우저에서 실행될 수 있습니다.

보안 강화된 코드 예제

// Safe approach: Sanitize the output before rendering it
echo "Results for: " . htmlspecialchars($_GET['query'], ENT_QUOTES, 'UTF-8');

htmlspecialchars 함수는 HTML 태그가 실행되지 않도록 특수 문자를 HTML 엔티티로 변환합니다. 이 방법은 XSS 공격을 방지하는 데 효과적입니다.


CSRF (Cross-Site Request Forgery)

정의 및 위험성

CSRF 공격은 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행동을 웹 애플리케이션에서 수행하도록 만듭니다. 예를 들어, 사용자가 로그인한 상태에서 공격자가 준비한 링크를 클릭하게 만들어, 사용자의 권한을 이용해 설정을 변경하거나 트랜잭션을 실행할 수 있습니다.

예방 방법

  • 토큰 사용: 각 폼 요청에 대해 서버에서 생성된 토큰을 포함시키고, 요청이 들어올 때마다 토큰을 검증합니다. ( 각 사용자 세션에 고유한 CSRF 토큰을 발급하고, 폼 제출 시 이 토큰을 검증.)
  • SameSite 쿠키 속성: 쿠키 설정에서 SameSite=Strict를 설정하여 쿠키가 오직 동일한 사이트의 요청에만 전송되도록 합니다.
  • 리퍼러 검증: HTTP 리퍼러 헤더를 검증하여, 요청이 신뢰할 수 있는 페이지에서 발생했는지 확인합니다.

상세 예제

CSRF 공격은 사용자가 자신의 의지와 무관하게 위험한 작업을 수행하도록 만듭니다. 아래는 CSRF 취약점을 설명하는 예제와 이를 방지하는 방법입니다.


취약한 코드 예제

<!-- Example of a vulnerable page -->
<form action="/updateEmail" method="POST">
  <input type="email" name="newEmail">
  <input type="submit" value="Update Email">
</form>

위 예제에서, 공격자는 사용자가 방문한 다른 페이지에서 이 폼을 제출하도록 하는 링크나 이미지를 숨길 수 있습니다.

보안 강화된 코드 예제

<!-- Safe approach: Add a CSRF token -->
<form action="/updateEmail" method="POST">
  <input type="hidden" name="csrf_token" value="<?php echo $user->getCsrfToken(); ?>">
  <input type="email" name="newEmail">
  <input type="submit" value="Update Email">
</form>

결론

웹 보안은 한 번의 조치로 완성되는 것이 아닙니다. 새로운 보안 위협이 지속적으로 발생하므로, 개발자는 최신 보안 취약점과 공격 방법을 지속적으로 학습하고, 애플리케이션을 업데이트하며 보안을 강화해야 합니다. 웹 개발에 있어 보안 의식을 가지고 접근하는 것은 필수적입니다. 이 강의를 통해 XSS와 CSRF 보안 위협에 대한 이해를 높이고, 이를 방지하기 위한 기본적인 방법들을 마스터하시길 바랍니다.

반응형

댓글