๐ช Cookie
- ๋ฐฐ๊ฒฝ
- http์ ํน์ฑ์ธ '๋น์ฐ๊ฒฐ์ฑ', '๋ฌด์ํ์ฑ'์ผ๋ก ์ธํด, ์์ฒญ๊ณผ ์๋ต์ด ์๋ฃ๋๋ฉด ์ฐ๊ฒฐ์ ๋์.
→ ํ ์ฌ์ดํธ์ ์ฌ๋ฌ๋ฒ ๋ฐฉ๋ฌธํด๋ ์๋ก ๋ฐฉ๋ฌธํ ๊ฒ์ด ๋จ.
์ด์ Netscape์ฌ์ดํธ ๋ฐฉ๋ฌธ์๊ฐ ์ด๋ฏธ ์ฌ์ดํธ๋ฅผ ๋ฐฉ๋ฌธํ๋์ง ํ๋จํ๊ธฐ ์ํด ์ฌ์ฉํ๊ธฐ ์์.
Unix ํ๋ก๊ทธ๋๋ฐ์์ ์ฌ์ฉํ๋ ๋งค์ง์ฟ ํค(ํ๋ก๊ทธ๋จ์ด ์์ ํ ๋ค, ๋ณ๊ฒฝํ์ง ์๊ณ ๋ณด๋ด๋ ๋ฐ์ดํฐ ํจํท)์์ ์ ๋.
- http์ ํน์ฑ์ธ '๋น์ฐ๊ฒฐ์ฑ', '๋ฌด์ํ์ฑ'์ผ๋ก ์ธํด, ์์ฒญ๊ณผ ์๋ต์ด ์๋ฃ๋๋ฉด ์ฐ๊ฒฐ์ ๋์.
- ์ต๋ 4KB๊น์ง ์ ์ฅ
- ์๋ฒ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๋ ์ฉ๋ : ์๋ฒ ์์ฒญ์ ํ ๋๋ง๋ค ์๋์ผ๋ก ์ค๋ ค์ ๋ฐ๋ผ์ด
- SSR์์ ๋์ฑ ์ค์!
SSR ์์ ์ localStorage์ ๊ฐ์ ์ ๋ฐฉ๋ฒ์ด ์์.
But!! ์ฟ ํค๋ฐ์ดํฐ๋ ์ ์ ์์.
→ ์๋ฒ์์ html๋ฅผ ๋ ๋๋ง ํ ๋, ๋์ฑ ๋ง์ ์ ๋ณด๋ฅผ ๋ด์ ์ ์์
→ ๋ก๋ฉ์๊ฐ ๋จ์ถ - HTTP์์ฒญ์ Headers์ ์ค๋ ค ์ ์ก๋จ
- SSR์์ ๋์ฑ ์ค์!
- ๋ฐ์ดํฐ ์ ํจ๊ธฐ๊ฐ ์ง์ ๊ฐ๋ฅ (ํ ์๊ฐ ๋ค, ํ๋ฃจ ๋ค ๋ฑ)
// ์ ํจ ์ผ์ ์ค์
Set-Cookie: <cookie-name> = <cookie-value>; Expires=<data>
// ๋ง๋ฃ ๊ธฐ๊ฐ ์ค์ : Max-Age๊ฐ ์กด์ฌํ๋ฉด Expires๋ ๋ฌด์๋จ
Set-Cookie: <cookie-name> = <cookie-value>; Max-Age=<number>
- ์ฌ์ฉ ์: ๋ก๊ทธ์ธ ์๋์์ฑ, ์ค๋ ํ๋ฃจ ๋ณด์ง ์๊ธฐ ๋ฑ
์ฟ ํค์ ์ข ๋ฅ
- ๋ง๋ฃ๊ธฐ๊ฐ ๋ณ
- ์๊ตฌ ์ฟ ํค(Persistent Cookie) : ๋ง๋ฃ ๊ธฐ๊ฐ ์์. ๋ง๋ฃ ๊ธฐ๊ฐ์ด ๋๋ ํ ์ญ์ .
- ์ธ์ ์ฟ ํค(Session Cookies) : ๋ง๋ฃ ๊ธฐ๊ฐ ์์. ๋ธ๋ผ์ฐ์ ์ข ๋ฃ์ ์ญ์ .
- ๋๋ฉ์ธ ๋ณ
- First party Cookie : ๊ฐ์ ๋๋ฉ์ธ์์ ์์ฑ๋ ์ฟ ํค. ์๋ธ ๋๋ฉ์ธ์ ๊ฒฝ์ฐ๋ ํฌํจ
- Third party Cookie : ๋ค๋ฅธ ๋๋ฉ์ธ์์ ์์ฑ๋ ์ฟ ํค. img, font, iframe ๋ฑ ๋ค๋ฅธ ๋๋ฉ์ธ์ ์์ฒญ์ ํด์ผํ ๊ฒฝ์ฐ ์์ฑ.
- ์ฃผ๋ก ๊ด๊ณ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉ. ์ฌ์ฉ์์ ๊ฐ์ธ์ ๋ณด ์ ์ฉ์ ๋ฌธ์ .
First party Cookie | Third party Cookie | |
https://kangdanne.tistory.com/ | ๊ฐ์ ๋๋ฉ์ธ kangdanne.tistory.com/ ์๋ธ ๋๋ฉ์ธ m.kangdanne.tistory.com/ |
๋ค๋ฅธ ๋๋ฉ์ธ facebook.com |
- ๋ฌธ์ ์
- ๋ณด์์ ๋ฌธ์
- CSRF : ์ฌ์ฉ์ ๊ถํ์ ์ด์ฉํ ๊ณต๊ฒฉ. ์ฌ์ดํธ์ ๋ก๊ทธ์ธ ๋์ด ์๋ ์ฌ์ฉ์์๊ฒ ์ ์ฑ ์คํฌ๋ฆฝํธ๋ฅผ ์คํ. (๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ, ๊ฒฐ์ ์์ฒญ ๋ฑ)
- XSS : ์ฌ์ฉ์์ ๋ฏผ๊ฐํ ์ ๋ณด ํ์ทจ (token)
- http์์ฒญ ์ ์๋์ผ๋ก ๋ชจ๋ ์ฟ ํค๊ฐ ์ ์ก๋์ด ๋ถํ์ํ ํธ๋ํฝ์ด ์ฆ๊ฐ๋ ์ ์์.
- ๋ณด์์ ๋ฌธ์
๐ฐ Cashe์บ์
- ์น ๋ฟ ์๋๋ผ ์ปดํจํฐ ๋ฉ๋ชจ๋ฆฌ, ์๋๋ก์ด๋ ๋ฑ ๋ค์ํ ๊ณณ์์ ์ฌ์ฉ๋๋ ๊ฐ๋
- ๊ฐ์ ธ์ค๋๋ฐ ๋น์ฉ์ด ๋๋ ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ ๊ฐ์ ธ์จ ๋ค ์์๋ก ์ ์ฅํด ๋๋ ๊ฒ
- ์น ์บ์ : ํ ๋ฒ ๋ฐ์์จ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉ์์ ์ปดํจํฐ ๋๋ ์ค๊ฐ ์ญํ ์ ํ๋ ์๋ฒ์ ์ ์ฅ
๐ IndexedDB
- ๋์ฉ๋์ผ๋ก ์ ์ฅ ๊ฐ๋ฅ
- ๋ค์ํ ๋ฐ์ดํฐ ํ์ ์ ์ฅ ๊ฐ๋ฅ
- ์ ์์ค API์ ๊ณต → ์ฌ์ฉ๋ฒ์ด ๊น๋ค๋ก์
๐ Web Storage
- ์ฟ ํค์ ๋ฌธ์ ์ ์ ๋ณด์ํ๊ธฐ ์ํด HTML5์์ ๋ฑ์ฅ
- ๋ธ๋ผ์ฐ์ ์์ ์ ๊ณตํ๋ ๊ธฐ๋ณธ API๋ก local storage์ session storage๊ฐ ์๋ค.
- ์น ๋ธ๋ผ์ฐ์ ์์ฒด์ ์๋ ํน์ ์ ์ฅ ๊ณต๊ฐ
- 5MB ~ 10MB์ ๋๋ก ์ต๋ ์ฉ๋.
- ์ฟ ํค์ ์ ์ฌํ์ง๋ง ํจ์ฌ ์์ ์
- ์์ฒญ ์ Headers์ ์ ์กํ์ง ์์ → CSRF, ํธ๋ํฝ ๋ฌธ์ ํด๊ฒฐ
- Stringํ๋ง ์ ์ฅ๋จ
- key, value์ ์ฅ์ ์ด์์ ๊ธฐ๋ฅ์ ์์.
- Array, Objectํํ๋ก ์ ์ฉํ๊ณ ์ถ์ ์, JSON.stringify()๋ฅผ ์ฌ์ฉํด ๋ฌธ์์ด๋ก ๋ณํํ์ฌ ์ ์ฅ
// Array
let arr = ["a", "b"];
localStorage.setItem("arr", JSON.stringify(arr));
// Object
let obj = {
a: "์์ด",
b: "์",
};
localStorage.setItem("obj", JSON.stringify(obj));
console.log(localStorage.getItem("arr"));
// ["a", "b"] <- ๋ฌธ์์ด์
console.log(localStorage.getItem("obj"));
// {"a":"์์ด","b":"์"} <- ๋ฌธ์์ด์
- JSON.stringify()๋ฅผ ํตํด ๋ณํ ๋ฐ์ String ๊ฐ์ ๋ค์ Array๋ Object๋ก ์ฌ์ฉํ๊ณ ์ถ์ ๋ JSON.parse()์ฌ์ฉ
console.log(JSON.parse(localStorage.getItem("arr")));
console.log(JSON.parse(localStorage.getItem("obj")));
- ๋ฒ์ ์ ๋ฐ๋ผ ๋ธ๋ผ์ฐ์ ์์ ๋ฏธ์ง์ํ ์ ์์. ์๋ฌ ์ฒ๋ฆฌ ํ์!
- ex) safari ์ํฌ๋ฆฟ ๋ชจ๋์์ ์น ์คํ ๋ฆฌ์ง ์ฌ์ฉ ์ ์๋ฌ
// ๋ธ๋ผ์ฐ์ ๊ฐ storage๋ฅผ ์ง์ํ๋ ์ง ์ฒดํฌํ๋ ๋ฐฉ๋ฒ
if (typeof Storage !== "undefined") {
}
- ๋ฌธ์ ์
- ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์ ๊ทผ๊ฐ๋ฅ ํ๊ธฐ ๋๋ฌธ์ XSS์ ์ทจ์ฝ.
- ๋ง๋ฃ ๊ธฐ๊ฐ ์ค์ ๋ถ๊ฐ
- ๋๊ธฐ์ ์ธ ์คํ : ๋ฉ์ธ ์ค๋ ๋ ๋ธ๋กํน. ์ฉ๋์ด ํฐ ๊ฒฝ์ฐ InedexdDB ๊ณ ๋ ค.
Local Storage (๋ก์ปฌ์คํ ๋ฆฌ์ง)
- ๋๋งค์ธ๋ณ๋ก ๋ฐ๋ก ์ ์ฅ
- ์ญ์ ํ๊ธฐ ์ ๊น์ง ํด๋ผ์ด์ธํธ ๋ธ๋ผ์ฐ์ ์ ๋จ์์์
- ๋ก์ปฌ ์คํ ๋ฆฌ์ง์ ๊ฐ์ ์ง์์ฃผ๋ ์ฝ๋๊ฐ ์์ผ๋ฉด ๋ค์์ ๋ค์ ํด๋น ๋ธ๋ผ์ฐ์ , ํด๋น ๋๋ฉ์ธ์ผ๋ก ๋ค์ด์์ ๋ ์ ๋ณด๊ฐ ๋จ์์๊ฒ ๋๋ค
- PC๋ก ์ ์ํ์ผ๋ฉด ๊ทธ PC์. ํ๋ธ๋ฆฟ์ผ๋ก ์ ์ฅํ์ผ๋ฉด ๊ทธ ํ๋ธ๋ฆฟ์.
- ๊ฒฝ์ฐ์ ๋ค๋ผ ์ฅ์ ์ด ๋ ์๋ ์์ง๋ง, ๋จ์ ์ด ๋ ์๋ ์๋ ๋ถ๋ถ.
- ๋ก๊ทธ์ธ ์ ๋ณด, ์ฌ์ฉ์ ์ค์ ๋ฑ์ ์ ์ฅํ๊ธฐ์ ์ ์ฉ
์์)
"'์ธ๊ธฐ์'์ ๋ ฌ์ ์กฐ๊ฑด์ผ๋ก ๊ฑด ์ํ ๋ฆฌ์คํธ > ์ํ ์์ธํ์ด์ง > ๋ค์ ์ํ๋ฆฌ์คํธ"๊ฐ์ ํ๋ฆ
๐ GOOD : "'์ธ๊ธฐ์'์กฐํ ์กฐ๊ฑด์ด ๊ฑธ๋ ค์๋ ์ํ ๋ฆฌ์คํธ"๋ก ๋์ด๊ฐ๋์ผํ๋ค.
๐ BAD : "์กฐํ์กฐ๊ฑด ์ ๋ณด๊ฐ ๋ค ์ฌ๋ผ์ง ๋ฆฌ์คํธ ํ์ด์ง"๊ฐ ๋ฌ๋ค๋ฉด ์ฌ์ฉ์๋ ๋ถํธํจ์ ๋๋ ๊ฒ.
์ฌ์ฉ์์ ์กฐํ ์กฐ๊ฑด๋ค์ parameter๋ก ํ์ด์ง๊ฐ ์ด๋ํ ๋๋ง๋ค ๋ค๊ณ ๋ค๋๊ฒ ๊ตฌํํ๋ค? → ๋ถํธํจ๐ซ
๋ก์ปฌ์คํ ๋ฆฌ์ง๋ก ์ ์ฅํ๋ฉด ํ์ด์ง ์ด๋๋ง๋ค ๋ค๊ณ ๋ค๋ ํ์์์ด
localStorage.setItem("key", "value");
localStorage.getItem("key");
ํ์ง๋ง ์ด ๊ฒฝ์ฐ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ข ๋ฃํ ํ์๋ ํด๋น ๋ธ๋ผ์ฐ์ , ํด๋น ๋๋งค์ธ์ผ๋ก ์ ์ํ ๋ ๊ทธ ์ ๋ณด๊ฐ ๋จ์์๊ฒ ๋๋ค.
๋ก์ปฌ์คํ ๋ฆฌ์ง์ ์ ๋ณด๋ฅผ deletํด์ฃผ์ง ์๋ ํ ์ฌ์ ์ ์์๋ "'์ธ๊ธฐ์'์กฐํ ์กฐ๊ฑด์ด ๊ฑธ๋ ค์๋ ์ํ ๋ฆฌ์คํธ"๊ฐ ๊ธฐ๋ณธ์ผ๋ก ๋จ๊ฒ๋๋ค.
โ API ์ฌ์ฉ๋ฐฉ๋ฒ
localStorage.setItem("key", "value");
localStorage.getItem("key");
localStorage.removeItem("key");
clear()
Session Storage (์ธ์ ์คํ ๋ฆฌ์ง)
- ์๋ฒ์ธก์์ ๊ด๋ฆฌ
- ๋ธ๋ผ์ฐ์ ๋ฅผ ์ข
๋ฃํ๊ฑฐ๋ ํญ์ ๋ซ๋ ์๊ฐ ์ฌ๋ผ์ง.
- ์๋ฒ์์ ํด๋ผ์ด์ธํธ ๊ตฌ๋ถ์ ์ํด ID๋ถ์ฌ
→ ์ธ์ฆ์ํ ์ ์ง : ์น ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ์ ์ ์ํด์ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ข ๋ฃํ ๋๊น์ง
- ์๋ฒ์์ ํด๋ผ์ด์ธํธ ๊ตฌ๋ถ์ ์ํด ID๋ถ์ฌ
- ๊ฐ์ ๋ธ๋ผ์ฐ์ ํญ ์์์๋ '์๋ก๊ณ ์นจ'์ ํด๋ ์ ์ง
- ๋จ๋ฐ์ฑ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ธฐ ์ ํฉ (์ํ ์กฐํ ์กฐ๊ฑด ๋ฑ)
- ์ ํ ์๊ฐ์ ์ ์ฉํด ์ผ์ ์๊ฐ ์๋ต์ด ์์ ๊ฒฝ์ฐ ์ ๋ณด๋ฅผ ์ ๊ฑฐํ๋๋ก ์ค์ ๊ฐ๋ฅ
- ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์๋ฒ์ ์ ์ฅํ๋ฏ๋ก ์ฟ ํค๋ณด๋ค ๋ณด์์ ์ข์.
- ์ฌ์ฉ์๊ฐ ๋ง์ ์ง ์๋ก ๋ง์ ์์ ์๋ฒ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์๋กํจ. → ๋์ ์ ๋ง์ ์, ์๋ฒ ๊ณผ๋ถํ ๋ฐ์ → ์ฑ๋ฅ์ ํ
โ API ์ฌ์ฉ๋ฐฉ๋ฒ
sessionStorage.setItem("key", "value");
sessionStorage.getItem("key");
sessionStorage.removeItem("key");
clear()
โ๏ธ ์์ฝ
๋ก์ปฌ ์คํ ๋ฆฌ์ง | ์ธ์ ์คํ ๋ฆฌ์ง | |
์ ์ฅ ๋ฒ์ | ๋๋ฉ์ธ, ๋ธ๋ผ์ฐ์ | ๋๋ฉ์ธ, ๋ธ๋ผ์ฐ์ , ํญ |
์๊ตฌ์ ์ ์ฅ | Yes (Delet๊ฐ ๋์ง ์๋ ํ ์กด์ฌ) |
No (๋ธ๋ผ์ฐ์ , ํญ์ ๋ซ์ ์ ์ ๊ฑฐ๋จ) |
์ฌ์ฉ ์ | ์๋ ๋ก๊ทธ์ธ | ์ผํ์ฑ ์กฐํ |
์ฃผ์ | password, ๊ฐ์ธ ์ ๋ณด๋ ์ค์ํ ์ ๋ณด๋ ์ ์ฅํ๋ฉด ์๋จ. |
๊ณตํต ๋ณด์ ๋ฌธ์ ํด๊ฒฐ ๋ฐฉ์
ํด๊ฒฐ ๋ฐฉ์ | ||
XSS | HttpOnly | ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์ ๊ทผ ๋ถ๊ฐ |
innerHTML ์ฌ์ฉ X | ์๋ฐํฌ๋ฆฝํธ ์ฝ๋ ์ฝ์
๋ถ๊ฐ ์ฌ์ฉ์์ ์ ๋ ฅ์์ด ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ก ์คํ ๋ ์ ์๋ ์ฝ๋ ์์ฑํ์ง ์๊ธฐ (innerHTML, eval, document.write ๋ฑ) |
|
CSRF | SameSite | ๊ฐ์ ๋๋ฉ์ธ์ ์์ฒญ์๋ง ์ฟ ํค ์ ์ก |
Referer | ์์ฒญ ์จ ์ฌ์ดํธ์ ๋๋ฉ์ธ์ ํ์ธ ํ ์ ์์ |
์ฐธ๊ณ ์๋ฃ
์ ํ๋ธ
'๊ฐ๋ฐ์์ ํ๊ฒฉ' - ์๋ฐ์คํฌ๋ฆฝํธ ๊ธฐ์ด-localStorage์ sessionStorage ์ดํดํ๊ธฐ
'Teahoon' - ์นํ๋ก ํธ์๋ ๊ฐ๋ฐ์๋ผ๋ฉด ์์์ผ ํ ์ ์ฅ์ ์ข ๋ฅ 4๊ฐ์ง
'์ฐ์ํTech' - [10๋ถ ํ ์ฝํก] ๐ฆ ๋ํ ์ ์น์คํ ๋ฆฌ์ง & ์ฟ ํค
๋ธ๋ก๊ทธ '๋กํฐ ๋๊ตฌ๋ฆฌ_๋กํฐ' - ์ฟ ํค์ ์ธ์ ๊ทธ๋ฆฌ๊ณ ๋ก์ปฌ ์คํ ๋ฆฌ์ง์ ์ธ์ ์คํ ๋ฆฌ์ง
'D.evelop > Web' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Chrome ๊ฐ๋ฐ์ ๋๊ตฌ] ๋คํธ์ํฌ ํจ๋ DevTools - Network (0) | 2022.03.16 |
---|---|
์ธ์ฆAuthentication/์ธ๊ฐAuthorization (0) | 2021.12.20 |
[WEB] ์น ๋ ๋๋ง SSG, SSR, CRS ์ด๋? (0) | 2021.12.13 |
HTTP(HyperText Transfer Protocol)์ด๋? (0) | 2021.09.25 |
[Chrome ๊ฐ๋ฐ์ ๋๊ตฌ] ์ฝ์ ํจ๋ DevTools - console panel (0) | 2021.09.05 |
๋๊ธ