CORS 해결책
2020-02-27
CORS 해결방법
- 동일 출처 정책때문에 CORS같은 상황이 발생 하면 외부서버에 요청한 데이터를 브라우저에서 보안목적으로 차단
1. 상황발생
- Front
<template>
<div class="hello">
<h1>{{ message }}</h1>
<button v-on:click="addData">업데이트</button>
</div>
</template>
<script>
export default {
data() {
return {
message: ""
};
},
methods: {
addData() {
this.$http.get("http://localhost:3000/hello").then(res => {
this.message = res;
});
}
}
};
</script>
- Back
const express = require('express');
const app = express();
app.get('/hello', (req, res) => {
console.log("come in")
res.send('hello world')
});
app.listen(3000, () => {
console.log('Express App Listening on Port 3000')
})
CORS 발생
해결방법
-
http header에 Access-Control-Allow-Origin을 모두 허용(*)
const express = require("express"); const app = express(); app.get("/hello", (req, res) => { res.header("Access-Control-Allow-Origin", "*"); // * 대신 해당 IP/포트를 넣어도 된다 console.log("come in"); res.send("hello world"); }); app.listen(3000, () => { console.log("Express App Listening on Port 3000"); });
단, 이렇게 작성하면 모든 포트와 ip의 접근을 허용하므로 보안성을 강화할 필요가 있다.
그래서 http객체 header에 접근할수잇는 Setting을 더 해줘야한다.Access-Control-Allow-Origin : * Access-Control-Allow-Method : GET, POST, PUT. DELETE, OPTIONS (디폴트는 GET, POST) Access-Control-Max-age : 3600 Access-Control-Allow-Headers : Origin, Accept, X-Requestd-With, Content-Type,Access-Contorol-Request-Method, Access-Contorol-Request-Header, Authorization Access-Contorol-Allow-Credentials - 클라이언트 요청이 쿠키를 통해서 자격 증명을 해야 하는 경우에 True를 응답받은 클라이언트는 실제 용청시 서버에서 정의도니 규격의 인증값이 담긴 쿠키를 같이 보내야한다.
-
CORS
모듈을 설치$ npm i cors
const express = require("express"); const cors = require("cors"); const app = express(); app.use(cors()); app.get("/hello", (req, res) => { console.log("come in"); res.send("hello world"); }); app.listen(3000, () => { console.log("Express App Listening on Port 3000"); }); // 단 CORS로 사용하면 모든 접근을 허용하면 보안성의 문제가 // 발생하니까 CORS의 함수안에 접근할수있는 주소랑 포트를 세팅하면 // 보안성을 강화할수있다. const express = require("express"); const cors = require("cors"); const app = express(); const corsOptions = { origin: "http://localhost:3000", credentials: true }; app.use(cors()); app.get("/hello", (req, res) => { console.log("come in"); res.send("hello world"); }); app.listen(3000, () => { console.log("Express App Listening on Port 3000"); });
- Proxy를 만들어서 Cors해결(vue.confid.js)
module.exports = { devServer: { proxy: { "/": { target: "http://localhost:3000", changeOrigin: true } } } };