도 메 인 을 뛰 어 넘 는 두 세 가지 일.
글 의 첫머리
크로스 도 메 인 은 일상적인 개발 에서 자주 접 할 수 있 는 어 려 운 지식 인 데 실천 을 정리 하지 않 으 면 마음 속 으로 는 걱정 이 없다.
동원 정책
크로스 도 메 인 솔 루 션 이 나 오 는 이 유 는 동원 전략의 제한 때문이다.같은 소스 정책 은 두 url 의 프로 토 콜, 도 메 인 이름, 포트 중 하나 가 다 르 면 크로스 소스 를 인정 하도록 규정 하고 있 습 니 다.예 를 들 어 다음 표 는
http://127.0.0.1:3000
와 비교 한 동원 검 측 결 과 를 보 여 줍 니 다.url
결실
원인.
http://127.0.0.1:3000/index
근원 을 같이 하 다
https://127.0.0.1:3000
크로스 소스
협의 가 다르다
https://localhost:3000
크로스 소스
도 메 인 이름 이 다 름
http://127.0.0.1:3001
크로스 소스
포트 가 다르다
그 크로스 소스 는 어떤 결과 가 있 습 니까?요약 은 세 가지 가 있 습 니 다. 쿠키, LocalStorage, IndexedDB 를 가 져 올 수 없습니다.dom 노드 가 져 올 수 없 음;일반적인 Ajax 통신 을 할 수 없습니다.크로스 도 메 인 솔 루 션 의 등장 은 이런 아 픈 점 을 해결 하기 위 한 것 이다.
JSONP 크로스 필드
JSONP 크로스 필드 를 언급 할 때 먼저
script
라벨 을 언급 해 야 합 니 다. img
, iframe
라벨 과 유사 합 니 다. 이 라벨 들 은 같은 소스 정책 에 제한 을 받 지 않 습 니 다. JSONP 의 핵심 은 동적 으로 script 라벨 을 불 러 와 목표 url 에 대한 요청 을 완성 하 는 것 입 니 다.먼저 JSONP 가 호출 한
Headers
부분 을 살 펴 보 겠 습 니 다. 필드 는 다음 과 같 습 니 다.Request URL:http://127.0.0.1:3000/?callback=handleResponse
Request Method:GET
Status Code:200 OK
Remote Address:127.0.0.1:3000
Request URL
에 있 는 한 마디 ?callback=handleResponse
를 선명 하 게 발견 할 수 있 습 니 다. 이 콜 백 뒤에 따 르 는 handle Response 즉 리 셋 함수 명 (임의로 가 져 갈 수 있 음) 은 서버 에서 이 인 자 를 받 은 다음 에 맞 춤 형 handleResponse(JSON)
의 형식 으로 전단 에 반환 합 니 다 (이것 도 JSONP = = JSON with padding 의 원인 이 죠). 다음 그림 입 니 다.이 때 브 라 우 저 는 우리 가 미리 정의 한 handle Response 함 수 를 자동 으로 호출 합 니 다.전단 코드 예시: (원본 은http://127.0.0.1:3001)
function handleResponse(res) {
console.log(res) // {text: "jsonp"}
}
const script = document.createElement('script')
script.src = 'http://127.0.0.1:3000?callback=handleResponse'
document.head.appendChild(script)
서버 코드 예시: (원본 은http://127.0.0.1:3000)
const server = http.createServer((req, res) => {
if (~req.url.indexOf('?callback')) { // JSONP
const obj = {
"text": 'jsonp',
}
const callback = req.url.split('callback=')[1]
const json = JSON.stringify(obj)
const build = callback + `(${json})`
res.end(build) // JSON
}
});
JSONP 는 응답 텍스트 에 직접 접근 하 는 장점 이 있 음 을 알 수 있 습 니 다. 그러나 JSONP 가 요청 에 실 패 했 는 지 확인 하 는 것 은 쉽 지 않 습 니 다. script 태그 의 onerror 이 벤트 는 브 라 우 저의 광범 위 한 지원 을 받 지 못 했 기 때문에 GET 방식 으로 만 호출 할 수 있 습 니 다.
CORS 크로스 필드
CORS (Cross - Origin Resource Sharing) 는 강화 판 Ajax 로 이해 할 수 있 으 며, 현재 주류 인 크로스 오 버 솔 루 션 이기 도 하 다.그것 의 핵심 사상 은 바로
Ajax , HTTP
이다.예 를 들 어 전단 코드http://127.0.0.1:3001) Ajax 단락 을 썼 습 니 다. 코드 는 다음 과 같 습 니 다.
const xhr = new XMLHttpRequest()
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
if (xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) {
console.log('responseTesx:' + xhr.responseText)
}
}
}
xhr.open('get', 'http://127.0.0.1:3000', true)
xhr.send()
포트 가 일치 하지 않 기 때문에 이 때 는 소스 가 다 릅 니 다. 이 때 Request Headers 에서 이 줄 의 필드 가 더 발 견 됩 니 다.
Origin: http://127.0.0.1:3001
그리고 콘 솔 에서 다음 과 같은 오류 가 발생 합 니 다.
Failed to load http://127.0.0.1:3000/: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://127.0.0.1:3001' is therefore not allowed access.
이 럴 때 서버 에 필드
Access-Control-Allow-Origin
를 설정 해 야 합 니 다. 그 역할 은 어떤 소스 에서 온 요청 을 허용 하 는 지 설정 하 는 것 입 니 다. 값 이 *
로 설정 되면 임의의 소스 에서 온 요청 을 허용 하 는 것 을 나타 냅 니 다.서버 코드 예 시 는 다음 과 같 습 니 다.http.createServer((req, res) => {
res.setHeader('Access-Control-Allow-Origin', 'http://127.0.0.1:3001') // http://127.0.0.1:3001
})
CORS 는 간단 한 요청 과 간단 하지 않 은 요청 으로 나 뉜 다.이렇게 구분 할 수 있다. 요청 방법 이
POST
, GET
, HEAD
일 때 간단 한 요청 이 고, 다른 방법 PUT
, DELETE
등 은 간단 하지 않 은 요청 이 며, 간단 하지 않 은 요청 이 라면 chrome 의 Network 에서 한 번 더 Request Method
OPTIONS
의 요청 을 볼 수 있다.다음 그림:이 요청 을 사전 요청 이 라 고 할 수 있 습 니 다. 백화문 으로 번역 하면 브 라 우 저 는 서버 에 문의 합 니 다. '서버 형님, 저 는 이번에 PUT 요청 을 하려 고 합 니 다. 통행증 을 보 내 주세요.' 서버 형님 은 브 라 우 저 동생 이 이렇게 친절 한 것 을 보고 통행증 을 보 냈 습 니 다. 이 어 브 라 우 저 는 즐겁게 PUT 요청 을 할 수 있 습 니 다.서버 코드 예 시 는 다음 과 같 습 니 다.
http.createServer((req, res) => {
res.setHeader('Access-Control-Allow-Origin', 'http://127.0.0.1:3001')
res.setHeader('Access-Control-Allow-Methods', 'http://127.0.0.1:3001')
})
간단 한 요청 과 간단 하지 않 은 요청 의 차 이 를 말 한 후 CORS 를 이용 하여 쿠키 의 크로스 도 메 인 전송 을 어떻게 실현 하 는 지 살 펴 보 겠 습 니 다. 먼저 서버 에서 쿠키 값 을 임의로 설정 하여 브 라 우 저 에 보 냅 니 다. 크로스 도 메 인 이 아 닌 경우 브 라 우 저가 서버 에 다시 요청 할 때 서비스 기 가 주 는 쿠키 를 가 져 옵 니 다. 그러나 크로스 도 메 인 일 때 는 어떻게 합 니까?중요 하지 않 습 니 다. 서버 에
Access-Control-Allow-Methods:PUT
필드 를 설정 하고 클 라 이언 트 설정 Access-Control-Allow-Credentials
필드 를 설정 해 야 합 니 다. 둘 중 하나 가 없어 서 는 안 됩 니 다. 코드 는 다음 과 같 습 니 다.전단 코드 예시: (원본 은http://127.0.0.1:3001)
const xhr = new XMLHttpRequest()
...
xhr.withCredentials = true // cookie
xhr.open('get', 'http://127.0.0.1:3000', true)
xhr.send()
서버 코드 예시: (원본 은http://127.0.0.1:3000)
const server = http.createServer((req, res) => {
res.setHeader('Access-Control-Allow-Origin', 'http://127.0.0.1:3001') // :
res.setHeader('Set-Cookie', ['type=muyy']) // cookie
res.setHeader('Access-Control-Allow-Credentials', true) // ② : cookie , true
res.end('date from cors')
})
이로써 몇 가지 관건 적 인 HTTP 헤드 가 CORS 에서 의 실천 운용 을 소개 했다. 더욱 상세 한 자 료 는 Cross - Origin Resource Sharing 을 참조 할 수 있다. 마지막 으로 CORS 의 장단 점 을 요약 하면 모든 유형의 HTTP 방법 을 지원 하 는 것 이 장점 이 고 일부 오래된 브 라 우 저 는 CORS 를 지원 하지 않 는 다 는 것 이 단점 이다.
hash + iframe
글 에서 처음에 iframe 라벨 도 같은 소스 정책 에 제한 을 받 지 않 는 태그 중 하나 라 고 언급 한 적 이 있다. hash + iframe 의 크로스 도 메 인 핵심 사상 은 A 소스 에서 iframe 라벨 의 src 의 해시 값 을 동적 으로 바 꾸 고 B 소스 에서
withCredentials
를 통 해 해당 하 는 해시 값 을 포착 하 는 것 이다.사고방식 은 코드 를 직접 올 리 는 것 이 어렵 지 않다.A 페이지 코드 예시http://127.0.0.1:3000)
B 페이지 코드 예시 (원본 은http://127.0.0.1:3001)
window.onhashchange = function() { // ①
console.log(' page2 ' + window.location.hash) // page2 #{"data":"hash"}
}
A 페이지 를 새로 고침 하면 콘 솔 에 다음 필드 를 인쇄 하여 도 메 인 을 뛰 어 넘 었 음 을 알 수 있 습 니 다.
page2 #{"data":"hash"}
이러한 방식 으로 크로스 도 메 인 을 진행 하 는 장점 은 페이지 와 페이지 간 의 통신 을 지원 하 는 것 이 며, 단점 도 GET 방법 과 단 방향 크로스 도 메 인 통신 만 지원 하 는 것 이다.
postMessage
크로스 문서 전송 (cross - document messaging) 을 실현 하기 위해 XDM 이 라 고 약칭 합 니 다.HTML 5 는 api - postmessage, postmessage () 방법 으로 두 개의 인 자 를 받 았 습 니 다.
window.onhashchange
과
.코드 예 시 는 다음 과 같다.A 페이지 코드 예시http://127.0.0.1:3000)
const iframe = document.getElementsByTagName('iframe')[0]
iframe.setAttribute('style', 'display: none')
iframe.onload = function() { // iframe ,
iframe.contentWindow.postMessage('a secret', 'http://127.0.0.1:3001')
}
B 페이지 코드 예시 (원본 은http://127.0.0.1:3001)
window.addEventListener('message', function(event) {
console.log('From page1 ' + event.data)
console.log('From page1 ' + event.origin)
}, false)
A 페이지 를 새로 고침 하면 콘 솔 에 다음 필드 를 인쇄 하여 도 메 인 을 뛰 어 넘 었 음 을 알 수 있 습 니 다.
From page1 a secret
From page1 http://127.0.0.1:3000
이러한 크로스 도 메 인 방식 의 장점 은 페이지 와 페이지 간 의 양 방향 통신 을 지원 하 는 것 이 며, 단점 도 GET 방법 만 호출 할 수 있다 는 것 이다.
WebSockets
WebSockets 는 HTML 5 프로 토 콜 에 속 하 는데 그 목적 은 지속 적 인 연결 에 듀 플 렉 스 통신 을 구축 하 는 것 이다.웹 소켓 은 사용자 정의 프로 토 콜 을 사용 하기 때문에 클 라 이언 트 와 서버 에서 데 이 터 를 보 내 는 양 이 적 고 추가 서버 가 필요 하 다 는 장점 이 있 습 니 다.기본 적 인 사용 방법 은 다음 과 같다.
const ws = new WebSocket('ws://127.0.0.1:3000')
ws.onopen = function() {
//
}
ws.onmessage = function(event) {
//
}
ws.onerror = function() {
// ,
}
ws.onclose = function() {
//
}
물론 일반적으로 우 리 는 웹 소켓 을 봉 한 제3자 라 이브 러 리 socket. io 를 사용 하 는데, 여 기 는 구체 적 으로 전개 되 지 않 습 니 다.
항목 주소
앞에서 말 한 다섯 가지 크로스 도 메 인 실천 demo 는 cross - domain 에 업로드 되 었 고 전단 환경 은 create - react - app 를 바탕 으로 구축 되 었 으 며 백 엔 드 환경 은 node 로 구축 되 었 습 니 다.
물론 크로스 도 메 인 방식 은 다른 방식 의 실현 도 있 습 니 다. 나중에 상황 을 고려 하여 천천히 구 덩이 를 메 웁 니 다 ~
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
전단 자동화 워 크 플 로 의 hooks예 를 들 어 우 리 는 git commt 전에 eslint 코드 검사, npm install 전에 프로젝트 의존 도 를 검사 하고 싶 습 니 다.전형 적 인 상황 에서 각종 도 구 는 특정한 동작 이 발생 할 때 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.