SOP 와 CORS 대해서

nichol·2022년 5월 8일
0

Django

목록 보기
2/14

웹 에서 다른 출처로의 리소스 요청을 제한하는 것과 관련된 두 가지 정책

1. SOP

2. CORS

SOP(Same Origin Policy)

  • 다른출처의 리소스를 사용하는 것에 제한하는 보안방식
  • 출처(origin)란 : url의 프로토콜, 호스트, 포트 출처라고하며 하나라도 다르면 다른 출처라고 판단.
    익스플로러는 포트가 출처를 판단하지않아 포트가 달라도 가능

SOP를 사용하는 이유

  • 중간에 특정한 이유로(특정링크클릭 등)으로 다른 출처로 바꿔치기하여 제3자가 접속하는것을 막기위해 사용

CORS(Cross-Origin Resource Sharing) : 교차출처리소스공유

  • SOP의 경우 다른 출처의 리소스를 사용하기 힘들기때문에 몇가지 예외조항을 두고 허용하는 방식
  • 추가 HTTP헤더를 사용하여 하나의 출처에서 실행중인 웹 애플리케이션이 다른출처로 접근할수 있는 권한을 부여하도록 브라우저에 알려주는 체제
  • 나의 web에 다른사람의 API를 사용할때 사용한다.
    ex) 내 web page에 naverMapAPI를 사용할때 naverMapAPI를 사용할수 있도록 권하는 줘야하는데, 권한 주는 방법을 CORS라고 한다.

CORS 권한 부여 종류(3종)

사전확인 요청(Preflight Request)

  • HTTP메소드중에 OPTIONS 메소드를 이용하여 다른 도메인의 리소스요청이 가능한지 미리 확인하는 방식
  • OPTIONS 메소드: 본 요청을 보내기전에 사전에 보내는 메소스
  • 인증구조
    1. Client가 도메인에 리소스요청 전 OPTIONS 메소드로 Preflight Request(사전확인요청) 전달
    2. Server는 (1)요청에 의해 가능한지여부를 판단 후 Preflight Reponse(사전확인요청응답)를 회신
    3. Client는 Preflight Reponse를 받고, 리소스요청이 가능하면 Actual Request(본요청) 전달
    4. Server는 (3)요청에 Actual Reponse에 리소스를 담아 회신한다.
    5. Preflight Reponse에서 거부 하면 Client는 Actual Request 보내지 않는다.
  • Preflight Request(사전확인요청) 내부 구성
    1. Origin : 요청 출처
    2. Access-Control-Request-Method : 요청할 메소드(GET,POST 등)
    3. Access-Control-Request-Headers : 실제 요청시 어떤거를 추가할수 있는지 여부 확인
  • Preflight Reponse(사전확인요청 응답) 내부 구성
    1. Access-Control-Allow-Origin : 서버에서 허가한 출처 내
    2. Access-Control-Allow-Method : 서버에서 허가한 메소드 내용
    3. Access-Control-Allow-Header : 버서측에서 허가한 헤더 내용
    4. Access-Control-Max-Age : 응답한내용을 캐시에 저장후에 보간기간(매번 사전요청/본요청 두개씩 보낼수없음으로 일정시간 응답내용 저장
  • Preflight Reponse 특징
    1. 응답코드: 200번대
    2. 응답바디는 비어있는것이 좋다.

단순요청(Simple Request)

  • Preflight요청없이 바로 요청을 보내는 방식
  • 아래 3개지 조건을 모두 만족하는 경우만 가능하다.
    1. GET, POST, HEAD 메소드중에 하나여야만 가능
    2. ConTent-Type 중 3개만 가능(Application/x-www-form-urlencoded, multipart/form-data, text/plain)
    3. 헤더 4개중 하나여아만 가능(Accept, Accept-Language, Content-Language, Content-Type)
  • 3가지조건중 1번을 제외하고는 2번,3번은 조건을 맞추기가 힘들어 특별한경우를 제외하고는 잘사용되지않는다.

인증정보 포함 요청(Credentialed Request)

  • 인증관련 헤더를 포함할때 사용하는 요청 방식
  • 기존방식보다 조금더 보안을 강화할때 사용하는 방식

참고자료 : https://evan-moon.github.io/2020/05/21/about-cors/

profile
WEB Developer

0개의 댓글