HTML의 보안 문제와 예방 방법

HTML의 보안 문제와 예방 방법

웹 개발에서 보안은 매우 중요한 이슈입니다. 특히 HTML은 웹 페이지의 구조를 정의하는 언어로, 웹 보안의 첫 번째 방어선 역할을 합니다. HTML 문서에서 발생할 수 있는 보안 취약점은 종종 JavaScript서버 사이드 코드와 결합되어 공격자가 웹 애플리케이션을 악용할 수 있는 경로를 열어줍니다. 이 글에서는 HTML에서 발생할 수 있는 주요 보안 문제와 이를 예방하는 방법을 다루겠습니다.


1. 교차 사이트 스크립팅(XSS, Cross-Site Scripting)

XSS는 웹 애플리케이션에서 가장 흔히 발생하는 보안 취약점 중 하나로, 공격자가 악성 스크립트를 웹 페이지에 삽입하여 다른 사용자에게 실행시키는 공격입니다. 주로 입력 필드나 URL 쿼리 문자열 등을 통해 악성 JavaScript 코드가 삽입되어 피해자가 악성 스크립트에 노출됩니다.

XSS 공격의 예시

  • 사용자가 제출하는 폼에 악성 JavaScript 코드를 입력하여 다른 사용자의 세션 쿠키를 탈취하거나, 권한을 가로챕니다.

예방 방법

  • HTML 인코딩: 사용자 입력을 HTML로 삽입할 때, <, >, ", ', &와 같은 특수 문자를 HTML 엔티티로 변환해야 합니다. 예를 들어, <&lt;, >&gt;로 변환합니다.

    1
    <div>User input: &lt;script&gt;alert('XSS')&lt;/script&gt;</div>
  • 콘텐츠 보안 정책(CSP, Content Security Policy): CSP는 웹 페이지에서 실행되는 스크립트를 제한하는 보안 기능으로, 외부 스크립트나 인라인 스크립트의 실행을 제한할 수 있습니다. 이를 통해 XSS 공격을 방어할 수 있습니다.

    1
    <meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'">
  • 자바스크립트 안전한 사용: 사용자가 제출한 입력값을 서버에서 처리할 때, 이 값을 그대로 웹 페이지에 반영하지 않고, 필터링하거나 검증 과정을 거쳐야 합니다.


2. 교차 사이트 요청 위조(CSRF, Cross-Site Request Forgery)

CSRF는 공격자가 사용자의 인증 정보를 도용하여 사용자의 의도와 상관없이 서버에 요청을 보내는 공격입니다. 예를 들어, 사용자가 로그인된 상태에서 악성 사이트에 접속하면, 공격자는 사용자의 쿠키를 이용해 서버에 권한을 가진 요청을 보낼 수 있습니다.

CSRF 공격의 예시

  • 사용자가 로그인 상태에서 이메일을 보낼 수 있는 웹 애플리케이션을 사용 중일 때, 악성 사이트에서 자동으로 이메일을 발송하는 요청을 보냅니다.

예방 방법

  • CSRF 토큰 사용: 각 요청에 고유한 CSRF 토큰을 포함시켜 요청을 검증합니다. 서버는 이 토큰을 검증하여, 요청이 실제 사용자의 요청인지 확인합니다.

    1
    <input type="hidden" name="csrf_token" value="randomCSRFtoken">
  • SameSite 쿠키 속성 설정: 쿠키에 SameSite 속성을 설정하여, 다른 사이트에서 이 쿠키를 전송하지 못하게 할 수 있습니다.

    1
    Set-Cookie: sessionid=12345; SameSite=Strict;

3. 파일 업로드 취약점

HTML 폼을 사용하여 파일을 업로드할 때, 서버에서 파일의 종류를 검증하지 않으면 악성 파일이 업로드될 수 있습니다. 예를 들어, 공격자는 .php.exe와 같은 실행 가능한 파일을 업로드하여 서버에서 악성 코드를 실행할 수 있습니다.

파일 업로드 공격의 예시

  • 사용자가 이미지 파일로 위장한 PHP 스크립트를 업로드하여, 서버에서 악성 코드를 실행합니다.

