๐ ์ด๋ ๊ฒ ๊ฒฝ๋ก๊ฐ ๋ค๋ฅด๊ฒ ๋๋ฉด ์๋์ ๊ฐ์ "CORS ์๋ฌ" ๋ฅผ ์ ์ง์๊ฒ ๋ณผ ์ ์๋ค.
โ CORS๋ ?
๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์ (Cross-Origin Resource Sharing)์ ์ฝ์๋ก, ๋ฆฌ์์ค์ origin๊ณผ ์์ฒญํ origin์ด ๋ค๋ฅผ ๊ฒฝ์ฐ ๋ณด์ ์์ ์ด์ ๋ก ์์์ ๋ํ ์ ๊ทผ์ ๋ธ๋ผ์ฐ์ ๊ฐ ์ ํํ๋ ๊ฒ์ ์๋ฏธํ๋ค ์ฆ, CORS๋ ์์์ด ์์นํ ์๋ฒ์ ์์ฒญ์ ๋ณด๋ธ ์น ์๋ฒ๊ฐ ๊ฐ๊ธฐ ๋ค๋ฅธ ๊ณณ์ ์์ ๋ (Cross-Origin ์์ฒญ์ ๋ณด๋ผ ๋) ์์์ ์ ๊ทผํ ์ ์๋ ๊ถํ์ ์์์ ๊ฐ์ง ์๋ฒ ์ชฝ์์ ์ ์ํ๋๋ก ํ๋ ๊ฒ์ด๋ค.
CORS ์๋ฌ์ ํด๊ฒฐ๋ฐฉ์์?
Access-Control-Allow-Origin' ํค๋๊ฐ ์์ฒญ๋ฐ์ ๋ฆฌ์์ค ์ธก์์ ์ ์๋์ด ์์ง ์๋ค๊ณ ๋์ ์์ผ๋ฏ๋ก, ์์์ ๊ฐ์ง ์๋ฒ ์ธก์์ Cross-Origin ์์ฒญ์ ํ์ฉํ ๊ฒ์ธ์ง ์ ํํ ๊ฒ์ธ์ง๊ฐ ๋ด๊ธด 'Access-Control-Allow-Origin' ํค๋๋ฅผ ๋ฐํํด์ฃผ๋ฉด ๋๋ค. ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ ํด๋น ํค๋๋ฅผ ์ ์ํด์ฃผ๋ ํ๋ฌ๊ทธ์ธ์ด๋ ๋ชจ๋์ ์ฌ์ฉํ๋ฉด ๋๋ค.
๐งฉ ์ ์ฉ์์
from flask_cors import CORS
โ ๋น๋๊ธฐํจ์๋ ?
์ด๋ฒคํธ ๋ฃจํ๋ฅผ ํตํด ๋น๋๊ธฐ์ ์ผ๋ก ์๋ํ๋ ํจ์๋ก, ํน์ ์ฝ๋์ ์ฒ๋ฆฌ๊ฐ ๋๋๊ธฐ ์ ์ ๋ค์ ์ฝ๋๋ฅผ ์คํํ ์ ์๋ ๊ฒ์ ๋ปํ๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์๋ ์ฝ๋ฐฑ ํจ์, Promise, async await ์ด๋ ๊ฒ ํฌ๊ฒ 3๊ฐ์ง ๋น๋๊ธฐ ๋ฐฉ์์ด ์กด์ฌํ๋ค.
๐งฉ ์ ์ฉ์์
//ํ์๊ฐ์
async function handleSignin() {
const signupData = {
email: document.getElementById("floatingInput").value,
password: document.getElementById('floatingPassword').value
}
const response = await fetch(`${backend_base_url}/signup`, {
method: 'POST',
body: JSON.stringify(signupData)
}
)
console.log(response)
response_json = await response.json()
console.log(response_json)
if (response.status == 200) {
window.location.replace(`${frontend_base_url}/login.html`);
} else {
alert(response.status)
}
}
//๋ก๊ทธ์ธํ๊ธฐ
async function handleLogin() {
console.log("handle login")
const loginData = {
email: document.getElementById("floatingInput").value,
password: document.getElementById('floatingPassword').value
}
const response = await fetch(`${backend_base_url}/login`, {
method: 'POST',
body: JSON.stringify(loginData)
}
)
console.log(response)
response_json = await response.json()
console.log(response_json)
localStorage.setItem("token", response_json.token)
if (response.status == 200) {
window.location.replace(`${frontend_base_url}/`);
} else {
alert(response.status)
}
}
์ผ์ฐ์ด ์ฌ๋ฌผ์ธ์ํ๋ก์ ํธ๋ฅผ ๋๋ด๊ณ ๊ทธ๋์ ๊ฑฐ๋ถ์ด๋ฐ๐ข(๋ณด์ถฉ๋ฐ?) ํํฐ๋์ ๊ฐ์๋ฅผ ๋ค์ผ๋ฉด์ ๋ฐฐ์ ๋ ๋ด์ฉ๊ด๋ จํ์ฌ ๋ณต์ต์ ์งํํ๋ค. ์ฌํ๊ป ์์ ์งํํ๋ ์ธ์คํํด๋ก ์์๋ Ajax๋ฅผ ์ด์ฉํด์ html์์ฒด๋ฅผ ๋ฐฑ์๋์์ ๋๊ฒจ์ฃผ๋ ํ์์ผ๋ก ์งํํ์๋๋ฐ, ์ด๋ฒ์๋ Ajax๋ฅผ ์ด์ฉํ์ง์๊ณ javascript๋ฅผ ์ด์ฉํด์ ํ์๊ฐ์ ,๋ก๊ทธ์ธํ์ด์ง๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ ๋ค. javascript๋ง์ ์ด์ฉํ๋๊น ์ธ์ด๊ฐ ์ง๊ด์ ์ด์ง์์์ ๋จธ๋ฆฌ์ ํ๊บผ๋ฒ์ ๋ค์ด์ค์ง์์๋ค. ํ์ง๋ง ์ต์ํด์ง๋ค๋ณด๋ฉด ๋์ ์ธ์ด๊ฐ ์ต์ด์ ๊ธฐ๋ฅ์ ์ ๊ตฌํํ ์ ์์๊ฒ๊ฐ๋ค.
๐ ์์ธํ ์ฝ๋๋ Moonmoo ์ ๊ฒ์ํ์ต๋๋ค