HTTP ํ๋กํ ์ฝ์ ๋ฌด์ํ์ฑ์ ๋ณด์ํด์ฃผ๋ ๋๊ตฌ๋ก, ์์ธํ๊ฒ๋ ์น ์ฌ์ดํธ์ ๋ค์ด๊ฐ์ ๋, ์๋ฒ๊ฐ ์ผ๋ฐฉ์ ์ผ๋ก ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌํ๋ ์์ ๋ฐ์ดํฐ๋ก, ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ(์น ๋ธ๋ผ์ฐ์ )์ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ณ ๋ถ๋ฌ์ฌ ์ ์๋ ์๋จ์ด๋ค.
์ฃผ๋ก ๋ก๊ทธ์ธ ์ํ ์ ์ง
, ์ค๋ ๋ณด์ง ์๊ธฐ
์ ๊ฐ์ด ์ฌ์ฉ์ ์ ํธ, ํ
๋ง ๋ฑ ์ฅ์๊ฐ ๋ณด์กดํด์ผํ๋ ์ ๋ณด ์ ์ฅ์ ์ ํฉํ๋ค.
๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ดํ, ํน์ ์กฐ๊ฑด๋ค(์ฟ ํค ์ต์ )์ด ๋ง์กฑ๋์ด์ผ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๋ถ๋ฌ์ฌ ์ ์์ผ๋ฉฐ, ์ฃผ๋ก ์ฌ์ฉํ๋ ์ฟ ํค์ต์ ์ ๋ค์์ ๊ฐ๋ค.
Cookie option | ์ค๋ช | ๋น๊ณ |
---|---|---|
Domain | ์๋ฒ์ ์์ฒญ์ ๋๋ฉ์ธ์ด ์ผ์นํ๋ ๊ฒฝ์ฐ ์ฟ ํค ์ ์ก | โพ ์์ฒญํด์ผํ URL:http://www.localhost.com:3000/users/login โพ Domain: localhost.com |
Path | ์๋ฒ์ ์์ฒญ์ ์ธ๋ถ๊ฒฝ๋ก๊ฐ ์ผ์นํ๋ ๊ฒฝ์ฐ ์ฟ ํค ์ ์ก | โพ ์์ฒญํด์ผํ URL:http://www.localhost.com:3000/users/login โพ Path: /users/login , ๋จ ์ค์ ๋ ๊ฒฝ๋ก๋ฅผ ํฌํจํ๋ ํ์ ๊ฒฝ๋ก๋ก ์์ฒญํด๋ ๊ฐ๋ฅ(/users/...) |
MaxAge or Expires | ์ฟ ํค๊ฐ ์ ํจํ ๊ธฐ๊ฐ์ ์ ํ๋ ์ต์ ์ผ๋ก, ์ด ๋จ์๋ก ์ค์ ํ๋ค. ํด๋น ์ต์ ์ ์ฌ๋ถ์ ๋ฐ๋ผ ์ธ์ ์ฟ ํค์ ์์์ฑ ์ฟ ํค๋ก ๋๋๋ค. | โพ ์ธ์
์ฟ ํค: ํด๋น ์ต์
x, ๋ธ๋ผ์ฐ์ ์คํ ์ค ์์์ฟ ํค โพ ์์์ฑ ์ฟ ํค: ํด๋น ์ต์ o, ๋ธ๋ผ์ฐ์ ์ข ๋ฃ ์ฌ๋ถ์ ์๊ด์์ด ์ ํจ์๊ฐ๋งํผ ์ฌ์ฉ๊ฐ๋ฅํ ์ฟ ํค |
Secure | secure ์ต์ ์ด true๋ฉด, HTTPS๋ฅผ ์ด์ฉํ๋ ๊ฒฝ์ฐ์๋ง ์ฟ ํค ์ ์ก | secure ์ต์ ์ด ์์ผ๋ฉด http์๋ ์ ์ก๊ฐ๋ฅ |
HttpOnly | ์คํฌ๋ฆฝํธ์ ์ฟ ํค ์ ๊ทผ ๊ฐ๋ฅ ์ฌ๋ถ ๊ฒฐ์ , ํด๋น ์ต์ ์ด true๋ฉด, ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์ฟ ํค์ ์ ๊ทผ์ด ๋ถ๊ฐํ๋ค. | default false => ์๋ฐ์คํฌ๋ฆฝํธ์ ์ฟ ํค ์ ๊ทผ์ด ๊ฐ๋ฅ(document.cookie)ํ๋ฏ๋ก XSS ๊ณต๊ฒฉ์ ์ทจ์ฝ |
SameSite | CORS ์์ฒญ์ ๊ฒฝ์ฐ ์ต์ ๋ฐ ๋ฉ์๋์๋ฐ๋ผ ์ฟ ํค ์ ์ก ์ฌ๋ถ ๊ฒฐ์ | โพ Lax: CORS ์์ฒญ์ ๊ฒฝ์ฐ, GET ๋ฉ์๋์ ๋ํด์๋ง ์ฟ ํค ์ ์ก โพ Strict: CORS๊ฐ ์๋, same-site์ธ ๊ฒฝ์ฐ์๋ง ์ฟ ํค ์ ์ก(์๊ฒฉ) โพ None: CORS์ ๊ด๋, secure ์ต์ ๋ง ์์ผ๋ฉด ์ฟ ํค ์ ์ก |
์๋ฒ์์ ์์ ๊ฐ์ ์ต์
๋ค์ ์ง์ ํ ๋ค์, ์๋ฒ->ํด๋ผ์ด์ธํธ๋ก ์ฟ ํค๋ฅผ ์ฒ์ ์ ์กํ ๋, ํค๋์ set-Cookie
๋ผ๋ ํ๋กํผํฐ๋ก ์ฟ ํค๋ฅผ ๋ด์ ์ ์กํ๋ค. ์ดํ, ํด๋ผ์ด์ธํธ->์๋ฒ์๊ฒ ์ฟ ํค๋ฅผ ์ ์กํ ๋, ํค๋์ Cookie
๋ผ๋ ํ๋กํผํฐ์ ์ฟ ํค๋ฅผ ๋ด์ ์ ์กํ๋ค.
์ด๋ฌํ ์ฟ ํค์ ํน์ฑ์ ์ด์ฉํ์ฌ ๋ฌด์ํ์ฑ์ ๋ ์ธํฐ๋ท ์ฐ๊ฒฐ์ ์ํ ์ ์ง๊ฐ ๊ฐ๋ฅํ๋๋ก ๋ง๋๋๋ฐ, ๊ธฐ๋ณธ์ ์ผ๋ก ์ฟ ํค๋ ์ค๋์๊ฐ ์ ์ง๊ฐ ๊ฐ๋ฅํ๋ฉฐ HttpOnly ์ต์ ์ด ์๋ค๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํตํด์ ์ฟ ํค์ ์ ๊ทผํ ์ ์์ผ๋ฏ๋ก, ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ๋ด๋ ๊ฒ์ ์ํํ๋ค.
fetch API์ ๋น์ทํ๊ฒ ํน์ URL๋ก๋ถํฐ ์ ๋ณด๋ฅผ ๋ฐ์์ค๋ ์ญํ ์ ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ๋ธ๋ผ์ฐ์ ๋ฐ Node.js๋ฅผ ์ํ Promise API๋ฅผ ํ์ฉํ๋ HTTP ๋น๋๊ธฐ ํต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.(Fetch API๋ณด๋ค ์ฌ์ฉ์ด ์ฝ๊ณ ์ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ด ํฌํจ๋์ด์์)
Axios | Fetch API |
---|---|
์ค์น ํ์(์จ๋ ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ) | ์ค์นX(๋นํธ์ธ API) |
JSON ๋ณํ ์๋ | JSON ๋ณํ ์๋(.json()๋ฉ์๋ ์ฌ์ฉ) |
npm install axios
๋ฅผ ์
๋ ฅํด ์ค์น ํ, axios.get("url"[,config])
์ ์
๋ ฅํด GET
์์ฒญ์ํ๋ค. ์ด๋, ์ฒซ ๋ฒ์งธ ์ธ์์๋ url์ฃผ์๊ฐ ๋ค์ด๊ฐ๋ฉฐ ๋ ๋ฒ์งธ ์ธ์์๋ ์์ฒญ ์ ์ฌ์ฉํ ์ ์๋ ์ต์
๋ค์ ์ค์ ํ๊ฒ ๋๋ค.(ํ์x)
// Promise ver
fetch('https://koreanjson.com/users/1', { method: 'GET' })
.then((response) => response.json())
.then((json) => console.log(json))
.catch((error) => console.log(error));
// Async / Await ver
async function request() {
const response = await fetch('https://koreanjson.com/users/1', {
method: 'GET',
});
const data = await response.json();
console.log(data);
}
request();
// axios๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์ค์นํ axios๋ฅผ ๋ถ๋ฌ์์ผ ํฉ๋๋ค.
import axios from 'axios';
// Promise ver
axios
.get('https://koreanjson.com/users/1')
.then((response) => {
const { data } = response;
console.log(data);
})
.catch((error) => console.log(error));
// Async / Await ver
async function request() {
const response = await axios.get('https://koreanjson.com/users/1');
const { data } = response;
console.log(data);
}
request();
Reference: ์ฝ๋์คํ ์ด์ธ