오늘의 학습내용
Same-Origin Policy의 줄임말로, 보안상의 이유로 같은 출처의 리소스만 공유가 가능하다는 원칙임.
Cross-Origin Resource Sharing의 줄임말로, 교차 출처의 리소스를 공유할 수 있도록 하는 체제.
실제 요청을 보내기 전, OPTIONS 메서드로 사전 요청을 보내 해당 출처 리소스에 접근 권한이 있는지부터 확인하는 것
CORS에 대비가 되어있지 않은 서버를 보호할 수 있음.
특정 조건이 만족되면 프리플라이트 요청을 생략하고 요청을 보내는 것
요청 헤더에 인증 정보를 담아 보내는 요청
보안 정보가 포함되어 있기 때문에, 프론트/서버 양측 모두 CORS 설정이 필요함.
const http = require('http');
const server = http.createServer((request, response) => {
// 모든 도메인
response.setHeader("Access-Control-Allow-Origin", "*");
// 특정 도메인
response.setHeader("Access-Control-Allow-Origin", "https://domain.com");
// 인증 정보를 포함한 요청을 받을 경우
response.setHeader("Access-Control-Allow-Credentials", "true");
})
const cors = require("cors");
const app = express();
//모든 도메인
app.use(cors());
//특정 도메인
const options = {
origin: "https://domain.com", // 접근 권한을 부여하는 도메인
credentials: true, // 응답 헤더에 Access-Control-Allow-Credentials 추가
optionsSuccessStatus: 200, // 응답 상태 200으로 설정
};
app.use(cors(options));
//특정 요청
app.get("/example/:id", cors(), function (req, res, next) {
res.json({ msg: "example" });
});
대/소문자를 변환하여 출력하는 서버를 만들어보자
const express = require('express');
const http = require('http');
const app = express();
const server = http.createServer(app);
const PORT = 4999;
// cors 설정
const cors = require('cors');
app.use(cors());
// Express 내장 미들웨어로 jsonParser 설정
const jsonParser = express.json({strict: false});
// POST메소드 설정 - lower
app.post('/lower', jsonParser, function (req, res, next) {
res.json(req.body.toLowerCase());
next(); // 다음 미들웨어 실행
})
app.post('/upper', jsonParser, function (req, res) {
res.json(req.body.toUpperCase());
})
// 해당 PORT 서버 실행
server.listen(PORT,() => {
console.log(`Server running on http://localhost:${PORT}`);
});
// terminal - npm install express 설치
const express = require('express')
const app = express()
const port = 3000
app.get('/', (req, res) => {
res.send('Hello World!')
})
app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
})
const router = express.Router()
// get 메소드, 경로 설정
router.get('/lower', (req, res) => {
res.send(data);
})
// post 메소드, 경로 설정
router.post('/lower', (req, res) => {
// do something
})
Node.js
let body = [];
request.on('data', (chunk) => {
body.push(chunk);
}).on('end', () => {
body = Buffer.concat(body).toString();
});
Express
// {strict: false} --> strict: true일 경우 배열과 객체만 파싱 가능함
const jsonParser = express.json({strict: false});
// 메소드, 경로 설정 시 express.json 사용
app.post('/api/users', jsonParser, function (req, res) {
})
Node.js
const defaultCorsHeader = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type, Accept',
'Access-Control-Max-Age': 10
};
// 생략
if (req.method === 'OPTIONS') {
res.writeHead(201, defaultCorsHeader);
res.end()
}
Express
// terminal - npm install cors설치
// 1. 모든 요청에 대해 CORS 허용
const cors = require('cors');
app.use(cors());
// 2. 특정 요청에 대해 CORS 허용
const cors = require('cors')
// 생략
app.get('/products/:id', cors(), function (req, res, next) {
res.json({msg: 'This is CORS-enabled for a Single Route'})
})
app.use()
모든 요청에 동일한 미들웨어를 적용할 때 사용
const express = require('express');
const app = express();
const myLogger = function (req, res, next) {
console.log('LOGGED');
next();
};
// 모든 요청에 대해 myLogger 미들웨어 적용이 가능함.
app.use(myLogger);
app.get('/', function (req, res) {
res.send('Hello World!');
});
app.listen(3000);
app.use((req, res, next) => {
// 토큰이 있는지 확인, 없으면 받아줄 수 없음.
if(req.headers.token){
req.isLoggedIn = true;
next();
} else {
res.status(400).send('invalid user')
}
})