-
JWT vs Session & Cookie ์ธ์ฆ ์ธ๊ฐ ๋ฐฉ์?! (feat. ๋ธ๋ผ์ฐ์ ์์์ ์ฟ ํค)๐ Browser 2023. 8. 27. 21:50
๐ ๋ฐฐ๊ฒฝ
ํ์ฌ ์ฌ์ด๋ ํ๋ก์ ํธ๋ก ์ปค๋ฎค๋ํฐ ์ฑ ๊ฐ๋ฐ์ ์งํ ์ค์ด๋ค. ๊ธฐ์กด์ jwt ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ/์ธ๊ฐ ๋ฐฉ์์์ Session Cookie ๊ธฐ๋ฐ์ ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝํ๊ฒ ๋์๋ค. ๊ตฌํํด์ผ ํ ๊ธฐ๋ฅ๊ณผ ๊ฐ ๋ฐฉ์์ ์ฅ๋จ์ ์ ๊ณ ๋ คํ์ฌ ์ ํ์ ๋ด๋ ธ๊ณ , ๊ทธ ๊ณผ์ ์ป์ ์ง์๊ณผ ๊ฒฐ์ ๊ณผ์ ์ ๊ณต์ ํ๊ณ ์ ํ๋ค.
๐ ์ฝ๊ธฐ ์ ์ฉ์ด ์ ๋ฆฌ
๊ฐ๋จํ๊ฒ ์ง๊ณ ๋์ด๊ฐ๋ฉด ์ดํด์ ๋์์ด ๋ ๊ฒ ๊ฐ๋ค.
์ธ์ฆ == Authentication โ ๋ก๊ทธ์ธ
์ธ๊ฐ == Authorization โ ๋ก๊ทธ์ธ๋ ์ํ์์ ์ผ์ด๋๋ ์ผ์ ํ๋ฝํด ์ฃผ๋ ๊ฒ
๐ Session Cookie ์ธ์ฆ/์ธ๊ฐ ๋ฐฉ์
- ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ์ ์๋ํ๋ค.
- ์ฌ์ฉ์์ ์ค์ ์ธ์ฆ ์ ๋ณด๋ฅผ ์๋ฒ ์ธก ์ธ์ ์ ์ฅ์์ ์ ์ฅํ๋ค.
- ์ฌ์ฉ์์๊ฒ ์ ์ฅ๋ ์ธ์ ์ ๋ณด์ ์๋ณ์์ธ session id๋ฅผ ๋ฐ๊ธํ๋ค.
- ๋ฐ๊ธํ session id๋ฅผ ๋ธ๋ผ์ฐ์ ์ ์ฟ ํค ํํ๋ก ์ ์ฅํ๋ค.
- ํด๋ผ์ด์ธํธ์์ ์ถ๊ฐ๋ก ์ค์ ํด์ค ํ์ ์์ด, ๋ธ๋ผ์ฐ์ ์์ ์๋ฒ๋ก ๋ณด๋ด๋ ์์ฒญ๋ง๋ค http cookie ํค๋์ session id๊ฐ ์๋ฒ๋ก ํจ๊ป ์ ์ก๋๋ค.
- session id๊ฐ ์กด์ฌํ๋ค๋ฉด, ์ธ์ฆ๋ ์ฌ์ฉ์๋ก ํ๋ณํ๋ค.
๐ Session Cookie ๋ฐฉ์์ ๋ฌธ์ ์
1์ต ๋ช ์ ์ ์ ๊ฐ ๋ฉ๋ชจ๋ฆฌ ์์ ์ฌ๋ผ์ ์๋ค๋ฉด ์ ๋ฌ๋ฐ์ session id๋ก ์ ์ ๋ฅผ ์๋ณํ๋ ๊ณผ์ ์ ์๋ฒ์ ํฐ ๋ฌด๋ฆฌ๋ฅผ ์ค ์ ์๋ค. ์๋น์ค์ ๊ท๋ชจ๊ฐ ์๊ธฐ๊ณ , ์์ฒญ์ ๋ถ์ฐ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฌ๋ฌ ๊ฐ์ ์๋ฒ๋ฅผ ๋๊ณ ๋ก๋ ๋ฐธ๋ฐ์ฑํด์ผ ํ๋ ์ํฉ์ด ์จ๋ค๋ฉด? ์ด๋ค ๋ก๊ทธ์ธ ์์ฒญ์ ์๋ฒ 1๋ฒ์ผ๋ก, ๋ด ํ๋กํ ์ ์ ์์ฒญ์ ์๋ฒ 3๋ฒ์ผ๋ก ๊ฐ๊ฒ ๋๋ฉด, ์๋ฒ 1๋ฒ ์์ฒญ์์ ์์ฑํ ์ฟ ํค ์ ๋ณด๋ฅผ ์๋ฒ 3๋ฒ์ด ๊ฐ์ง๊ณ ์์ด์ผ ์ธ์ ์ด ์ ์ง๋๋ ๋ฌธ์ ๊ฐ ์์ ์ ์๋ค.
์ด๋ฌํ ๋น์ฉ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฑ์ฅํ ์ธ๊ฐ ๋ฐฉ์์ด ๋ฐ๋ก ๋๋ฅ JWT ํ ํฐ ๋ฐฉ์์ด๋ค!
(*๋ธ๋ผ์ฐ์ ์์์ ์ฟ ํค๊ฐ ๋ญ๊ฐ์? ํ๋จ ๐ (๋ธ๋ผ์ฐ์ ์์์) ์ฟ ํค ์น์ ์ ๋จผ์ ์ฝ์ด์ฃผ์ธ์!)
๐ JWT ์ธ์ฆ/์ธ๊ฐ ๋ฐฉ์
- ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ์ ์๋ํ๋ค.
- ์ฌ์ฉ์์๊ฒ ๋ค์ ์ ๋ณด๊ฐ ์ธ์ฝ๋ฉ๋ ํํ์ jwt ํ ํฐ์ ์ ๋ฌํ๋ค. (SECRET KEY๋ ์๋ฒ์ ๊ฐ์ถฐ๋์ ์ํ)
- header > type (ํ ํฐ ํ์ ), alg (ํ๋จ verify signature๋ฅผ ๋ง๋๋ ๋ฐ ์ฌ์ฉ๋ ์๊ณ ๋ฆฌ์ฆ)
- payload: ํด๋น ์๋น์ค๊ฐ ํ ํฐ์ผ๋ก ๊ณต๊ฐํ๊ธฐ ์ํ๋ ๋ด์ฉ
- verify signature
- ํด๋ผ์ด์ธํธ์์ jwt ํ ํฐ์ ํค๋์ ๋ด์ ์์ฒญ์ ์ ์กํ๋ค.
- ์๋ฒ์ ๊ฐ์ถฐ๋์ SECRET KEY์ ํจ๊ป, header & payload ๊ฐ์ ๊ณ์ฐํด verify signature์ ์ผ์นํ๋์ง ํ์ธํ๋ค. ๋ถ์ผ์นํ๋ ๊ฒฝ์ฐ, ๋๊ตฐ๊ฐ์ ์ํด ํ ํฐ์ด ์กฐ์๋์๋ค๊ณ ๋ณธ๋ค.
๐ JWT ์ธ์ฆ/์ธ๊ฐ ๋ฐฉ์์ ๋ณด์: Access, Refresh ํ ํฐ ๋ฐ๊ธ
JWT ๋ฐฉ์์ ์ ์ ๊ฐ ํ ํฐ์ ์์ด๋ฒ๋ฆฌ๋ฉด ํต์ ๊ถ์ ์๊ณ , ๋ง๋ฃ ๊ธฐ๊ฐ์ ๋๋ฌด ์งง๊ฒ ์ก์ผ๋ฉด ๋งค๋ฒ ๋ก๊ทธ์ธํด์ผ ํ๋ ๋ถํธํจ์ด ์๋ค. ์ด๋ฅผ ๋ณด์ํ๊ธฐ ์ํด ๋ฑ์ฅํ ๋ฐฉ์์ด๋ค.
- ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ์ ์๋ํ๋ค.
- ์๋ฒ์์ ํด๋ผ์ด์ธํธ๋ก access ํ ํฐ๊ณผ, refresh ํ ํฐ์ ์ ๋ฌํ๋ค. (*access ํ ํฐ: ๋ก๊ทธ์ธ ํ ๋ช ๋ถ ~์๊ฐ ๋์ ์ ํจํ ํ ํฐ, refresh ํ ํฐ: ๋ฐ๊ธ ํ ํต์ 2์ฃผ๊ฐ ๋ณด์กด๋๋ค. access ํ ํฐ์ ์ฌ๋ฐ๊ธ๋ฐ๋ ๋ฐ ์ฌ์ฉ๋๋ค. )
- refresh ํ ํฐ์ ๊ตฌ๋ถํ ์ ์๋ ๊ฐ์ DB์ ์ ์ฅํ๋ค.
- ํด๋ผ์ด์ธํธ๋ access ํ ํฐ์ด ์๋ช ์ ๋คํ๋ฉด refresh ํ ํฐ์ ์ ๋ฌํ๋ค.
- refresh ํ ํฐ์ ๋์กฐํ์ฌ ๋ง๋ค๋ฉด ์๋ก์ด access ํ ํฐ์ ๋ฐ๊ธํด์ค๋ค.
์ค๊ฐ์ refresh ํ ํฐ์ด ํ์ทจ๋์๋ค๋ฉด, ํด๋น refresh ํ ํฐ์ ์ ๋ฌ๋ฐ์์ ๋ access ํ ํฐ ๋ฐ๊ธ์ ๊ฑฐ๋ถํ๋ค!
์ด๋ ๊ฒ ์๋ฒ ์ธก์์ ๋ก๊ทธ์ธ์ ํต์ ํ ์ ์๊ณ ,
์๋ฒ์๋ ํฐ ๋ฌด๋ฆฌ๊ฐ ๊ฐ์ง ์์ผ๋ฉด์ ๋งค๋ฒ ๋ก๊ทธ์ธํด์ผ ํ๋ ๋ถํธํจ์ ์ํ์ํฌ ์ ์๋ค.
๐ ๊ทธ๋ฐ๋ฐ ์ Session Cookie ๋ฐฉ์ ๊ณ ๋ฅด์ จ๋์?!
ํฌ๊ธฐํด์ผ ํ๋ ์ฅ์ ๊ณผ ๊ฐ์ํด์ผ ํ๋ ๋จ์ ์ด ์์์๋ ๋ถ๊ตฌํ๊ณ ์ธ์ ์ฟ ํค ๋ฐฉ์์ ๋์ ํด์ผ๋ง ํ๋ ์ด์ ๋, ๋น์ฉ์ ์ธ ํธ๋ ์ด๋์คํ๋ง์ ๊ณ ๋ คํ๋ค๊ธฐ๋ณด๋ค ๋ฐ๋ก ๋ค์ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํจ์ด์๋ค…
- ๋ฉํฐ ๋ก๊ทธ์ธ ๊ธ์ง
PC์์ ๋ก๊ทธ์ธ๋์๋ค๋ฉด ๋ชจ๋ฐ์ผ์์ ๋ก๊ทธ์์๋๋๋ก ๋ฉํฐ ์ฌ์ฉ์ ๊ธ์งํ์ฌ์ผํ๊ณ , ํ ์ธ์ ์ด ์์ฑ๋๋ฉด ์ ์ Session ID ์ ๋ณด ์ผ๋ถ๋ฅผ ์ ์ฅํ๊ณ ์๋ ๋ ๋ค๋ฅธ ์ธ์ ์ ์ญ์ ํ์ฌ ํด๋น ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์์๋ค. JWT ํ ํฐ์ ์ด๋ฏธ ๋ฐ๊ธ๋ฐ์ ์ ์ ๊ฐ ๊ฐ์ง๊ณ ์๋ ์ํ๋ก SECRET KEY๊ฐ ๋ณํ์ง ์๋ ์ด์ ์ด๋ฏธ ๋ก๊ทธ์ธํ ์ํ๋ฅผ ๋ฌด๋ ฅํ ์ํฌ ์ ์๋ค. - remember me ๊ธฐ๋ฅ
์น์ฑ ๋ด ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ ์ํ๋ฅผ ์ ์งํ ์ ์๋๋ก ํด๋น ์ต์ ์ ํ ์ ์ฟ ํค๊ฐ ๋ง๋ฃ๋๋ ์์ ์ ๋ฏธ๋๋ก ์ค์ ํ์ฌ stay sign in ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์์๋ค. JWT ์ธ๊ฐ ๋ฐฉ์์ ๊ฒฝ์ฐ ํ ํฐ์ ์๋ช ์ ๋๋ ค remember me ๊ธฐ๋ฅ์ ๊ตฌํ์ ๊ฐ๋ฅํ์ง๋ง, ์ธ์ฆ ์ฌ๋ถ๋ฅผ ํ๋ณํ๋ ํ ํฐ์ ์ ์ ๊ฐ ๊ฐ๊ณ ์๊ธฐ์ ํด๋น ํ ํฐ์ ์๋ช ๋์ ์๋ฒ ์ธก์์ ํต์ ํ ์ ์๊ฒ ๋๋ค. ์ด๋ ๋ณด์์์ ์ทจ์ฝ์ฑ์ ์๋ฏธํ๋ค.
๐ [์ถ๊ฐ] (๋ธ๋ผ์ฐ์ ์์์) ์ฟ ํค
์ฟ ํค๋ ์๋ก ๋ค๋ฅธ ๋งฅ๋ฝ์์ ๋ค๋ฅธ ๋์์ ์ง์นญํ๋ ์ฉ์ด๋ก ํด์๋ ์ ์๊ธฐ์… ์ฌ๊ธฐ์๋ ‘๋ธ๋ผ์ฐ์ ์์์’ ์ฟ ํค๋ง์ ๋ค๋ค๋ณด๊ฒ ๋ค.
์ฟ ํค ํน์ง
- ๋ธ๋ผ์ฐ์ ์ ์ ์ฅ๋๋ ์์ ๋ฌธ์์ด
- 4KB๋ฅผ ๋์ ์ ์์
- key: value; ๋ฌธ์์ด๋ก ์ ์ฅ๋๋๋ฐ ์ฝ 20์ฌ ๊ฐ๋ก ์ ํ
- e.g. name=value; name2=value2; name3=value3; ํํ๋ก ์ ์ฅ
- ์น ์๋ฒ์์ ๋ง๋ค์ด์ง. ์๋ต ํค๋์ set-cookie ๋ด์ฉ์ ๋ฃ์ด ์ ๋ฌ
- ์ ๋ฌ๋ฐ์ ๋ธ๋ผ์ฐ์ ๊ฐ ์์ฒด์ ์ผ๋ก ์ ์ฅ ํ ์์ฒญ๋ง๋ค ํค๋์ ๋ฃ์ด ์ ์ฅํ๋ค
์ฌ์ฉ์ฒ
- ํด๋ผ์ด์ธํธ ์๋ณ ์ฉ๋๋ก ์ฌ์ฉํจ
- ๋ก๊ทธ์ธ / ์ฅ๋ฐ๊ตฌ๋ / ๊ฐ์ธํ (์ฌ์ฉ์ ๋ง์ถค ํ ๋ง, ์ธ์ด ๋ฑ) / ํธ๋ํน (์ฌ์ฉ์ ํ๋ ๊ธฐ๋ก ๋ฐ ๋ถ์)
์ฟ ํค ์ถ๊ฐ ๋ฐ ์ฌ์ฉ ๋ฐฉ๋ฒ
document.cookie = "<<์ฟ ํค ๋ฌธ์์ด>>" // --- ์ฟ ํค ์ถ๊ฐ document.cookie // -- ์ฟ ํค ์ฝ๊ธฐ
์ฃผ์
- ์ผ๊ด๋ ํ์์ ์ ์งํ๊ธฐ ์ํด ๋ฐ๋์ encodeURIComponent๋ฅผ ์ฌ์ฉํ๋ค.
let name = "my name"; let value = "John Smith" document.cookie = encodeURIComponent(name) + '=' + encodeURIComponent(value); // -- ๊ณต๋ฐฑ ์ธ์ฝ๋ฉ ์ฒ๋ฆฌ alert(document.cookie); // ...; my%20name=John%20Smith
์ฟ ํค ์ต์ ? ์ธํ ๋ฐฉ๋ฒ?
- "/posting" ๊ฒฝ๋ก ํน์ ํ์ ๊ฒฝ๋ก์ ์๋ ํ์ด์ง๋ง ์ฟ ํค์ ์ ๊ทผํ๊ฒ ๋ง๋ค๊ณ ์ถ๋ค๋ฉด? <<path=/ํ์๊ฒฝ๋ก>>
path=/posting
- ์ฟ ํค์ ํด๋ผ์ด์ธํธ ๋ฐฐํฌ url (example.com)๋ง ์ ๊ทผ๊ฐ๋ฅํ๊ฒ ํ๊ณ ์ถ๋ค๋ฉด?
domain=example.com
- ์ฟ ํค์ ์ ํจ์ผ์ ํน์ ๋ง๋ฃ ๊ธฐ๊ฐ์ ์ง์ ํด์ฃผ๊ณ ์ถ๋ค๋ฉด?
expires | max-age ์ต์ ํ์ธ (๋จ, ๋ฐ๋์ toUTCString ํฌ๋งท ์ฌ์ฉ)
// ์ง๊ธ์ผ๋ก๋ถํฐ ํ๋ฃจ ํ let date = new Date(Date.now() + 86400e3); date = date.toUTCString(); document.cookie = "user=John; expires=" + date;
- https๋ก ํต์ ํ๋ ๊ฒฝ์ฐ์๋ง ์ฟ ๊ธฐ๋ฅผ ์ ์กํ๊ณ ์ถ๋ค๋ฉด?
secure
- ์ฌ์ดํธ ์ธ๋ถ์์ ์ฟ ํค์ ์ ๊ทผํ๋ ค๋ ์๋๋ฅผ ์ฐจ๋จํ๋ ค๋ฉด? (XSRF ๊ณต๊ฒฉ์ ๋ง๊ธฐ ์ํด)
samesite=strict ์ต์ ์ ์ฃผ์ด ๊ฐ์ ์ฌ์ดํธ ๋ด๋ถ์์๋ง ์ฟ ํค์ ์ ๊ทผํ ์ ์๋๋ก ์ ํ.
- ํด๋ผ์ด์ธํธ ์ธก์์ document.cookie๋ก ์ฟ ํค๋ฅผ ๊บผ๋ด ๋ณด๊ฑฐ๋ ์ฌ์ฉํ ์ ์๊ฒ ํ๊ณ ์ถ๋ค๋ฉด?
httpOnly
๐ Session Cookie ๋ฐฉ์ - ๋ธ๋ผ์ฐ์ ์ฒ๋ฆฌ ์ฝ๋
ํ๋ก์ ํธ ๋ด ์ฌ์ฉํ๋ ๋ชจ๋ api ์์ฒญ์ ์๋ฌ๋ฅผ ์ฒ๋ฆฌํ๋ ์ ํธ ํจ์์ด๋ค.
์ฌ์ฉ์๊ฐ ์ธ๊ฐ๋ฐ์ ์ ์ ์ธ์ง ํ๋ณํ๋ ์์ ์ ์๋ฒ ์ธก ์์ฒญ์ ๋ํ ์๋ต ์ํ์ฝ๋๊ฐ 401 (์ธ์ฆ ์ธ๊ฐ ์ฝ๋๊ฐ ์๋ชป๋ ๊ฒฝ์ฐ) ์ผ ๋์ด๋ค. ์ ํธ ํจ์์ ์ํ ์ฝ๋ ๋ณ ์ฒ๋ฆฌ ๋ก์ง์ ์ถ๊ฐํ์ฌ ์ผ๊ด ์ ์ฉ์ํฌ ์ ์๋ค.
type Callback<T> = (...args: any[]) => Promise<T>; export const methodFormat = <T>(callback: Callback<T>) => { const method = async ( ...args: any[] ): Promise<{ ok: boolean; data?: T; message?: string }> => { try { const data = await callback(...args); return { ok: true, data, }; } catch (error: any) { if (error.response.status === 401) { // -- 401 ์๋ฌ์ธ ๊ฒฝ์ฐ window.href = "/login" // -- login ํ์ด์ง๋ก redirect } return { ok: false, message: error.message, }; } }; return method; };
๐ ํ ์ค ๋๋
๋์จ ์ง 20๋ ์ด ์ง๋ ์ธ์ ์ฟ ํค ๋ฐฉ์์ ์์ง๊น์ง ๋ชจ๋ ์น์ 90%๊ฐ ์ฌ์ฉํ๊ณ ์๋ค๊ณ ํ๋ค. ์ค์๋น์ค ์ค JWT๋ง์ผ๋ก ์ธ๊ฐ๋ฅผ ํ์ฉํ๋ ๊ฒฝ์ฐ๋ ๋ง์ง ์๋ค๊ณ ํ๋ค. JWT๊ฐ ์ ๋ง ์ข์ ๋ฐฉ์์ด๋ฉด ๋๋ ๋๋ ์จ์ผ ํ์ง ์์๊น ํ๋ ์๊ฐ์ด ๋ค์๋ค
๋-์
์ฐธ๊ณ ์๋ฃ:
https://ko.javascript.info/cookie
'๐ Browser' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