예방 방법

  • 파일 확장자 검증: 업로드된 파일의 확장자뿐만 아니라 MIME 타입도 검증해야 합니다.
  • 파일 내용 검사: 파일을 서버에 저장하기 전에 파일의 내용을 검사하여 악성 코드가 포함되어 있지 않은지 확인합니다.
  • 파일 이름 변경: 업로드된 파일의 이름을 변경하여, 파일 경로를 예측할 수 없도록 합니다.

4. HTTP 응답 헤더 취약점

HTTP 응답 헤더는 웹 서버가 클라이언트에 보낼 때 포함되는 메타데이터입니다. 이 응답 헤더에는 웹 보안과 관련된 중요한 설정이 포함될 수 있습니다. 그러나 응답 헤더를 제대로 설정하지 않으면 보안 취약점이 발생할 수 있습니다.

주요 취약점

  • X-Frame-Options: 이 헤더가 없으면 클릭재킹(clickjacking) 공격에 노출될 수 있습니다.
  • Strict-Transport-Security (HSTS): HSTS가 설정되지 않으면 중간자 공격(MITM)에 취약할 수 있습니다.

예방 방법

  • X-Frame-Options: 클릭재킹 공격을 방지하려면 이 헤더를 설정하여 페이지가 다른 사이트의 iframe에 포함되지 않도록 합니다.

    1
    X-Frame-Options: DENY
  • Strict-Transport-Security: HTTPS 연결을 강제로 사용하게 하여, 중간자 공격을 방지할 수 있습니다.

    1
    Strict-Transport-Security: max-age=31536000; includeSubDomains
  • X-XSS-Protection: XSS 공격을 방지하기 위해 이 헤더를 설정할 수 있습니다.

    1
    X-XSS-Protection: 1; mode=block

5. 클릭재킹(Clickjacking)

클릭재킹은 사용자가 실제로 클릭하는 것이 아닌, 보이지 않는 숨겨진 프레임을 클릭하게 만드는 공격입니다. 이 공격은 사용자가 웹 페이지의 UI 요소를 클릭할 때, 의도하지 않은 다른 요소를 클릭하게 만듭니다.

클릭재킹의 예시

  • 공격자가 피해자의 페이지를 iframe으로 삽입하여, 클릭을 유도하고 악성 링크나 버튼을 클릭하게 만듭니다.

예방 방법

  • X-Frame-Options 사용: 앞서 설명한 대로, X-Frame-Options 헤더를 설정하여 웹 페이지가 다른 사이트의 iframe에 포함되지 않도록 합니다.
  • CSP 설정: Content-Security-Policy를 설정하여 외부 도메인에서 콘텐츠가 로드되지 않도록 할 수 있습니다.
    1
    <meta http-equiv="Content-Security-Policy" content="frame-ancestors 'none'">

6. 클라이언트 측 스크립트 보안

HTML 문서에서 JavaScriptAJAX를 사용하여 클라이언트 측에서 데이터를 처리할 때, 보안 취약점이 발생할 수 있습니다. 예를 들어, 사용자의 입력을 서버로 보내기 전에 제대로 필터링하지 않으면 SQL 인젝션, XSS 등 다양한 공격에 노출될 수 있습니다.

예방 방법

  • 입력 검증: 클라이언트와 서버에서 사용자 입력을 모두 검증하고, 예상되는 값만을 받아들입니다.
  • HTTPS 사용: 모든 데이터 전송은 HTTPS 프로토콜을 통해 암호화하여, 중간자 공격을 방지합니다.

결론

HTML은 웹 페이지의 기본 구조를 정의하는 중요한 역할을 하지만, 보안 취약점도 존재합니다. XSS, CSRF, 파일 업로드 취약점 등 다양한 보안 위협이 존재하므로, 이러한 공격을 예방하기 위해서는 HTML과 함께 서버 측 보안, 클라이언트 측 보안도 함께 고려해야 합니다.

보안은 단기적인 해결책이 아닌, 지속적인 관리와 점검이 필요합니다. HTML 문서를 작성할 때, 위에서 설명한 보안 기법들을 적용하고, 보안 관련 도구와 정책을 적극적으로 활용하여 웹 애플리케이션을 안전하게 보호할 수 있습니다.

Reference

Share