์๋ ,
๋๋ฉ์ธ ๊ฐ IP์ ๋ํ ๊ฒ์ ์์ฒญ์ ์๋ํ๋๋ฐ ๋ด ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
var authOptions = {
method: 'POST',
url: 'http://10.254.147.184:7777/auth/oauth/token',
data: qs.stringify(data),
headers: {
'Authorization': 'Basic Y2xpZW50OnNlY3JldA==',
'Content-Type': 'application/x-www-form-urlencoded'
},
json: true
};
return dispatch => {
return axios(authOptions)
.then(function(response){
console.log(response.data);
console.log(response.status);
})
.catch(function(error){
console.log(error);
});
๊ทธ๋ฌ๋ ' headers '๋ฅผ ์ถ๊ฐํ ๋๋ง๋ค ๋ด ์์ฒญ์ 'POST' ๋ฉ์๋์์ 'OPTIONS'๋ก ์๋ ๋ฐ๋๋๋ฐ ์ด์ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๊ทธ๊ฒ์ ๋ํ ๋ฒ๊ทธ๋ ๋ด๊ฐ ์ฐพ์ง ๋ชปํ ๊ฒ์ด ์์ต๋๊น?
์ด๊ฒ์ ๋ฒ๊ทธ๊ฐ ์๋๋ฉฐ ์์๋๋ก ์๋ํฉ๋๋ค.
ํค๋์ ์ฝํ
์ธ ์ ํ์ ์ถ๊ฐํ๊ธฐ ๋๋ฌธ์ https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS ๋ฌธ์์ ๋ช
์๋ ๋๋ก ํ๋ฆฌํ๋ผ์ดํธ ์์ฒญ(๋จ์ํ ์์ฒญ์ด ์๋)์ ์์ฑํ๊ณ ์์ต๋๋ค. ์ด๊ฒ์ ๊ฐ์ ํฉ๋๋ค.
๋ฐ๋ผ์ ์ด ๋ชจ๋์์๋ ๊ธฐ๋ณธ ์์ฒญ๋ณด๋ค OPTIONS ์์ฒญ์ด ๋จผ์ ์คํ๋๋ฏ๋ก ์๋ฒ๊ฐ OPTIONS ์์ฒญ์ ๊ด๋ฆฌํ ์ ์๋์ง ํ์ธํด์ผ ํฉ๋๋ค.
ํธ์ง: ๋ด CORS ํํฐ์์ ํ์ฉ๋ ํค๋์ ๊ถํ ๋ถ์ฌ๋ฅผ ์ถ๊ฐํด์ผ ํ์ต๋๋ค.
@jffernandez
๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. Auth ํค๋๋ฅผ ์๋ตํ๋ฉด POST, OPTIONS๋ฅผ ๋ฐํํ๋ Options ์์ฒญ์ ๋ฐ์ ๋ค์ Authorization ํค๋(์์)๊ฐ ์๊ธฐ ๋๋ฌธ์ 403์ ๋ฐํํ๋ POST๋ฅผ ๋ฐ์ต๋๋ค.
ํค๋๋ฅผ ์ถ๊ฐํ๋ฉด ์ต์ ์์ฒญ๋ง ๋ฐ๊ณ POST๋ฅผ ์ํํ์ง ์์ต๋๋ค.
post("http://localhost:8080/foo", foo)
๋
post("http://localhost:8080/foo", foo, {
headers: { Authorization: "Bearer " + token }
})
axios๊ฐ ์๋ CORS ๋ฌธ์ ์ ๋๋ค. ์ ๊ณต๋ ๋งํฌ @jffernandez ๋ฅผ ์ดํด๋ณด๊ฑฐ๋ ์ฌ๊ธฐ์์ ์ ์ฌํ ๋ฌธ์ ๋ฅผ ์ฐพ์ผ์ญ์์ค.
๋ค, CORS์ ๊ดํ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋์ ๊ฐ์ ๊ฒฝ์ฐ API ์๋ฒ์์ ์ธ์ฆ๋ Content-Type์ ์ถ๊ฐํ๋ ๊ฒ์ ์์์ ๊ฒ์ ๋๋ค.
AllowedHeaders : Content-Type ๋ฐ X-Requested-With
๊ทธ๋ฆฌ๊ณ ๊ทํ์ ๊ฒฝ์ฐ ์น์ธ.
๋ฌผ๋ก OPTIONS ๋ฉ์๋๋ ํ์ฉํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค.
axios({
method: 'POST',
url: 'you http api here',
headers: {autorizacion: localStorage.token},
data: {
user: 'name'
}
})
๋๋ ์ด CORS ์ค๋ฅ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ๋ ธ๋์ corsproxy ํจํค์ง๋ฅผ ์ค์นํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๊ต์ฐจ ์ถ์ฒ ์ค๋ฅ์ ๋์์ด ๋ ๊ฒ์ ๋๋ค. ์๋ ๋งํฌ๋ฅผ ์ฐธ์กฐํ ์ ์์ต๋๋ค.
````
๋ก๊ทธ์ธ = () => {
console.log('๋ก๊ทธ์ธ ํด๋ฆญ')
๋ฐ์ดํฐ = JSON.stringify({
๋น๋ฐ๋ฒํธ: this.state.password,
์ฌ์ฉ์ ์ด๋ฆ: this.state.email
})
axios.post('url', data, {
headers: {
'Content-Type': 'application/json',
}
}
)
}
```
์ด ํค๋๋ฅผ ์ถ๊ฐํ์ฌ ํด๊ฒฐ
axios.post('http://localhost/M-Experience/resources/GETrends.php',
{
firstName: this.name
},
{
headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
});
์ด๊ฒ์ด ๋ด๊ฐ POST ์์ฒญ์ ํฌ๋งทํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
var postData = {
email: "[email protected]",
password: "password"
};
let axiosConfig = {
headers: {
'Content-Type': 'application/json;charset=UTF-8',
"Access-Control-Allow-Origin": "*",
}
};
axios.post('http://<host>:<port>/<path>', postData, axiosConfig)
.then((res) => {
console.log("RESPONSE RECEIVED: ", res);
})
.catch((err) => {
console.log("AXIOS ERROR: ", err);
})
cors ์ค๋ฅ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ์ด ๋ช ๋ น์ ์คํํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. npm i --save cors ๋ค์ app.js ๊ฐ์ ธ์ค๊ธฐ์์ ๋ค์๊ณผ ๊ฐ์ด ๊ฐ์ ธ์ต๋๋ค.
var cors = require('cors');
๊ทธ๋ฐ ๋ค์ ๋ด ๊ฒฝ์ฐ์๋ ๋์ผํ ํ์ผ์์ ์ด์ ๊ฐ์ด ํธ์ถํฉ๋๋ค. ๋ฃจํธ ํ์ผ์ app.js์
๋๋ค.
app.use(cors());
๊ทธ๊ฒ์ ๋น์ ์ cors ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๊ฒ์ ๋๋ค
@mirzaumersaleem ๋๋ cors๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์์ง๋ง axios๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฑ์๋์ ๊ฒ์ํ๋ ค๊ณ ํ๋๋ฐ 400 Bad ์์ฒญ์ ๋ฐ๊ณ ์์ต๋๋ค.
fetch๋ cors๋ก ํ ์ ์์ง๋ง(๋ฐฑ์๋์๋ ๋ฌธ์ ๊ฐ ์์), axios์์๋ ๋๋๋ก ์คํจํ์ต๋๋ค.
cors ์ค๋ฅ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ์ด ๋ช ๋ น์ ์คํํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. npm i --save cors ๋ค์ app.js ๊ฐ์ ธ์ค๊ธฐ์์ ๋ค์๊ณผ ๊ฐ์ด ๊ฐ์ ธ์ต๋๋ค.
var cors = require('cors');
๊ทธ๋ฐ ๋ค์ ๋ด ๊ฒฝ์ฐ์๋ ๋์ผํ ํ์ผ์์ ์ด์ ๊ฐ์ด ํธ์ถํฉ๋๋ค. ๋ฃจํธ ํ์ผ์ app.js์ ๋๋ค.
app.use(cors());๊ทธ๊ฒ์ ๋น์ ์ cors ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๊ฒ์ ๋๋ค
๋ด ์ฌํ์์ CORS๋ ์๋ฒ(.net /java/node/php ๋ฑ)์์ ์ํํด์ผ ํฉ๋๋ค.
ํธ์ง: ๋ด CORS ํํฐ์์ ํ์ฉ๋ ํค๋์ ๊ถํ ๋ถ์ฌ๋ฅผ ์ถ๊ฐํด์ผ ํ์ต๋๋ค.
@jffernandez
๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. Auth ํค๋๋ฅผ ์๋ตํ๋ฉด POST, OPTIONS๋ฅผ ๋ฐํํ๋ Options ์์ฒญ์ ๋ฐ์ ๋ค์ Authorization ํค๋(์์)๊ฐ ์๊ธฐ ๋๋ฌธ์ 403์ ๋ฐํํ๋ POST๋ฅผ ๋ฐ์ต๋๋ค.
ํค๋๋ฅผ ์ถ๊ฐํ๋ฉด ์ต์ ์์ฒญ๋ง ๋ฐ๊ณ POST๋ฅผ ์ํํ์ง ์์ต๋๋ค.
post("http://localhost:8080/foo", foo)
๋
post("http://localhost:8080/foo", foo, { headers: { Authorization: "Bearer " + token } })
๋น ๋ฅธ ๋๋ต์ url ๋ค์ ์ฒซ ๋ฒ์งธ ์ธ์์ ๋ ๋ฒ์งธ ์ธ์๊ฐ ์ข ์ข ์๋ชป ๋ฐฐ์น๋๋ค๋ ๊ฒ์ ๋๋ค(์ฆ, axios(url, data, config)). ๋ฐ๋ผ์ ๊ตฌ์ฑ ๋ถ๋ถ์ ์๋ตํ๊ฑฐ๋ ๋ฐ์ดํฐ์ ๊ตฌ์ฑ์ ์ ํํ๋ฉด ์๊ธฐ์น ์์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก localhost๋ก ์์ ํ๋ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์์ผ ํฉ๋๋ค. ์ ํ ๋ฌธ์ ์์ด.
์ผ๋ฐ์ ์ผ๋ก ๊ฐ๋ ์ฑ์ด ์ข์ง ์๋ค.
axios.request(๊ตฌ์ฑ)
axios.get(url[, ๊ตฌ์ฑ])
axios.delete(url[, ๊ตฌ์ฑ])
axios.head(url[, ๊ตฌ์ฑ])
axios.options(url[, ๊ตฌ์ฑ])
axios.post(url[, ๋ฐ์ดํฐ[, ๊ตฌ์ฑ]])
axios.put(url[, ๋ฐ์ดํฐ[, ๊ตฌ์ฑ]])
axios.patch(url[, ๋ฐ์ดํฐ[, ๊ตฌ์ฑ]])
๋ชจ๋ API๊ฐ ์ผ๊ด์ ์ด๋ฉฐ
1) URL์ ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ก,
2) ๋ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ก ๊ตฌ์ฑ(์ ํ ์ฌํญ),
3) ๋ฐ์ดํฐ(์ ํ์ฌํญ)
๊ทธ๊ฒ์ด ์ฌ์ฉ์๋ค์ด ๊ธฐ๋ํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ axios๋ ๊ทธ ์์ API ๊ฒฐ์ ์์ ํฐ ๋ฌธ์ ๋ฅผ ๋ง๋ค์ด ๊ฑฐ์ ๋ชจ๋ ์ฌ๋๋ค์ด ์ผ์์ ํ ๋ฒ ์ด์ ๊ฑฐ๊ธฐ์ ๊ฐํ๊ฒ ๋ง๋ค์์ต๋๋ค.
๋๋ฅผ ์ํด ์ผํ์ญ์์ค :
`
const ํค๋ = {
'์ฝํ
์ธ ์ ํ': '์์ฉ ํ๋ก๊ทธ๋จ/json',
'๊ถํ ๋ถ์ฌ': 'JWT ํํ๊ฒ...'
}
axios.post(Helper.getUserAPI(), ๋ฐ์ดํฐ, {
ํค๋: ํค๋
})
.then((์๋ต) => {
๋ณด๋ด๋ค({
์ ํ: FOUND_USER,
๋ฐ์ดํฐ: ์๋ต.๋ฐ์ดํฐ[0]
})
})
.catch((์ค๋ฅ) => {
๋ณด๋ด๋ค({
์ ํ: ERROR_FINDING_USER
})
})
`
์ฌ๊ธฐ์์ jquery๋ก ๋์ผํ ๋ฌธ์ ์ ์ง๋ฉดํ๋ฉด ์์ฒญ์ ์ฑ๊ณตํ์ง๋ง axios๊ฐ ์๋ req๋ฅผ ๋ณด๋ผ ๋ cors ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
๋ด ๋ถํ--
.post('https://test.pi.com/j_spring_security_check', {
withCredentials: true,
crossorigin: true,
headers: {
common:{
'Content-Type': 'application/json',
'Accept': 'application/json',
'WithCredentials': true,
'Access-Control-Allow-Origin': '*'
}
},
data: JSON.stringify({
j_username: email,
j_password: password
}),
// proxy: {
// '/j_spring_security_check/*': 'https://devtest.pvai.com/j_spring_security_check',
// }
})
์ด๋ค์ ์๋ฒ์ ์๋ต ํค๋์ด๋ฉฐ ๋ด locahost ์ถ์ฒ๊ฐ ํ์ฉ๋๋ฉฐ ๋ด๊ฐ ๋ณด๋ด๋ ํค๋์ ๋ฉ์๋๋ ํ์ฉ๋ฉ๋๋ค.
access-control-allow-credentials: true
access-control-allow-headers: Authorization, X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept
access-control-allow-methods: POST, GET, OPTIONS
access-control-allow-origin: http://localhost:5000
access-control-expose-headers: Authorization
cache-control: no-cache, no-store, max-age=0, must-revalidate
content-length: 0
date: Wed, 11 Dec 2019 04:53:25 GMT
expires: 0
location: /authFailure
pragma: no-cache
status: 302
strict-transport-security: max-age=31536000 ; includeSubDomains
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
์ด๊ฒ์ด ๋ด๊ฐ POST ์์ฒญ์ ํฌ๋งทํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
var postData = { email: "[email protected]", password: "password" }; let axiosConfig = { headers: { 'Content-Type': 'application/json;charset=UTF-8', "Access-Control-Allow-Origin": "*", } }; axios.post('http://<host>:<port>/<path>', postData, axiosConfig) .then((res) => { console.log("RESPONSE RECEIVED: ", res); }) .catch((err) => { console.log("AXIOS ERROR: ", err); })
๋๋ถ์ ํ๋ฃจ๋ฅผ ๊ตฌํ์ต๋๋ค! ๋๋ฅผ ์ํด ์ผํ๋ค
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
ํธ์ง: ๋ด CORS ํํฐ์์ ํ์ฉ๋ ํค๋์ ๊ถํ ๋ถ์ฌ๋ฅผ ์ถ๊ฐํด์ผ ํ์ต๋๋ค.
@jffernandez
๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. Auth ํค๋๋ฅผ ์๋ตํ๋ฉด POST, OPTIONS๋ฅผ ๋ฐํํ๋ Options ์์ฒญ์ ๋ฐ์ ๋ค์ Authorization ํค๋(์์)๊ฐ ์๊ธฐ ๋๋ฌธ์ 403์ ๋ฐํํ๋ POST๋ฅผ ๋ฐ์ต๋๋ค.
ํค๋๋ฅผ ์ถ๊ฐํ๋ฉด ์ต์ ์์ฒญ๋ง ๋ฐ๊ณ POST๋ฅผ ์ํํ์ง ์์ต๋๋ค.
๋