크로스 도메인에서 망설이는 이야기

Ajax는 안쪽이 깊다. 직장에서 WEB어플리케이션 개발 중, 크로스 도메인에서 고생했기 때문에 망비록으로 기록해 둔다.

1.Ajax란?



우선은 Ajax. 실은, 지금까지 Ajax를 거기까지 이해하고 있지 않았다. (동기 통신으로 데이터 가져오는 업무 시스템 개발뿐이었을지도 모른다.) jquery로 쓰면 간단하네요.

【Ajax】
① Asynchronous Javascript + XML의 약어.
② 페이지를 전환하지 않고 페이지의 일부를 동적으로 대체할 수 있는 기술

샘플 그려 보았습니다.
jquery로 쓰면 간단합니다만, 이번은 굳이 Native로.
   <script>
        window.onload = function () {
            var xhr = new XMLHttpRequest();
            xhr.addEventListener('loadend', function () {
                if (xhr.status === 200) {
                    console.log(xhr.response);
                } else {
                    console.error(xhr.status + ' ' + xhr.statusText);
                }
            });
            xhr.open('GET', 'http://localhost:3000/api/test/');
            xhr.send(null);
        }
   </script> 

● XMLHttpRequest는, 「HTTP 프로토콜을 사용해 통신해, 텍스트 형식이나 XML 형식의 데이터를 송수신하는 오브젝트」평소는 jquery로 써 버리고 있습니다만, 내부적으로 무엇을 하고 있는지는 실제로 써 봐 그렇지 않으면 모르고 실제 참조를 보는 것이 중요합니다.

《참고》XMLHttpRequest - Web API 인터페이스 | MDN
htps : //로 ゔぇぺぺr. 모잖아. 오 rg / 그럼 / 두 cs / u b / api / XMLH tp Rekue St

2. 크로스 도메인 제약이란?



간단한 샘플을 만들어 보았습니다. 구성은 이런 느낌.

【프런트】
HTML5 + Javascript로 Ajax 구현. 아래에서 설명하는 간단한 API 서버에 GET 요청
보내고 있습니다.

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>Page Title</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
    <script>
        window.onload = function () {
            // HTTPプロトコルを使用して通信し、テキスト形式やXML形式のデータを送受信するオブジェクト
            var xhr = new XMLHttpRequest();
            xhr.addEventListener('loadend', function () {
                if (xhr.status === 200) {
                    console.log(xhr.response);
                } else {
                    console.error(xhr.status + ' ' + xhr.statusText);
                }
            });
            xhr.open('GET', 'http://localhost:3000/api/test/');
            xhr.send(null);
        }
    </script>
</body>
</html>

【서버 사이드】

《참고》 원숭이에서도 알 수 있는 Express에서 jsonAPI 서버를 만드는 방법
htps : // 코 m / ぇ 아후 78 / ms / 73 c7160d002 4989416

Node.js와 Express로 간단한 API 서버를 만듭니다. 특히 DB는 준비되어 있지 않습니다.
URL에 액세스하면 json을 반환하는 간단한 코드입니다. 거의 참고 링크의 샘플 대로입니다.
api
 ┣ app.js
 ┣ package.json

// ライブラリ読み込み
var express    = require('express');
var app        = express();
var bodyParser = require('body-parser');

//body-parserの設定
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

var port = process.env.PORT || 3000; // port番号を指定

// GET http://localhost:3000/api/test/
app.get('/api/test/',function(req,res){
    res.json({
        message:"Hello,world"
    });
});

//サーバ起動
app.listen(port);
console.log('listen on port ' + port);

HTML을 브라우저에서 여는 순간에 Ajax가 실행되기 때문에,
본래라면 api의 결과가 돌아올 것입니다만. 이러한 오류가.



뭐야? 라고 생각해 조사하면(자), XMLHttpRequest의 호출은, 동일 도메인으로부터 밖에 할 수 없게 되어 있다고 하는 것. 프런트 엔드와 백엔드를 다른 응용 프로그램에서 디버깅하는 경우 동일한 포트 번호를 사용할 수 없으므로 다른 origin으로 인식되어 오류가 발생했습니다.

※크로스 오리진의 제약은, 브라우저의 주소 바에 표시되는 URL 과 Javascript로부터 액세스 되는 URL을 비교해, 프로토콜, 도메인, 포트 의 어느 쪽인가가 다르면 다른 오리진이라고 하게 된다고 합니다. 도메인이 같아도 한쪽만 https 이거나, 포트 번호가 다른 경우는 다른 오리진이라고 판단되는 것 같다.

참고 사이트를 많이 붙여 둡니다.

《참고》

【해설 첨부】chrome로 XMLHttpRequest를 로컬의 파일로 실시하는 방법
htps : // 이 m / g 여 w c / ms / 919 7 2 665557 d9cf4

크로스 도메인 액세스를 이해하고 웹 API를 즐겁게 사용하세요 - SlideShare
htps //w w. s에서 멋지다. 네 t / t t p c와 ry / u b ap-34814937

이것을 모르고, 도메인 차이의 Ajax 통신을 구현해 버려 고생했습니다. .

좋은 웹페이지 즐겨찾기