CORS
sop(same origin policy) : 같은 출발지 정책
브라우저에선 보안적 이슈로 cross-origin http 요청을 제한한다
그래서 cross-origin 요청을 하려면 서버의 동의가 필요하다
만약 서버가 동의한다면 브라우저에서는 요청을 허락하고
동의하지 않는다면 브라우저
에서 막는다(거절)
이러한 동의하는 로직을 HTTP-header를 이용한다
이를 cors(Cross-origin Resource Sharing)이라 부른다
Cross-origin이란?
- 프로토콜이 다르다 : http와 https는 프로토콜이 다르다
- 도메인 : domain.com과 other-domain.com은 다르다
- 포트 번호 : 8080 포트와 3000포트는 다르다
CORS가 필요한 이유
CORS가 없이 모든 곳에서 데이터를 요청하게 된다면
다른 사이트에서 원래 사이트를 흉내 낼 수 있게 된다.
예를 들어 기존 사이트와 완전히 동일하게 동작하도록 하여
사용자가 로그인을 하도록 만들고, 로그인했던 세션들을
탈취하여 악의적인 정보를 추출하거나 다른사람의 정보를 입력하는 등
사이버공격을 할 수 있다.
이렇게 공격을 할 수 없도록 브라우저에서 보호하고
필요한 경우에만 서버의 협의하여 요청할 수 있도록 하기 위함이다
CORS 동작
Simple qeuests인 경우
- 서버로 요청을 한다
- 서버의 응답이 왔을 때 브라우저가 요청한 Origin과 응답한 헤더
Access-Control-Request-Headers
의 값을 비교하여 유효한 리소스를 응답합니다 - 유효하지 않는 요청일 경우 브라우저에서 추가 응답을 하지않고 에러를 발생시킴
Simple requests란
HTTP method가 GET / HEAD / POST 중 하나
자동으로 설정되는 헤더 제외하고 설정할 수 있는
Accept/Accept-Language/Content-Language만 변경하면서
Content-Type이 같은 경우 Simple request라고 부른다
> application/x-www-form-urlencoded
> multipart/form-data
> text/plain
preflight 요청일 경우
- Origin헤더에 현재 요청하는 Origin과
Access-Control-Request-Method
헤더에 요청하는 HTTP method와Access-Control-Request-Headers
요청 시 사용할 헤더를
OPTIONS 메서드로 서버에 요청한다
이때 내용물 없이 헤더만 전송한다 - 브라우저가 서버에서 응답한 헤더 확인 후 유효한 요청인지 확인한다
만약 유효하지 않는 요청일 경우 요청은 중단되고 에러가 발생된다
만약 유효한 요청이라면 원래 요청으로 보내려던 요청을 다시 . 재요청하여
리소스를 응답 받는다
preflight요청이란?
Simple requests가 아닌 cross-origin
요청은 모두
preflight요청을 하게 되는데 실제 요청을 보낸 것이 안전한지 확인하기 위해
먼저 OPTIONS메서드를 사용하여 cross-origin
HTTP 요청을 보낸다
이렇게 하는 이유는 사용자 데이터에 영향을 미칠 수 있는 요청이므로
사전에 확인 후 본 요청을 보낸다
[!💡 관련사이트 ]
https://developer.mozilla.org/ko/docs/Web/HTTP/CORS
교차 출처 리소스 공유 (CORS) - HTTP | MDN
교차 출처 리소스 공유(Cross-Origin Resource Sharing, CORS)는 추가 HTTP 헤더를 사용하여, 한 출처에서 실행 중인 웹 애플리케이션이 다른 출처의 선택한 자원에 접근할 수 있는 권한을 부여하도록 브라
developer.mozilla.org
CORS와 쿠키
cors는 쿠키와 관련 깊다
cors는 백엔드 컴퓨터의 자원을 보호하기 위해 있는게 아니다
브라우저를 보호하기 위해 있는 것이다
쿠키의 로그인 증서의 특징 : 출처가 적혀있다
CORS를 허용하게 될 경우
쿠키의 출처를 확인하지 않기 때문에, 보안이 취약해 질 수 있다
이런 취약점을 노려 공격하는 기법은 CSRF
라고 한다
❤ 김춘장이의 위키백과 - 나만의 공부 기록 Tistory ❤
gayulz - Overview
개발자가 되고싶은 개발어린이💟. gayulz has 11 repositories available. Follow their code on GitHub.
github.com
'👩🏻💻 𝐋𝐚𝐧𝐠𝐮𝐚𝐠𝐞 > ⠀⠀⠀⠀ Nᴏᴅᴇ.Jꜱ' 카테고리의 다른 글
Swagger가 뭔가요 (0) | 2024.02.01 |
---|---|
RestAPI & import 간단 메모 (0) | 2024.02.01 |
express기초-nodemon (0) | 2024.02.01 |
데이터통신-요청헤더,응답헤더 (0) | 2024.02.01 |
API CRUD 간단정리 (0) | 2024.02.01 |