본문으로 건너뛰기

READMD

4장

애플리케이션 간 접근 제한의 필요성

  • 웹 어플리케이션에서 개인 정보 보호를 하려면 다른 앱 어플리케이션에서의 접속을 제한해야 한다.

동일 출처 정책에 의한 보호

  • 인터넷 리소스를 공개할 때는 다른 웹 어플리케이션에서 접속을 반드시 제한해야 한다.

  • 브라우저는 웹 어플리케이션 사이에 출처라는 경계를 설정해 서로의 접근을 제한한다.

교차 출처

  • 스키마, 호스트, 포트번호, 경로가 다른것을 교차 출처라 칭한다.

교차 출처 요소

  • WEB STORAGE , CANVAS, IFRAME등이 이에 속한다.

CORS

  • CDN 같이 믿을 수 있는 출처라면 동일 출처가 아닌 교차 출처를 이용해도 문제가 발생할 수 있다

  • 이를 우회하기 위해 사용하는 것을 출처 간 리소스 공유 방식을 사용한다.

CORS 방식

단순 요청

  • GET 또는 POST 로 전송하는 기본 요청을 단순 요청이라 칭한다.

  • CORS의 스펙이 기재된 Fetch Standard에서 CORS - safelisted로 간주되는 HTTP 메소드HTTP 해더만을 전송하는 요청을 의미한다.

  • Access - Control - Orgin 헤더를 사용할 해 접근을 허가할 수 있다.

Preflight Request

  • Access - Control - Orgin 헤더는 js 엔진이 받아온 리소스에 접근할 수 있도록 허용하는 것일 뿐이다.

  • 이에 따라 만일 피싱사이트로 사용자의 정보를 탈취해 공격을 한다면, 서버는 막을 방법이 없다.

  • 그렇기에 서버에선 합의된 요청많을 받을 수 있도록 해야하는데, PUT,DELETE 만을 가능한다.

CORS 요청 모드

  • 프론트에서도 fetch 에서 cors 모드를 조절할 수 있다,
모드설명특징사용 사례
cors기본값. 교차 출처 요청을 허용하지만 CORS 규칙 준수 필요- 서버에서 적절한 CORS 헤더 필요
- 권한 있는 요청(credentials)도 가능
- 응답 본문에 완전히 접근 가능
- 대부분의 API 호출
- 서버가 CORS를 지원하는 경우
same-origin같은 출처(도메인)로만 요청 허용- 다른 출처로 요청 시 TypeError 발생
- 가장 엄격한 보안 설정
- 내부 API 호출
- 민감한 작업 수행 시
no-corsCORS 검사를 우회하지만 제한된 응답만 가능- 응답이 "opaque"(불투명)하게 처리됨
- 응답 본문 접근 불가
- 상태 코드 확인 불가
- 헤더 읽기 불가
- 이미지, 스크립트 등 정적 자원 가져오기
- 단순 GET 요청으로 캐싱만 필요한 경우
navigateHTML 문서 탐색용- 브라우저 내부적으로 사용
- 개발자가 직접 사용하지 않음
- 브라우저가 내부적으로 사용

cross-origin

  • 보통 HTML에서 사용하는 <img>,<script> 이를 cross-origin 속성을 이용해서 제한할 수 있다.

프로세스 분리에 따른 사이드 채널 공격 대책

  • 동일 출처 정책으로는 막을 수 없는 하드웨어와 같은 부분에 대한 사이드 채널 공격이 존재한다.

사이드 채널 공격을 방어하는 site isolation

  • 스펙터는 접근 불가능한 메모리 안의 데이터에 대해 추측이 가능한 것이 입증 되었다.

  • 보통 프로그램은 프로세스 단위로 프로그램을 처리하는데, 이 메모리 접근 영역을 나눠서 프로그램을 이렇게 나눠진 단위를 `Site Isolation`` 이라 칭한다.

출처마다 프로세스를 분리하는 구조

  • 출처 단위의 공격에서 이를 막지 못하는데
  • 사이드 채널 공격이 발생하지 않음을 보장해야한다.
  • 이 분리 구조를 CROSS - ORIGIN - ISOLATION이라 칭한다.

이를 위해 3가지 응답 헤더를 사용하는데

  • CORP , COEP, COOP 등이 있다.

1. CORP (Cross-Origin Resource Policy)

리소스 자체를 보호하는 헤더 서버가 어떤 출처에서 해당 리소스를 로드할 수 있는지 지정

값: same-origin, same-site, cross-origin 예: Cross-Origin-Resource-Policy: same-origin

2. COEP (Cross-Origin Embedder Policy)

문서가 다른 출처의 리소스를 로드할 때 적용되는 정책 명시적으로 공유를 허용한 리소스만 로드되도록 강제

값: require-corp는 모든 리소스가 CORP 헤더로 공유 허용해야 함 예: Cross-Origin-Embedder-Policy: require-corp

3. COOP (Cross-Origin Opener Policy)

문서가 다른 출처의 창(window)과 어떻게 상호작용할지 제어 창 간의 참조를 제한해 정보 유출 방지

값: same-origin, same-origin-allow-popups, unsafe-none 예: Cross-Origin-Opener-Policy: same-origin