[HTTP/network] Cookie

Hannahhhยท2022๋…„ 9์›” 13์ผ
0

HTTP/Network

๋ชฉ๋ก ๋ณด๊ธฐ
9/12

๐Ÿ” Cookie


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, ๋ธŒ๋ผ์šฐ์ € ์ข…๋ฃŒ ์—ฌ๋ถ€์— ์ƒ๊ด€์—†์ด ์œ ํšจ์‹œ๊ฐ„๋งŒํผ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ์ฟ ํ‚ค
Securesecure ์˜ต์…˜์ด true๋ฉด, HTTPS๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ฟ ํ‚ค ์ „์†กsecure ์˜ต์…˜์ด ์—†์œผ๋ฉด http์—๋„ ์ „์†ก๊ฐ€๋Šฅ
HttpOnly์Šคํฌ๋ฆฝํŠธ์˜ ์ฟ ํ‚ค ์ ‘๊ทผ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ ๊ฒฐ์ •, ํ•ด๋‹น ์˜ต์…˜์ด true๋ฉด, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ฟ ํ‚ค์— ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€ํ•˜๋‹ค.default false => ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ฟ ํ‚ค ์ ‘๊ทผ์ด ๊ฐ€๋Šฅ(document.cookie)ํ•˜๋ฏ€๋กœ XSS ๊ณต๊ฒฉ์— ์ทจ์•ฝ
SameSiteCORS ์š”์ฒญ์˜ ๊ฒฝ์šฐ ์˜ต์…˜ ๋ฐ ๋ฉ”์„œ๋“œ์—๋”ฐ๋ผ ์ฟ ํ‚ค ์ „์†ก ์—ฌ๋ถ€ ๊ฒฐ์ •โ—พ Lax: CORS ์š”์ฒญ์˜ ๊ฒฝ์šฐ, GET ๋ฉ”์†Œ๋“œ์— ๋Œ€ํ•ด์„œ๋งŒ ์ฟ ํ‚ค ์ „์†ก
โ—พ Strict: CORS๊ฐ€ ์•„๋‹Œ, same-site์ธ ๊ฒฝ์šฐ์—๋งŒ ์ฟ ํ‚ค ์ „์†ก(์—„๊ฒฉ)
โ—พ None: CORS์— ๊ด€๋Œ€, secure ์˜ต์…˜๋งŒ ์žˆ์œผ๋ฉด ์ฟ ํ‚ค ์ „์†ก

์„œ๋ฒ„์—์„œ ์œ„์™€ ๊ฐ™์€ ์˜ต์…˜๋“ค์„ ์ง€์ •ํ•œ ๋‹ค์Œ, ์„œ๋ฒ„->ํด๋ผ์ด์–ธํŠธ๋กœ ์ฟ ํ‚ค๋ฅผ ์ฒ˜์Œ ์ „์†กํ•  ๋•Œ, ํ—ค๋”์— set-Cookie๋ผ๋Š” ํ”„๋กœํผํ‹ฐ๋กœ ์ฟ ํ‚ค๋ฅผ ๋‹ด์•„ ์ „์†กํ•œ๋‹ค. ์ดํ›„, ํด๋ผ์ด์–ธํŠธ->์„œ๋ฒ„์—๊ฒŒ ์ฟ ํ‚ค๋ฅผ ์ „์†กํ•  ๋•Œ, ํ—ค๋”์— Cookie๋ผ๋Š” ํ”„๋กœํผํ‹ฐ์— ์ฟ ํ‚ค๋ฅผ ๋‹ด์•„ ์ „์†กํ•œ๋‹ค.

์ด๋Ÿฌํ•œ ์ฟ ํ‚ค์˜ ํŠน์„ฑ์„ ์ด์šฉํ•˜์—ฌ ๋ฌด์ƒํƒœ์„ฑ์„ ๋ˆ ์ธํ„ฐ๋„ท ์—ฐ๊ฒฐ์„ ์ƒํƒœ ์œ ์ง€๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ๋งŒ๋“œ๋Š”๋ฐ, ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฟ ํ‚ค๋Š” ์˜ค๋žœ์‹œ๊ฐ„ ์œ ์ง€๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฉฐ HttpOnly ์˜ต์…˜์ด ์—†๋‹ค๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด์„œ ์ฟ ํ‚ค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ๋‹ด๋Š” ๊ฒƒ์€ ์œ„ํ—˜ํ•˜๋‹ค.




๐Ÿ”ฅ ์‹ค์Šต(Axios ์‚ฌ์šฉ)


โœ” Axios?

fetch API์™€ ๋น„์Šทํ•˜๊ฒŒ ํŠน์ • URL๋กœ๋ถ€ํ„ฐ ์ •๋ณด๋ฅผ ๋ฐ›์•„์˜ค๋Š” ์—ญํ• ์„ ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, ๋ธŒ๋ผ์šฐ์ € ๋ฐ Node.js๋ฅผ ์œ„ํ•œ Promise API๋ฅผ ํ™œ์šฉํ•˜๋Š” HTTP ๋น„๋™๊ธฐ ํ†ต์‹  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.(Fetch API๋ณด๋‹ค ์‚ฌ์šฉ์ด ์‰ฝ๊ณ  ์ถ”๊ฐ€์ ์ธ ๊ธฐ๋Šฅ์ด ํฌํ•จ๋˜์–ด์žˆ์Œ)


AxiosFetch API
์„ค์น˜ ํ•„์š”(์จ๋“œ ํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)์„ค์น˜X(๋นŒํŠธ์ธ API)
JSON ๋ณ€ํ™˜ ์ž๋™JSON ๋ณ€ํ™˜ ์ˆ˜๋™(.json()๋ฉ”์„œ๋“œ ์‚ฌ์šฉ)

npm install axios๋ฅผ ์ž…๋ ฅํ•ด ์„ค์น˜ ํ›„, axios.get("url"[,config])์„ ์ž…๋ ฅํ•ด GET์š”์ฒญ์„ํ•œ๋‹ค. ์ด๋•Œ, ์ฒซ ๋ฒˆ์งธ ์ธ์ž์—๋Š” url์ฃผ์†Œ๊ฐ€ ๋“ค์–ด๊ฐ€๋ฉฐ ๋‘ ๋ฒˆ์งธ ์ธ์ž์—๋Š” ์š”์ฒญ ์‹œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜๋“ค์„ ์„ค์ •ํ•˜๊ฒŒ ๋œ๋‹ค.(ํ•„์ˆ˜x)


fetch API GET์š”์ฒญ


// 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 GET ์š”์ฒญ


// 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: ์ฝ”๋“œ์Šคํ…Œ์ด์ธ 

0๊ฐœ์˜ ๋Œ“๊ธ€