Browser Security SOP CORS CSRF XSS

3줄 요약

  • 브라우저 보안 모델은 서버 보안의 대체재가 아니라, Origin, Cookie, DOM, Script 실행 경계 위에서 동작하는 추가 방어선이다.
  • SOP는 cross-origin 응답 읽기를 제한하고, CORS는 서버가 특정 Origin에 읽기 권한을 열어 주는 정책이며, CSRF와 XSS는 서로 다른 공격이다.
  • 방어는 쿠키 속성, CSRF token, CORS allowlist, 출력 인코딩, CSP, 보안 로그를 공격 종류별로 조합해야 한다.

핵심 정리

  • Origin은 scheme, host, port의 조합이다. https://app.example.comhttps://api.example.com은 같은 site일 수 있지만 같은 origin은 아니다.
  • SOP는 다른 origin의 응답을 JavaScript가 읽는 것을 제한한다. 그러나 form submit, image load, 일부 navigation처럼 요청 전송 자체를 모두 막지는 않는다.
  • CORS는 인증이나 권한 검사가 아니다. 브라우저가 cross-origin 응답을 JavaScript에 노출해도 되는지 판단하는 규칙이다.
  • CSRF는 피해자 브라우저가 인증 쿠키를 자동 전송하는 성질을 이용한다. 상태 변경 요청이 cookie 인증에 의존하면 CSRF 방어가 필요하다.
  • XSS는 공격자가 브라우저에서 script를 실행하게 만드는 문제다. 저장 XSS, 반사 XSS, DOM XSS는 주입 위치와 실행 위치가 다르다.
  • SameSite는 cookie 전송 정책이고 CSP는 리소스 로딩과 script 실행 정책이다. 둘 다 중요하지만 출력 인코딩과 서버 권한 검사를 대체하지 않는다.

하위 문서 연결

    1. Same-Origin Policy와 브라우저 보안 모델: SOP가 막는 것과 막지 못하는 것을 구분한다.
    1. CORS Preflight와 실전 디버깅: credential 포함 CORS, preflight, Vary: Origin, Spring CORS 위치를 다룬다.
    1. CSRF 공격 원리와 방어 설계: 쿠키 자동 전송, CSRF token, Origin 검증, SameSite의 한계를 다룬다.
    1. XSS 공격 원리와 출력 저장 DOM 방어: context-aware encoding, sanitizer, CSP, localStorage token 위험을 다룬다.
    1. SameSite CSP 보안 헤더: SameSite와 CSP를 실제 응답 헤더 계약으로 관리하는 기준을 다룬다.

헷갈리는 지점

  • CORS를 열면 서버 인증이 열리는 것으로 오해하기 쉽다. 브라우저 콘솔 에러에서 자주 보이기 때문이다.
    • 핵심은 CORS가 응답 읽기 정책이지 서버 간 호출이나 권한 검사가 아니라는 점이다.
    • CORS를 막아도 서버는 요청을 받을 수 있으므로 인증과 인가는 별도로 해야 한다.
  • SOP가 있으니 CSRF가 불가능하다고 생각하기 쉽다.
    • 핵심은 SOP가 응답 읽기를 제한해도 요청 전송 자체는 가능한 경우가 많다는 점이다.
    • 쿠키 기반 상태 변경 API는 CSRF token과 SameSite, Origin 검증을 함께 본다.
  • XSS는 <script> 문자열만 막으면 된다고 생각하기 쉽다.
    • 핵심은 출력 위치별 encoding이다.
    • HTML 본문, HTML attribute, URL, JavaScript 문자열, CSS context는 서로 다른 처리가 필요하다.
  • CSP가 있으면 XSS 방어가 끝난다고 보기 쉽다.
    • 핵심은 CSP가 피해를 줄이는 보조 방어선이라는 점이다.
    • 안전한 출력 인코딩과 HTML sanitizer가 먼저고 CSP는 실행 가능 범위를 줄인다.

확인 질문

  • SOP와 CORS의 차이는 무엇인가?
    • SOP는 기본 제한이고, CORS는 서버가 특정 cross-origin 응답 읽기를 허용하는 예외 정책이다.
  • CSRF와 XSS의 차이는 무엇인가?
    • CSRF는 피해자 브라우저의 인증 상태로 요청을 보내는 공격이고, XSS는 피해자 브라우저에서 공격자 script를 실행하는 공격이다.
  • 쿠키 기반 인증 API에서 CSRF 방어가 필요한 이유는 무엇인가?
    • 브라우저가 cross-site 요청에도 조건이 맞으면 쿠키를 자동 전송할 수 있기 때문이다.
  • CSP를 적용해도 출력 인코딩이 필요한 이유는 무엇인가?
    • CSP는 script 실행을 줄이는 보조 방어선이고, 신뢰할 수 없는 데이터가 HTML/JS context에 섞이는 문제 자체를 없애지는 못하기 때문이다.