XSS, CSRF 차이점 완벽하게 이해하기: XSS, CSRF 차이

XSS, CSRF 차이점 완벽하게 이해하기: XSS, CSRF 차이
Photo by rc.xyz NFT gallery / Unsplash

들어가며

웹 개발과 관련하여, 신입들이 저지르는 가장 흔한 실수 중 하나는 보안의 중요성을 과소평가하는 것입니다. 많은 개발자들은 특징과 사용자 경험 그리고 성능을 우선시하며, 종종 보안이 문제가 될 때까지 경시합니다. 물론 저도 그랬구요. 하지만 이것만큼 중요한 것은 제품의 기본적인 보안입니다. 🥹

보안 조치를 무시하는 것은 무책임할 뿐만 아니라 위험합니다. 무시하면 데이터 침해, 사용자 신뢰 상실 및 잠재적인 법적 결과를 초래할 위험이 있습니다. 따라서 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

sequenceDiagram participant 사용자 as 사용자 participant 웹서버 as 웹서버 participant 데이터베이스 as 데이터베이스 사용자->>웹서버: 댓글 작성(악성 스크립트 포함) 웹서버->>데이터베이스: 댓글 저장 데이터베이스->>웹서버: 저장 완료 Note right of 웹서버: 악성 스크립트가
데이터베이스에 저장됨 사용자->>웹서버: 페이지 요청 웹서버->>데이터베이스: 댓글 로드 데이터베이스->>웹서버: 댓글 반환(악성 스크립트 포함) 웹서버->>사용자: 댓글 표시(악성 스크립트 실행) Note right of 사용자: 악성 스크립트가
실행됨

Stored XSS는 서버에 저장된 데이터를 통해 발생합니다. 이는 공격자가 웹 애플리케이션의 데이터베이스, 코멘트 섹션, 또는 다른 지속적인 데이터 저장 영역에 악성 스크립트를 삽입하는 것을 포함합니다. 이러한 스크립트는 후에 다른 사용자가 해당 페이지를 방문할 때 실행됩니다.

가장 흔한 예는 게시판이나 블로그 코멘트입니다. 사용자가 코멘트에 스크립트를 삽입하면, 다른 사용자가 그 페이지를 열 때마다 스크립트가 실행됩니다. 이로 인해 사용자의 쿠키 정보를 탈취하거나 다른 공격을 할 수 있습니다. 이를 방지하기 위해서는 입력 검증과 적절한 출력 인코딩이 필수입니다.

Reflected XSS

sequenceDiagram participant 사용자 as 사용자 participant 웹서버 as 웹서버 participant 공격자 as 공격자 공격자->>사용자: 악성 URL 전송 Note right of 사용자: 악성 URL을
클릭함 사용자->>웹서버: 악성 URL로 페이지 요청 Note right of 웹서버: URL 파라미터에
악성 스크립트가 포함됨 웹서버->>사용자: 스크립트 실행 페이지 반환 Note right of 사용자: 악성 스크립트가
실행됨

Reflected XSS는 URL의 일부분을 이용하여 공격합니다. 이는 사용자가 클릭한 URL에 직접 삽입된 스크립트를 통해 발생합니다. URL이 웹 페이지에 반영될 때 악성 스크립트가 실행됩니다. 이러한 공격은 대상 사용자가 악성 URL을 클릭할 수 있도록 소셜 엔지니어링을 사용하는 경우가 많습니다.

예를 들어, 사용자에게 악성 URL을 이메일로 보낼 수 있습니다. 사용자가 링크를 클릭하면, 스크립트가 실행되어 민감한 정보가 공격자에게 전송될 수 있습니다. 이를 방지하기 위해서는 입력 검증과 URL 인코딩, 그리고 사용자가 클릭할 수 있는 링크에 대한 검증이 중요합니다.

DOM 기반 XSS

sequenceDiagram participant 사용자 as 사용자 participant 웹페이지 as 웹페이지 participant 공격자 as 공격자 공격자->>사용자: 악성 스크립트를 포함한 요소(예: 버튼) 공유 Note right of 사용자: 악성 요소를
클릭함 사용자->>웹페이지: 페이지 내 액션(예: 버튼 클릭) 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 엔터티로 변환하는 과정입니다. 예를 들어, <&lt;, >&gt;와 같이 변환됩니다. 이렇게 하면 웹 브라우저는 이러한 문자를 코드의 일부로 해석하지 않고 그대로 표시하게 됩니다.

