npm i express-session
app.use(
session({
secret: '@codecode',
resave: false,
saveUninitialized: true,
cookie: {
domain: 'localhost',
path: '/',
maxAge: 24 * 6 * 60 * 10000,
sameSite: 'none',
httpOnly: true,
secure: true,
},
})
);
https://localhost:3000 cross-origin ํ์ฉ
๋ฉ์๋๋ GET, POST, OPTIONS๋ฅผ ํ์ฉ
app.use(
cors({
origin: 'https://localhost:3000',
methods: ['GET', 'POST', 'OPTIONS'],
})
);
cross-origin์์ response๋ฅผ ํ์์ง๋ง, ์๋์ ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์
์๋ฌ ๋ฉ์์ง์ ๋ฐ๋ฅด๋ฉด Access-Control-Allow-Credentials์ true๊ฐ์ ์ฃผ์ด์ผ ํ๋ค๊ณ ๋์ด ์๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ก ํฌ๋ก์ค ์ค๋ฆฌ์ง ์์ฒญ์ ๋ณด๋ด๋ ๊ฒฝ์ฐ, ๊ธฐ๋ณธ์ ์ผ๋ก ์ฟ ํค๋ HTTP ์ธ์ฆ ๊ฐ์ ์๊ฒฉ ์ฆ๋ช
(credential / ์ฟ ํค, ์ธ๊ฐ ํค๋, TLS ์ธ์ฆ์)์ด ํจ๊ป ์ ์ก๋์ง ์๋๋ค.
HTTP ์์ฒญ์ ๊ฒฝ์ฐ ๋๊ฐ ์ฟ ํค๊ฐ ํจ๊ป ์ ์ก๋๋๋ฐ, ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํด ๋ง๋ ํฌ๋ก์ค ์ค๋ฆฌ์ง ์์ฒญ์ ์์ธ๋ค.
๋ฐ๋ผ์ fetch๋ฅผ ์ฌ์ฉํด ์์ฒญ์ ๋ณด๋ด๋ another.com ๊ด๋ จ ์ฟ ํค๊ฐ ํจ๊ป ์ ์ก๋์ง ์๋๋ค.
์ ๊ทธ๋ด๊น?
์ด๋ฐ ์์ธ๊ฐ ์๊ธด ์ด์ ๋ ์๊ฒฉ ์ฆ๋ช ๊ณผ ํจ๊ป ์ ์ก๋๋ ์์ฒญ์ ๊ฒฝ์ฐ ์ํฅ๋ ฅ์ด ๊ฐํ๊ธฐ ๋๋ฌธ์ด๋ค. ํฌ๋ก์ค ์ค๋ฆฌ์ง ์์ฒญ ์ ์๊ฒฉ ์ฆ๋ช ์ ํจ๊ป ์ ์กํ ์ ์์ผ๋ฉด ์ฌ์ฉ์ ๋์ ์์ด ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๋ฏผ๊ฐํ ์ ๋ณด์ ์ ๊ทผํ ์ ์๊ฒ ๋๋ค.
๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ์๋ฒ์์ ์ด๋ฅผ ํ์ฉํ๊ณ ์ถ๋ค๋ฉด, ์๊ฒฉ ์ฆ๋ช ์ด ๋ด๊ธด ํค๋๋ฅผ ๋ช ์์ ์ผ๋ก ํ์ฉํ๊ฒ ๋ค๋ ์ธํ ์ ์๋ฒ์ ํด์ค์ผ ํ๋ค.
์ฟ ํค๋ฅผ ์์ฒญ์ ํฌํจํ๊ณ ์ถ์ผ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์๋ฒ์ ํด๋ผ์ด์ธํธ์ ์๋ต๊ณผ ์์ฒญ์ ๊ฐ๊ฐ credentials: true
, withCredentials: true
์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
app.use(
cors({
origin: 'https://localhost:3000',
methods: ['GET', 'POST', 'OPTIONS'],
credentials: true,
})
);
axios
.post(
'https://localhost:4000/users/login',
{
userId: this.state.username,
password: this.state.password,
},
{ 'Content-Type': 'application/json', withCredentials: true }
)
.then((res) => {
if (res.status === 200) {
this.props.loginHandler(true);
}
})
์์์ ์ ๋ฆฌํ ๊ฒ ์ฒ๋ผ cross origin์ผ ๊ฒฝ์ฐ ์๋ต ํค๋๋ก Access-Control-Allow-Credentials ์ต์
๋ ์ค์ ํด์ฃผ์
์ผ ์ฟ ํค๊ฐ ์ ์ก๋๋ค. Access-Control-Allow-Credentials๋ฅผ true๋ก ์ค์ ํ๊ณ Access-Control-Allow-Origin ์ต์
๋ *๊ฐ ์๋ ์ ํํ ๋๋ฉ์ธ
์ ์ ์ด์ฃผ์ด์ผ ํ๋ค.
์ฆ, ๋ชจ๋ ์์ฒญ์ ํ์ฉํ๋ค๋ ์๋ฏธ์ *๋ฅผ Access-Control-Allow-Origin ํค๋์ ์ฌ์ฉํ๋ฉด ์๋๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ค์์ ์ด๋จ๊น?
const cors = require('cors');
app.use(cors({
origin: true,
credentials: true
}));
origin: true ์ ์์ผ๋์นด๋ *์ ๊ฐ์ ๊ฒ์ผ๊น??
๋ต์ => ์๋๋ค.
origin: true
๋ ํ๋ก ํธ ๋๋ฉ์ธ ์ฃผ์๊ฐ ์๋์ผ๋ก Access-Control-Allow-Origin์ ๋ค์ด๊ฐ๋ค. ์์ผ๋์นด๋์ธ *์๋ ๋ค๋ฅด๋ค.
Access-Control-Allow-Origin:* ์ Access-Control-Allow-Credentials: true๋ ํจ๊ป ์ฌ์ฉํ ์ ์๋ค.
CORS๋ ์๋ต์ด Access-Control-Allow-Credentials: true ์ ๊ฐ์ง ๊ฒฝ์ฐ, Access-Controll-Allow-Origin์ ๊ฐ์ผ๋ก *๋ฅผ ์ฌ์ฉํ์ง ๋ชปํ๊ฒ ๋ง๊ณ ์์ต๋๋ค.
Access-Control-Allow-Credentials: true๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ์ฌ์ฉ์ ์ธ์ฆ์ด ํ์ํ ๋ฆฌ์์ค ์ ๊ทผ์ด ํ์ํ ๊ฒฝ์ฐ์ธ๋ฐ, ๋ง์ฝ Access-Control-Allow-Origin: *๋ฅผ ํ์ฉํ๋ค๋ฉด, CSRF ๊ณต๊ฒฉ์ ๋งค์ฐ ์ทจ์ฝํด์ ธ ์ ์์ ์ธ ์ฌ์ฉ์๊ฐ ์ธ์ฆ์ด ํ์ํ ๋ฆฌ์์ค๋ฅผ ๋ง์๋๋ก ์ ๊ทผํ ์ ์์ต๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ CORS ์ ์ฑ ์์ ์์ ๋์ํ์ง ์๋๋ก ๋ง์๋ฒ๋ฆฐ ๊ฒ์ ๋๋ค.
Access-Contorl-Allow-Credentials: true์ธ ๊ฒฝ์ฐ์๋ ๋ฐ๋์ Access-Control-Allow-Origin์ ๊ฐ์ด ํ๋์ origin ๊ฐ์ผ๋ก ๋ช ์๋์ด ์์ด์ผ ์ ์์ ์ผ๋ก ๋์ํฉ๋๋ค.
<์ฐธ๊ณ ์๋ฃ>
๋ค๋ฅธ ๋๋ฉ์ธ๊ฐ ์ฟ ํค ์ ์ก
cors ์ ๋ฆฌ ๋ธ๋ก๊ทธ