XSS, CSRF 차이점 완벽하게 이해하기: XSS, CSRF 차이
들어가며
웹 개발과 관련하여, 신입들이 저지르는 가장 흔한 실수 중 하나는 보안의 중요성을 과소평가하는 것입니다. 많은 개발자들은 특징과 사용자 경험 그리고 성능을 우선시하며, 종종 보안이 문제가 될 때까지 경시합니다. 물론 저도 그랬구요. 하지만 이것만큼 중요한 것은 제품의 기본적인 보안입니다. 🥹
보안 조치를 무시하는 것은 무책임할 뿐만 아니라 위험합니다. 무시하면 데이터 침해, 사용자 신뢰 상실 및 잠재적인 법적 결과를 초래할 위험이 있습니다. 따라서 XSS 및 CSRF와 같은 웹 응용 프로그램의 취약성을 이해하는 것이 중요합니다.
크로스 사이트 스크립팅: XSS(Cross-Site Scripting)
크로스 사이트 스크립팅: XSS(Cross-Site Scripting)란 무엇인가?
사이트 간 스크립팅(Cross-Site Scripting)은 종종 XSS로 약칭되며 클라이언트 측 코드 주입 공격입니다. XSS 공격에서 공격자는 다른 사용자가 보는 웹 페이지에 악의적인 스크립트를 주입합니다. 그러면 이러한 스크립트는 사용자의 브라우저 컨텍스트에서 실행되어 다양한 유형의 데이터 도난 또는 조작을 초래합니다.
크로스 사이트 스크립팅: XSS(Cross-Site Scripting) 종류
XSS 취약점은 공격자가 다른 사용자에게 실행될 수 있는 코드를 웹 페이지에 삽입할 수 있게 하는 웹 보안 취약점입니다. 이 공격은 대게 JavaScript를 통해 이루어지며, 공격의 범위와 복잡성은 다양합니다. XSS는 주로 세 가지 주요 유형으로 분류됩니다: Stored XSS, Reflected XSS, 그리고 DOM 기반 XSS.
Stored XSS
데이터베이스에 저장됨 사용자->>웹서버: 페이지 요청 웹서버->>데이터베이스: 댓글 로드 데이터베이스->>웹서버: 댓글 반환(악성 스크립트 포함) 웹서버->>사용자: 댓글 표시(악성 스크립트 실행) Note right of 사용자: 악성 스크립트가
실행됨
Stored XSS는 서버에 저장된 데이터를 통해 발생합니다. 이는 공격자가 웹 애플리케이션의 데이터베이스, 코멘트 섹션, 또는 다른 지속적인 데이터 저장 영역에 악성 스크립트를 삽입하는 것을 포함합니다. 이러한 스크립트는 후에 다른 사용자가 해당 페이지를 방문할 때 실행됩니다.
가장 흔한 예는 게시판이나 블로그 코멘트입니다. 사용자가 코멘트에 스크립트를 삽입하면, 다른 사용자가 그 페이지를 열 때마다 스크립트가 실행됩니다. 이로 인해 사용자의 쿠키 정보를 탈취하거나 다른 공격을 할 수 있습니다. 이를 방지하기 위해서는 입력 검증과 적절한 출력 인코딩이 필수입니다.
Reflected XSS
클릭함 사용자->>웹서버: 악성 URL로 페이지 요청 Note right of 웹서버: URL 파라미터에
악성 스크립트가 포함됨 웹서버->>사용자: 스크립트 실행 페이지 반환 Note right of 사용자: 악성 스크립트가
실행됨
Reflected XSS는 URL의 일부분을 이용하여 공격합니다. 이는 사용자가 클릭한 URL에 직접 삽입된 스크립트를 통해 발생합니다. URL이 웹 페이지에 반영될 때 악성 스크립트가 실행됩니다. 이러한 공격은 대상 사용자가 악성 URL을 클릭할 수 있도록 소셜 엔지니어링을 사용하는 경우가 많습니다.
예를 들어, 사용자에게 악성 URL을 이메일로 보낼 수 있습니다. 사용자가 링크를 클릭하면, 스크립트가 실행되어 민감한 정보가 공격자에게 전송될 수 있습니다. 이를 방지하기 위해서는 입력 검증과 URL 인코딩, 그리고 사용자가 클릭할 수 있는 링크에 대한 검증이 중요합니다.
DOM 기반 XSS
클릭함 사용자->>웹페이지: 페이지 내 액션(예: 버튼 클릭) Note over 사용자,웹페이지: DOM이 악성 스크립트로
조작됨 웹페이지->>사용자: 악성 스크립트 실행 Note right of 사용자: 악성 스크립트가
실행됨
DOM 기반 XSS는 문서 객체 모델(DOM)을 조작하여 발생합니다. 이 공격은 웹 페이지의 DOM 구조를 변경하여 스크립트를 실행시킵니다. 주로 AJAX 호출이나 사용자 입력을 DOM에 직접 삽입할 때 발생합니다.
이 유형의 XSS는 페이지 자체의 HTML이 수정되지 않고도 발생할 수 있습니다. 스크립트는 사용자의 브라우저 내에서만 실행되기 때문입니다. 이를 방지하기 위해서는 사용자 입력을 DOM에 삽입하기 전에 적절한 검증과 인코딩이 필수입니다. 또한, Content Security Policy (CSP)를 이용하여 스크립트 실행을 제한할 수 있습니다.
크로스 사이트 스크립팅: XSS(Cross-Site Scripting)를 방지하는 방법
입력 데이터의 검증 및 이스케이핑 (Validation & Escaping)
HTML 이스케이핑
HTML 이스케이핑은 특수 문자를 HTML 엔터티로 변환하는 과정입니다. 예를 들어, <
는 <
, >
는 >
와 같이 변환됩니다. 이렇게 하면 웹 브라우저는 이러한 문자를 코드의 일부로 해석하지 않고 그대로 표시하게 됩니다.
대부분의 현대 웹 프레임워크는 자동으로 이스케이핑을 지원합니다. 따라서 개발자는 일일이 이스케이핑을 처리할 필요가 없습니다. 하지만, 레거시 코드나 수동으로 이스케이핑을 해야 할 경우가 있을 수 있으므로, 이 기능을 언제 어떻게 사용해야 하는지 반드시 알고 있어야 합니다.
정규 표현식을 이용한 검증
입력 데이터를 검증할 때 정규 표현식(Regex)을 사용하면 더욱 안전한 코드를 작성할 수 있습니다. 정규 표현식을 사용하여 입력 데이터의 형식을 명확하게 지정할 수 있습니다. 예를 들어, 이메일 주소 형식, 전화번호 형식 등을 정규 표현식으로 지정하여 검증할 수 있습니다.
단, 정규 표현식을 잘못 사용하면 보안 취약점이 발생할 수 있으므로 주의가 필요합니다. 복잡한 정규 표현식은 테스트와 코드 리뷰를 통해 반드시 검증해야 합니다.
콘텐츠 보안 정책 (Content Security Policy, CSP)
CSP 헤더 설정
CSP는 웹 브라우저에게 어떤 리소스가 안전한지 알려주는 보안 헤더입니다. 이를 통해 XSS 공격을 크게 제한할 수 있습니다. 예를 들어, script-src 'self'
라는 CSP를 설정하면 현재 도메인에서만 스크립트를 로드할 수 있게 됩니다.
웹 서버 설정 파일이나 웹 애플리케이션의 설정 부분에 CSP 헤더를 추가할 수 있습니다. 다양한 CSP 옵션을 통해 보안을 굳건히 할 수 있습니다.
보고서 URI 사용
CSP 설정에 report-uri
또는 report-to
지시문을 추가하면 위반 사항을 보고받을 수 있습니다. 이를 통해 실시간으로 어떤 공격이 시도되고 있는지 파악하고 대응할 수 있습니다.
사이트 간 요청 위조 CSRF(Cross Site Request Forger)
사이트 간 요청 위조 CSRF(Cross Site Request Forger)란 무엇인가?
사이트 간 요청 위조 또는 CSRF는 최종 사용자가 의도하지 않은 작업을 수행하도록 속이는 서버 측 공격입니다. 이는 이메일 주소 변경부터 사용자 동의 없이 자금을 송금하는 것까지 포함할 수 있습니다.
사이트 간 요청 위조 CSRF(Cross Site Request Forger)의 공격 과정
초기 인증 과정
일반적으로 웹 애플리케이션은 사용자가 서비스를 이용하기 위해 로그인을 해야합니다. 이때 서버는 사용자를 식별할 수 있는 인증 쿠키를 발급합니다. 사용자가 이 쿠키를 가지고 있으면, 서버는 사용자가 누구인지 알 수 있습니다. 즉, 로그인 상태를 유지하기 위해 쿠키를 사용하게 됩니다. 이 쿠키는 브라우저가 서버로 요청을 보낼 때마다 자동으로 첨부되며, 그래서 사용자가 별도로 로그인을 해야 하는 번거로움을 피할 수 있습니다.
하지만 문제는 이 쿠키가 무분별하게 사용될 수 있다는 것입니다. 즉, 다른 웹사이트에서 이 쿠키를 악용하여 요청을 보낼 수 있습니다. 사용자가 다른 탭에서 악성 사이트를 방문하게 되면, 그 사이트는 사용자가 가지고 있는 인증 쿠키를 이용하여 원치 않는 요청을 보낼 수 있습니다.
악성 코드의 실행과 데이터 변경
사용자가 악성 웹사이트를 방문하게 되면, 그 사이트는 미리 준비된 악성 코드를 사용자의 브라우저에서 실행시킵니다. 이때 사용자는 이 사실을 전혀 모르고 있을 가능성이 높습니다. 악성 코드는 자바스크립트 등을 이용하여 작성될 수 있으며, 이 코드가 실행되면 사용자의 인증 쿠키를 탈취하거나 사용하여 요청을 보내게 됩니다.
이렇게 하여 대상 웹사이트는 악성 요청을 정상적인 요청으로 인식하게 되고, 사용자의 데이터를 변경하거나 삭제할 수 있게 됩니다. 사용자는 이 모든 과정을 모르고 있을 수 있으며, 대체로 이러한 공격이 발생했음을 알아채기 어렵습니다.
인증된 상태입니다. 사용자->>해커의_웹사이트: 해커의 웹사이트 방문 해커의_웹사이트->>사용자: 악성 코드 삽입된 페이지 제공 Note right of 사용자: 사용자는 모르고 있다.
악성 코드가 삽입되어 있다. 사용자->>대상_웹사이트: 악성 코드에 의한 자동 요청 Note over 사용자,대상_웹사이트: 악성 코드는 사용자의
인증 쿠키를 이용하여
대상 웹사이트에 요청합니다. 대상_웹사이트->>사용자: 요청 처리 (데이터 변경) Note right of 대상_웹사이트: 인증된 사용자로 판단,
데이터 변경을 수행합니다.
이 다이어그램과 설명을 통해 CSRF 공격이 어떻게 작동하는지, 그리고 어떤 위험성을 가지고 있는지 이해할 수 있을 것입니다. 따라서 이러한 공격으로부터 보호하기 위한 여러가지 방법이 필요합니다.
XSS, CSRF 차이
XSS의 주된 작동 원리: 스크립트 삽입
XSS(크로스 사이트 스크립팅)의 주요 공격 메커니즘은 스크립트 삽입입니다. 공격자는 웹 사이트의 취약한 부분에 악성 스크립트를 삽입하여 실행시키는 방식으로 작동합니다. 이 공격은 대상 웹 페이지가 사용자 입력을 제대로 검증하지 않을 때 발생하는 경우가 많습니다.
스크립트는 웹 페이지에 삽입된 후, 다른 사용자가 해당 페이지에 접속할 때 실행됩니다. 이 스크립트는 웹 브라우저 내에서 실행되며, 이를 통해 공격자는 사용자의 세션 토큰을 탈취하거나 다른 민감한 정보를 노출시킬 수 있습니다. 즉, XSS는 주로 클라이언트 측에서 발생하는 문제입니다.
CSRF의 주된 작동 원리: 인증 토큰 도용
CSRF(Cross-Site Request Forgery)는 다소 다른 방식으로 작동합니다. 이 공격은 인증 토큰이나 쿠키를 도용하여 사용자가 무의식적으로 공격자가 의도한 행동을 수행하게 하는 방식입니다. 공격자는 이용자가 이미 로그인한 상태에서 악성 웹 페이지에 방문하도록 유도하거나 이메일, 메시지 등을 통해 악성 링크를 전송합니다.
사용자가 이 링크를 클릭하면, 이미 인증된 상태의 쿠키나 토큰을 사용하여 공격자가 준비한 악성 요청이 전송됩니다. 대상 웹 서비스는 이를 정상적인 요청으로 판단하여 데이터를 변경하거나 삭제할 수 있습니다. CSRF는 주로 서버 측에서 발생하는 문제이며, 이를 방지하기 위해 CSRF 토큰 같은 추가적인 인증 메커니즘을 도입하는 것이 일반적입니다.
이 두 공격 방식의 주요 차이점은, XSS가 웹 애플리케이션 내에서 코드를 실행시키는 데 초점을 맞추는 반면, CSRF는 사용자의 인증 상태를 악용하여 서버에 미리 정의된 악성 요청을 전송하는 것입니다. XSS는 데이터를 탈취하는 데 특화되어 있으며, CSRF는 인증된 사용자의 권한을 악용하여 데이터를 변경하거나 삭제합니다.
XSS, CSRF 차이: 요약
따라서 XSS는 주로 웹 브라우저 내에서 실행되며, 이를 통해 공격자는 사용자의 세션 토큰을 탈취하거나 다른 민감한 정보를 노출시키는 클라이언트 측에서 발생하는 문제이며, CSRF는 인증된 사용자의 권한을 악용하여 데이터를 변경하거나 삭제하는 차이가 있습니다.