9月13日月曜日TIL
cors
どうして舞台に上がるのか
以前はサーバ上にクライアントと呼ばれるファイルがあり、ユーザがサーバに要求すると、ユーザはサーバ上のクライアントを受信し、クライアントでサーバと通信したり、クライアントに静的に格納されたデータをユーザが一方的に表示したりしていた.したがって、サーバから取り外したクライアントは、Originがサーバから送信され、サーバに父親としての再要求を要求するため、サーバに危害を及ぼすことは間違いありません.ソースが同じであるため、サーバがこのリクエストをブロックする理由はありません.こうして通信が行われた.しかし最近singlepageアプリケーションというアプリケーションが登場しました.Webアプリケーションのアップグレードに伴い、以前のサーバやYouTube apiを使用してクライアントから取得したような他のサーバからのリソースを必要とする複雑なWebアプリケーションが増えています.クライアントから同じoriginにリソースを要求することも以前は可能でしたが、同じソースではなく異なるソースを要求する必要があります.これをクロスソースリクエストと呼び、corsは実際にはクロスソースリソース共有と呼ぶ.これは、同じoriginではない別のoriginでは、例えばrizenfからyoutubeにこのような方法で他のサーバで使用されるリソースリソースを要求するには、crossorigin要求が必要であることを意味する.しかし、mdnで検索すると、ブラウザはセキュリティ上の理由でソース間リクエストを制限します.これは私がサーバーから降りたクライアントではないので、私たちのサーバーに何か要求を出します.セキュリティ上の理由でcrossoriginリクエストは最初からブロックされています.リクエストを開くと、サーバに作成するリソースが特定されないためです.しかし、開発者はブラウザ会社にcross-domain要求を発行して、これらのWebアプリケーションの性能をさらに向上させるように要求したため、サーバは許可された範囲内でcrossorigin要求の変更を行い、現在印刷時
これらのdefaultCorsHeadersというコードが表示されます.
このコードは、get、post、put、delete、optionsのみを許可するすべてのドメインからサーバにドメイン間リクエストを発行するorigin->*(すべてのoriginで可能)へのアクセスを許可する最初の方法です.また、ヘッダにはcontent-typeとacceptしか書けず、preflightリクエストは10秒まで許可されます.
これらの条件を備えたリクエストは、ドメイン間でリソースリクエストを許可する設定コードである.
サーバがnaverであればcomと呼ばれるoriginリクエストcross-domainのみが許可されている場合、naver.comは、最初にoptionsというpreflightリクエストでcors originのリクエスト情報をサーバに確認し、ブラウザが自動的にoptionsというリクエストをサーバに送信し、cross-originリクエストのライセンスを取得し、本格的なpostリクエストでcross-originリクエストを行います.
したがって,optionsを簡単に要約するとpreflight requestである.ブラウザでは、クライアントが別のソースのサーバにリクエストを自動的に要求すると、実際にnaverクライアントはpostリクエストを介してサーバにタイトル条件を持つpostリクエストを発行したいと考えています.この場合、ブラウザはまずoptionsメソッドを使用してサーバにリクエストを発行します.私は方法でPOST要求を出して、あなたたちのサーバーにこれを許可しますかと聞いて、今サーバーはnaverです.comというソースの送信が許可されているため、サーバにリソースリクエストを送信し、オプションの正常な応答を再送信し、クライアントで設定したPOSTリクエストをサーバに送信することでリソースを生成することができます.現在、サーバはnaverです.com、匿名のみが許可されると仮定します.comからサーバにリソースリクエストを送信すると、ソースリストがないため、サーバに拒否応答を送信すると、サーバにリソースリクエストを送信できません.optionsはpreflight requestと略称します.mdnドキュメントを参照し、cors mdnドキュメントを参照して、この方法の意図を理解してください.
miniNodeServer const http = require('http');
const server = http.createServer((request, response) => {
const { method, url, headers } = request;
// 작업진행
if (method === 'POST' && url === '/lower') {
let body = [];
request
.on('data', chunk => {
body.push(chunk);
})
.on('end', () => {
body = Buffer.concat(body).toString();
console.log('너는 POST /lower를 요청했구나');
response.writeHead(200, corsHeader);
response.end(body.toLowerCase());
return;
});
} else if (method === 'POST' && url === '/upper') {
let body = [];
request
.on('data', chunk => {
body.push(chunk);
})
.on('end', () => {
body = Buffer.concat(body).toString();
console.log('너는 POST /upper를 요청했구나');
response.writeHead(200, corsHeader);
response.end(body.toUpperCase());
return;
});
} else if (method === 'OPTIONS') {
console.log('너는 preflight request를 보냈구나');
response.writeHead(200, corsHeader);
response.end();
} else {
console.log(method, url);
console.log('너는 다른 요청을 보냈구나');
}
});
server.listen(5000);
let corsHeader = {
'access-control-allow-origin': '*',
'access-control-allow-methods': 'POST',
'access-control-allow-headers': 'Content-Type',
'access-control-allow-max-age': 86400,
};
const http = require('http');
const server = http.createServer((request, response) => {
const { method, url, headers } = request;
// 작업진행
if (method === 'POST' && url === '/lower') {
let body = [];
request
.on('data', chunk => {
body.push(chunk);
})
.on('end', () => {
body = Buffer.concat(body).toString();
console.log('너는 POST /lower를 요청했구나');
response.writeHead(200, corsHeader);
response.end(body.toLowerCase());
return;
});
} else if (method === 'POST' && url === '/upper') {
let body = [];
request
.on('data', chunk => {
body.push(chunk);
})
.on('end', () => {
body = Buffer.concat(body).toString();
console.log('너는 POST /upper를 요청했구나');
response.writeHead(200, corsHeader);
response.end(body.toUpperCase());
return;
});
} else if (method === 'OPTIONS') {
console.log('너는 preflight request를 보냈구나');
response.writeHead(200, corsHeader);
response.end();
} else {
console.log(method, url);
console.log('너는 다른 요청을 보냈구나');
}
});
server.listen(5000);
let corsHeader = {
'access-control-allow-origin': '*',
'access-control-allow-methods': 'POST',
'access-control-allow-headers': 'Content-Type',
'access-control-allow-max-age': 86400,
};
const express = require('express');
const bodyParser = require('body-parser');
const jsonParser = bodyParser.text();
const cors = require('cors');
const PORT = 5500;
const myLogger = (req, res, next) => {
console.log(`http request method is ${req.method}, url is ${req.url} `);
next();
};
const app = express();
app.use(cors());
app.use(myLogger);
app.use((req, res, next) => {
// 토큰 있니? 없으면 받아줄 수 없어!
if (req.headers.token) {
req.isLoggedIn = true;
next();
} else {
res.status(400).send('invalid user');
}
});
app.post('/upper', jsonParser, (req, res) => {
res.status(200).send(req.body.toUpperCase());
});
app.post('/lower', jsonParser, (req, res) => {
res.status(200).send(req.body.toLowerCase());
});
app.get('/', jsonParser, (req, res) => {
res.send('HELLO');
});
app.listen(PORT, () => {
console.log(`Server is listening : http://localhost:${PORT}`);
});
Reference
この問題について(9月13日月曜日TIL), 我々は、より多くの情報をここで見つけました https://velog.io/@hunsm4n/9월13일-월요일-TILテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol