본문 바로가기
개발/개념

CORS

by BENGGRI 2022. 10. 27.
반응형

Cross-Origin Resource Sharing(CORS)

  • 교차 출처 리소스 공유
  • 브라우저에서 다른 출처의 리소스를 공유하는 방법

URL 구조

  • Fragment
    • 리소스 자체의 다른 부분을 가리키는 앵커
    • 리소스 내에서 북마크의 한 종류
    • 보여주기 위한 방법을 나타내며 HTML 문서 상에서 브라우저는 앵커가 정의된 지점으로 스크롤된다

출처(Orgin)

  • URL 구조에서 Protocol, Host, Port를 합친 것을 의미

같은 출처와 다른 출처

  • https://test.domain.com/path1

URL 결과 이유

https://test.domain.com/path2 같은출처 Protocol, Host, Port 같음
https://test.domain.com/path3?k=v 같은출처 Protocol, Host, Port 같음
http://test.domain.com/path1 다른출처 Protocol 다름
http://test.domain.com:8080/path1 다른출처 Protocol, Port 다름
http://test.domain.com/path1 다른출처 Protocol, Host 다름

동일 출처 정책(SOP:Same-Origin Policy)이란?

  • Postman으로 API를 테스트하거나, 다른 서버에서 API를 호출할 때는 멀쩡히 잘 동작하다가 브라우저에서 API를 호출할 때만 CORS policy 오류가 발생하는 경우가 있습니다
  • 그 이유는 브라우저가 동일 출처 정책(Same-Origin Policy, SOP)를 지켜서 다른 출처의 리소스 접근을 금지하기 때문입니다
  • 하지만 실제로 웹페이지는 상당히 자주 다른 출처의 리소스를 사용해야 합니다
  • 예를 들어 test.domain.com 라는 도메인 주소를 사용하는 웹페이지에서 test.api.com 라는 API 서버로 데이터를 요청해서 화면을 그린다면 이 웹페이지는 동일 출처 정책을 위반한 것이 됩니다

동일 출처 정책의 장점

  • 동일 출처 정책을 지키면 외부 리소스를 가져오지 못해 불편하지만, 동일 출처 정책은 XSS나 XSRF 등의 보안 취약점을 노린 공격을 방어할 수 있습니다
  • 하지만 현실적으로는 외부 리소스를 참고하는 것은 필요하기 때문에 외부 리소스를 가져올 수 있는 방법이 존재해야 합니다
  • 외부 리소스를 사용하기 위한 SOP의 예외 조항이 CORS입니다

CORS 해결 방법

  • 서버에서 Access-Control-Allow-Origin 헤더를 포함한 응답을 브라우저에 보내는 방식으로 CORS 에러를 해결할 수 있습니다
  • 프론트엔드 개발자가 CORS 에러를 확인했다면, 서버에 Access-Control-Allow-Origin 등 CORS를 해결하기 위한 몇 가지 응답 헤더를 포함해 달라고 요청해야 합니다
  • 많은 프레임워크에서 CORS를 해결해 주는 라이브러리 및 설정 방법이 존재합니다

HTTP 응답 헤더

Access-Control-Allow-Origin: <origin> | *

  • Access-Control-Allow-Origin 헤더에 작성된 출처만 브라우저가 리소스를 접근할 수 있도록 허용
Access-Control-Allow-Origin: <https://mkyu.api.com>
Access-Control-Allow-Origin: *

Access-Control-Allow-Methods: <method>[, <method>]*

  • 브라우저에서 보내는 요청 헤더에 포함된 Access-Control-Request-Method 헤더에 대한 응답 결과입니다
  • 리소스 접근을 허용하는 HTTP 메서드를 지정해 주는 헤더
Access-Control-Allow-Methods: GET, PUT

Access-Control-Expose-Headers: <header-name>[, <header-name>]*

  • 서버에서 응답 헤더에 Access-Control-Expose-Headers를 추가해 줘야 브라우저의 자바스크립트에서 헤더에 접근할 수 있습니다
Access-Control-Expose-Headers: X-My-Custom-Header, X-Another-Custom-Header

Access-Control-Allow-Headers: <header-name>[, <header-name>]*

  • 브라우저에서 보내는 요청 헤더에 포함된 Access-Control-Request-Headers 헤더에 대한 응답 결과
  • 자바스크립트에서 커스텀 헤더를 서버에 전달하게 되면, OPTIONS 요청 헤더의 Access-Control-Request-Headers 헤더에 커스텀 헤더 이름이 추가됩니다
  • 서버에서는 Access-Control-Request-Headers에 작성된 값을 보고 Access-Control-Allow-Headers 응답 헤더에 커스텀 헤더 이름을 명시해 주어야 합니다
Access-Control-Allow-Headers: X-Custom-Request

Access-Control-Max-Age: <delta-seconds>

  • preflight 요청 결과를 캐시 할 수 있는 시간을 나타냅니다
  • 아래와 같이 초 단위로 캐시 시간을 설정
Access-Control-Max-Age: 60

Access-Control-Allow-Credentials: true

  • 자바스크립트 요청에서 credentials가 include일 때 요청에 대한 응답을 할 수 있는지를 나타냅니다
  • false로 설정해 주고 싶을 경우에는 헤더를 생략
Access-Control-Allow-Credentials: true

반응형

'개발 > 개념' 카테고리의 다른 글

인증/인가  (0) 2023.01.12
REST API  (0) 2022.10.21
일급 객체  (0) 2022.10.21
Web Server, WAS  (2) 2022.10.07
[가상화, 클라우드] 가상화와 클라우드  (0) 2021.02.23

댓글