CORS : 교차 출처 리소스 공유
OPTIONS
HTTP 메소드를 이용해 다른 도메인의 리소스로 HTTP 요청을 보내, 실제 요청이 전송하기에 안전한지 확인한다. 이를 preflight
라 한다.preflight
가 통과하면 본 HTTP 메소드 요청이 가능해진다. 여기서 메소드에 따라 요청(request)에 필요한 요소들이 달라진다.GET
: request의 요청시 header
, url
이 필요하다. response 때는 body
가 필요하다.
POST
: request의 요청시 header
,url
,body
가 필요하다. response 때도 body
가 필요하다.
PUT
: request의 요청 시 header
,url
,body
가 필요하다.
DELETE
: request의 요청 시 header
,url
가 필요하고 body
는 반드시 필요한 것은 아니다.
const http = require('http');
const PORT = 5000;
const ip = 'localhost';
const server = http.createServer((request, response) => {
console.log(
`http request method is ${request.method}, url is ${request.url}`
);
const { method, url } = request
// OPTIONS 메소드를 통과할 경우 본 요청 시작가능.
if (method === 'OPTIONS') {
response.writeHead(200, defaultCorsHeader);
response.end('SUCCESS');
}
// 본 요청. 메소드가 POST,urlpath가 /lower라면 문자열 데이터를 받아서 toLowerCase() 함수를 적용해 응답한다.
if (method === 'POST') {
if (url === '/lower') {
let data = ''
request.on('data', value => {
data += value
})
request.on('end', () => {
data = data.toLowerCase()
response.writeHead(200, defaultCorsHeader);
response.end(data);
console.log(data)
})
//urlpath가 /upper 라면 문자열 데이터를 받아서 toUpperCase() 함수를 적용해 응답한다.
} else if (url === '/upper') {
let data = ''
request.on('data', value => {
data += value
})
request.on('end', () => {
data = data.toUpperCase()
response.writeHead(200, defaultCorsHeader);
response.end(data);
console.log(data)
})
}
else {
response.writeHead(404, defaultCorsHeader)
response.end("다시시도해보세요")
}
}
})
위에 작성한 코드는 5500번 포트를 사용하는 클라이언트에서 5000번 포트를 사용하는 서버에 HTTP 정보를 요청하는 과정이었다.
serve를 사용해 3000번 포트를 연결하여 서버에 정보를 요청하는데, 만약 Content-type이 application.json이 아닌 text/plain인 경우 preflight를 요청하지 않았다. 그 이유는 MDN에서 보면 simple-request를 요청하는 헤더이기 때문이다.
https://developer.mozilla.org/ko/docs/Web/HTTP/CORS
https://nodejs.org/ko/docs/guides/anatomy-of-an-http-transaction/