대부분의 현대 웹 프레임워크는 자동으로 이스케이핑을 지원합니다. 따라서 개발자는 일일이 이스케이핑을 처리할 필요가 없습니다. 하지만, 레거시 코드나 수동으로 이스케이핑을 해야 할 경우가 있을 수 있으므로, 이 기능을 언제 어떻게 사용해야 하는지 반드시 알고 있어야 합니다.

정규 표현식을 이용한 검증

입력 데이터를 검증할 때 정규 표현식(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)의 공격 과정

초기 인증 과정

일반적으로 웹 애플리케이션은 사용자가 서비스를 이용하기 위해 로그인을 해야합니다. 이때 서버는 사용자를 식별할 수 있는 인증 쿠키를 발급합니다. 사용자가 이 쿠키를 가지고 있으면, 서버는 사용자가 누구인지 알 수 있습니다. 즉, 로그인 상태를 유지하기 위해 쿠키를 사용하게 됩니다. 이 쿠키는 브라우저가 서버로 요청을 보낼 때마다 자동으로 첨부되며, 그래서 사용자가 별도로 로그인을 해야 하는 번거로움을 피할 수 있습니다.

하지만 문제는 이 쿠키가 무분별하게 사용될 수 있다는 것입니다. 즉, 다른 웹사이트에서 이 쿠키를 악용하여 요청을 보낼 수 있습니다. 사용자가 다른 탭에서 악성 사이트를 방문하게 되면, 그 사이트는 사용자가 가지고 있는 인증 쿠키를 이용하여 원치 않는 요청을 보낼 수 있습니다.

악성 코드의 실행과 데이터 변경

사용자가 악성 웹사이트를 방문하게 되면, 그 사이트는 미리 준비된 악성 코드를 사용자의 브라우저에서 실행시킵니다. 이때 사용자는 이 사실을 전혀 모르고 있을 가능성이 높습니다. 악성 코드는 자바스크립트 등을 이용하여 작성될 수 있으며, 이 코드가 실행되면 사용자의 인증 쿠키를 탈취하거나 사용하여 요청을 보내게 됩니다.

이렇게 하여 대상 웹사이트는 악성 요청을 정상적인 요청으로 인식하게 되고, 사용자의 데이터를 변경하거나 삭제할 수 있게 됩니다. 사용자는 이 모든 과정을 모르고 있을 수 있으며, 대체로 이러한 공격이 발생했음을 알아채기 어렵습니다.

sequenceDiagram participant 사용자 as 사용자 participant 해커의_웹사이트 as 해커의 웹사이트 participant 대상_웹사이트 as 대상 웹사이트 사용자->>대상_웹사이트: 로그인 (인증 성공) 대상_웹사이트->>사용자: 인증 쿠키 발급 Note right of 사용자: 이제 사용자는
인증된 상태입니다. 사용자->>해커의_웹사이트: 해커의 웹사이트 방문 해커의_웹사이트->>사용자: 악성 코드 삽입된 페이지 제공 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는 인증된 사용자의 권한을 악용하여 데이터를 변경하거나 삭제하는 차이가 있습니다.


마치며

함께 읽으면 좋은 글

http, https, hsts의 차이와 이해: HTTP vs HSTS vs HTTPS
들어가며 웹 세상은 매일 수많은 데이터 패킷이 오가는 복잡한 생태계입니다. 이 글에서는 HTTP, HTTPS, 그리고 HSTS에 대한 깊은 이해를 목표로 합니다. 개발자라면 이러한 기초적인 웹 통신 규약에 대해 확실히 알고 있어야 웹 애플리케이션의 보안과 성능을 최적화할 수 있습니다. HTTP(HyperText Transfer Protocol): 웹의 기초 HTTP란? HTTP는 HyperText Transfer Protocol의 약자로,
SSL v3란 무엇인가?: SSL 3.0에 대하여
들어가며 웹 트래픽을 보안하는 방법에 대해 깊게 생각해본 적이 있나요? SSL(Secure Sockets Layer)은 이를 가능하게 하는 암호화 프로토콜 중 하나입니다. SSL의 여러 버전 중 하나인 SSL 3.0(SSL v3)은 이제는 거의 사용되지 않지만, 그 역사와 작동 원리, 그리고 왜 더 이상 사용되지 않는지를 이해하는 것은 여전히