Jieunny์ ๋ธ๋ก๊ทธ
S3) Unit 7. [Backend] Cookie / Session ๋ณธ๋ฌธ
๐ฃ Cookie
โ๏ธ ์ด๋ค ์น ์ฌ์ดํธ์ ๋ค์ด๊ฐ์ ๋, ์๋ฒ๊ฐ ์ผ๋ฐฉ์ ์ผ๋ก ํด๋ผ์ด์ธํธ์ ์ ๋ฌํ๋ ์์ ๋ฐ์ดํฐ
โ๏ธ ์๋ฒ๊ฐ ์น ๋ธ๋ผ์ฐ์ ์ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ณ ๋ถ๋ฌ์ฌ ์ ์๋ ์๋จ
โฐ ํด๋น ๋๋ฉ์ธ์ ๋ํ ์ฟ ๊ธฐ๊ฐ ์กด์ฌํ๋ฉด, ์น ๋ธ๋ผ์ฐ์ ๋ ๋๋ฉ์ธ์๊ฒ http ์์ฒญ ์ ์ฟ ํค๋ฅผ ํจ๊ป ์ ๋ฌํ๋ค.
โฐ ๋จ์ํ ์๋ฒ์์ ํด๋ผ์ด์ธํธ์ ์ฟ ํค๋ฅผ ์ ์กํ๋ ๊ฒ๋ง ์๋ฏธํ์ง ์๊ณ , ํด๋ผ์ด์ธํธ์์ ์๋ฒ๋ก ์ฟ ํค๋ฅผ ๋ค์ ์ ์กํ๋ ๊ฒ๋ ํฌํจํ๋ค.
๐ฃ Cookie ํน์ง
โ๏ธ ์ฅ์๊ฐ ๋ณด์กดํด์ผํ๋ ์ ๋ณด ์ ์ฅ์ ์ ํฉํ๋ค.
โฐ ๋ก๊ทธ์ธ ์ํ ์ ์ง
โ๏ธ ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์ ํน์ ์ ๋ณด๋ฅผ ์ ์ฅํ ์ ์๋ค.
โฐ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ดํ ์๋ฌด ๋๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์๋ ์๊ณ , ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ดํ ํน์ ์กฐ๊ฑด๋ค์ด ๋ง์กฑ๋์ด์ผ ๋ค์ ๊ฐ์ ธ์ฌ ์ ์๋ค.
โฐ ์ด๋ฐ ์กฐ๊ฑด๋ค์ http ํค๋๋ฅผ ์ฌ์ฉํด์ ์ฟ ํค ์ต์ ์ผ๋ก ํํํ ์ ์๋ค.
๐ฃ ์ฟ ํค ์ต์
'Set-Cookie':[
'cookie=yummy',
'Secure=Secure; Secure',
'HttpOnly=HttpOnly; HttpOnly',
'Path=Path; Path=/cookie',
'Doamin=Domain; Domain=codestates.com'
]
1๏ธโฃ Domain
โ๏ธ ๋๋ฉ์ธ : ์๋ฒ์ ์ ์ํ ์ ์๋ ์ด๋ฆ
โฐ ์ฟ ํค ์ต์ ์์ ๋๋ฉ์ธ์ 'http://www.localhost.com:3000/users/login' ์์ 'localhost.com' ๋ถ๋ถ์ด๋ค.
โฐ ์ฟ ํค ์ต์ ์ ๋๋ฉ์ธ ์ ๋ณด๊ฐ ์๋ค๋ฉด, ํด๋ผ์ด์ธํธ๋ ์ฟ ํค์ ๋๋ฉ์ธ ์ต์ ๊ณผ ์๋ฒ์ ๋๋ฉ์ธ์ด ์ผ์นํด์ผ๋ง ์ฟ ํค๋ฅผ ์ ์กํ ์ ์๋ค.
2๏ธโฃ Path
โ๏ธ Path : ์๋ฒ๊ฐ ๋ผ์ฐํ ํ ๋ ์ฌ์ฉํ๋ ๊ฒฝ๋ก
โฐ ์์ฒญํด์ผํ๋ url์ด 'http://www.localhost.com:3000/users/login' ๋ผ๋ฉด 'path๋ /users/login' ์ด๋ค.
โฐ ์ค์ ๋ ๊ฒฝ๋ก๋ฅผ ํฌํจํ๋ ํ์ ๊ฒฝ๋ก๋ก ์์ฒญ์ ํ๋๋ผ๋ ์ฟ ํค๋ฅผ ์๋ฒ์ ์ ์กํ ์ ์๋ค.
๏น path๊ฐ /users๊ณ , ์์ฒญ ๊ฒฝ๋ก๊ฐ /users/codestates์ธ ๊ฒฝ์ฐ ์ฟ ๊ธฐ ์ ์ก์ด ๊ฐ๋ฅํ๋ค.
3๏ธโฃ MaxAge or Expires
โ๏ธ ์ฟ ํค๊ฐ ์ ํจํ ๊ธฐ๊ฐ์ ์ ํ๋ ์ต์
โฐ MaxAge : ์ฟ ํค๊ฐ ์ ํจํ ์๊ฐ์ ์ด ๋จ์๋ก ์ค์ ํ๋ ์ต์
โฐ Expires : ์ธ์ ๊น์ง ์ฟ ํค๊ฐ ์ ํจํ์ง ํด๋ผ์ด์ธํธ์ ์๊ฐ์ ๊ธฐ์ค์ผ๋ก ์๊ฐ, ๋ ์ง๋ฅผ ์ง์ ํ ์ ์๋ค.
โฐ ์ ์ต์ ์ฌ๋ถ์ ๋ฐ๋ผ ์ธ์ ์ฟ ํค, ์์์ฑ ์ฟ ํค๋ก ๋๋๋ค.
๏น ์ธ์ ์ฟ ํค : MaxAge ๋๋ Expires ์ต์ ์ด ์๋ ์ฟ ํค๋ก, ๋ธ๋ผ์ฐ์ ๊ฐ ์คํ ์ค์ผ ๋ ์ฌ์ฉํ ์ ์๋ ์์ ์ฟ ํค์ด๋ค. ๋ธ๋ผ์ฐ์ ๋ฅผ ์ข ๋ฃํ๋ฉด ํด๋น ์ฟ ํค๋ ์ญ์ ๋๋ค.
๏น ์์์ฑ ์ฟ ํค : ๋ธ๋ผ์ฐ์ ์ ์ข ๋ฃ ์ฌ๋ถ์ ์๊ด์์ด MaxAge ๋๋ Expires์ ์ ํจ์๊ฐ๋งํผ ์ฌ์ฉ๊ฐ๋ฅํ๋ค.
4๏ธโฃ Secure
โ๏ธ ์ฌ์ฉํ๋ ํ๋กํ ์ฝ์ ๋ฐ๋ฅธ ์ฟ ๊ธฐ์ ์ ์ก ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ ์ต์
โฐ true์ธ ๊ฒฝ์ฐ HTTPS๋ฅผ ์ด์ฉํ๋ ๊ฒฝ์ฐ์๋ง ์ฟ ํค๋ฅผ ์ ์กํ ์ ์๋ค.
โฐ ๋๋ฉ์ธ์ด localhost์ธ ๊ฒฝ์ฐ์๋ HTTPS๊ฐ ์๋์ด๋ ์ฟ ํค ์ ์ก์ด ๊ฐ๋ฅํ๋ค.
5๏ธโฃ HttpOnly
โ๏ธ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๋ธ๋ผ์ฐ์ ์ ์ฟ ํค์ ์ ๊ทผ์ด ๊ฐ๋ฅํ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ค.
โฐ true์ธ ๊ฒฝ์ฐ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์ฟ ํค์ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ๋ค.
โฐ ๋ํดํธ๊ฐ์ false๋ก, document.cookie๋ก ์ฟ ํค์ ์ ๊ทผํ ์ ์์ผ๋ฏ๋ก ์ฟ ํค๊ฐ ํ์ทจ๋ ์ํ์ด ์๋ค.
6๏ธโฃ SameSite
โ๏ธ Cross-Origin ์์ฒญ์ ๋ฐ์ ๊ฒฝ์ฐ, ์์ฒญ์์ ์ฌ์ฉํ ๋ฉ์๋(GET, POST...)์ ํด๋น ์ต์ ์ ์กฐํฉ์ ๊ธฐ์ค์ผ๋ก ์๋ฒ์ ์ฟ ํค ์ ์ก ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ค.
โฐ Lax : Cross-Origin ์์ฒญ์ด๋ผ๋ฉด GET ๋ฉ์๋์ ๋ํด์๋ง ์ฟ ํค๋ฅผ ์ ์กํ ์ ์๋ค.
โฐ Strict : ๊ฐ์ฅ ์๊ฒฉํ ์ต์ ์ผ๋ก, Cross-Origin์ด ์๋ same-site์ธ ๊ฒฝ์ฐ์๋ง ์ ์ก ๊ฐ๋ฅํ๋ค.
โฐ None : ๊ฐ์ฅ ๊ด๋ํ ์ต์ ์ผ๋ก, ํญ์ ์ฟ ํค๋ฅผ ๋ณด๋ผ ์ ์์ง๋ง ์ฟ ํค ์ต์ ์ค Secure ์ต์ ์ด ํ์ํ๋ค.
๐ฃ Cookie๋ฅผ ์ด์ฉํ ์ํ ์ ์ง
โ๏ธ ์๋ฒ๋ ํด๋ผ์ด์ธํธ์ ์ธ์ฆ์ ๋ณด๋ฅผ ๋ด์ ์ฟ ํค๋ฅผ ์ ์กํ๊ณ , ํด๋ผ์ด์ธํธ๋ ์ ๋ฌ๋ฐ์ ์ฟ ํค๋ฅผ ์๋ฒ์ ์์ฒญ๊ณผ ํจ๊ป ์ ์กํ์ฌ Statelessํ ์ธํฐ๋ท ์ฐ๊ฒฐ์ Statefuleํ๊ฒ ์ ์งํ ์ ์๋ค.
โ๏ธ ํ์ง๋ง ์ธ์ฆ์ ๋ณด๋ฅผ ์ด์ฉํด ๊ณต๊ฒฉ์๊ฐ ์์ฒญ์ ๋ณด๋ด์ ํ์ทจ๊ฐ ์ผ์ด๋๋ฉด ์ํํ๋ฏ๋ก, ์ฟ ํค์ ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ๋ด๋ ๊ฒ์ ์ํํ๋ค.
๐ฃ Session
โ๏ธ ์ธ์ : ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์ ์ ์ผํ๊ณ ์ํธํ๋ ID๋ฅผ ๋ถ์ฌ
โ๏ธ ์ค์ ๋ฐ์ดํฐ๋ ์๋ฒ์์ ๊ด๋ฆฌ
๐ฃ Session ์ ๋ฌ ๋ฐฉ๋ฒ
1๏ธโฃ ๋ก๊ทธ์ธ
โ๏ธ ์ฌ์ฉ์๊ฐ ์ ํํ ์์ด๋์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํ๋ฉด, ์๋ฒ๋ ์ธ์ฆ์ ์ฑ๊ณต(์ธ์ )ํ๋ค๊ณ ํ๋จํ๊ณ , ์ ์ ๋ ๋งค๋ฒ ๋ก๊ทธ์ธ ํ ํ์๊ฐ ์๊ฒ ๋๋ค.
โ๏ธ ์ด๋ ์๋ฒ๋ ์ฌ์ฉ์๊ฐ ์ธ์ฆ์ ์ฑ๊ณตํ์์ ์๊ณ ์์ด์ผ ํ๋ฉฐ, ํด๋ผ์ด์ธํธ๋ ์ธ์ฆ ์ฑ๊ณต์ ์ฆ๋ช ํ ์๋จ์ ๊ฐ๊ณ ์์ด์ผ ํ๋ค.
1. ์๋ฒ๋ ์ผ์ข ์ ์ ์ฅ์(์ฃผ๋ก in-memory)์ ์ธ์ ์ ์ ์ฅํ๊ฑฐ๋ ์ธ์ ์คํ ์ด์ ์ ์ฅํ๋ค.
2. ์ธ์ ์ด ๋ง๋ค์ด์ง๋ฉด, ๊ฐ ์ธ์ ์ ๊ตฌ๋ถํ ์ ์๋ ์ธ์ ์์ด๋๊ฐ ๋ง๋ค์ด์ง๋๋ฐ, ํด๋ผ์ด์ธํธ๋ ์ด๋ฅผ ์ธ์ ์ฑ๊ณต์ ์ฆ๋ช ํ ์๋จ์ผ๋ก์จ ์ ๋ฌํ๋ค.
3. ์ด๋ ์น์ฌ์ดํธ์์ ๋ก๊ทธ์ธ์ ์ ์งํ๊ธฐ ์ํ ์๋จ์ผ๋ก ์ฟ ํค๋ฅผ ์ฌ์ฉํ๋๋ฐ, ์ฟ ํค๋ ์๋ฒ์์ ๋ฐ๊ธํ ์ธ์ ์์ด๋๋ฅผ ์ ์ฅํ๋ค.
4. ์ฟ ํค๋ฅผ ํตํด ์ ํจํ ์ธ์ ์์ด๋๊ฐ ์๋ฒ์ ์ ๋ฌ๋๊ณ , ์ธ์ ์คํ ์ด์ ํด๋น ์ธ์ ์ด ์กด์ฌํ๋ค๋ฉด ์๋ฒ๋ ํด๋น ์์ฒญ์ ์ ๊ทผ ๊ฐ๋ฅํ๋ค๊ณ ํ๋จํ๋ค.
2๏ธโฃ ๋ก๊ทธ์์
โ๏ธ ํด๋ผ์ด์ธํธ๋ ์ธ์ ์์ด๋๊ฐ ๋ด๊ธด ์ฟ ํค๋ฅผ, ์๋ฒ๋ ์ธ์ ์ ์ ์ฅํ๊ณ ์์ผ๋ฉฐ, ์๋ฒ๋ ๊ทธ์ ์ธ์ ์์ด๋๋ก๋ง ์ธ์ฆ ์ฌ๋ถ๋ฅผ ํ๋จํ๋ค.
โ๏ธ ๋ก๊ทธ์์์ ์๋ฒ๊ฐ ์ธ์ ์ ๋ณด๋ฅผ ์ญ์ ํ๊ณ , ํด๋ผ์ด์ธํธ๋ ์ฟ ํค๋ฅผ ๊ฐฑ์ ํ๊ฑฐ๋ ์ญ์ ํด์ผ ํ๋ค.
โฐ ํด๋ผ์ด์ธํธ๋ res.cookie๋ก ์ฟ ํค์ ๊ฐ์ ๋ฌดํจํ ๊ฐ์ผ๋ก ๊ฐฑ์ ํ๊ฑฐ๋, res.clearCookie๋ก ์ฟ ํค๋ฅผ ์ญ์ ํ ์ ์๋ค.
๐ฃ Session์ ๋จ์
โ๏ธ ์๋ฒ ์ ์ฅ ๊ณต๊ฐ์ ์ฐจ์งํ๋ฏ๋ก ๊ฐ์ฉ ๋ฉ๋ชจ๋ฆฌ์ ์์ด ์ค์ด๋ ๋ค.
โ๏ธ ์ธ์ ์ฟ ํค๊ฐ ํ์ทจ๋๋ค๋ฉด ์ฌ์ ํ ๊ฐ์ธ์ ๋ณด๊ฐ ์ ์ถ๋ ์ํ์ด ์๋ค.
๐ฃ Cookie vs Session
๐ฃ express-session
โ๏ธ ์ธ์ ์ ๋์ ๊ด๋ฆฌํด ์ฃผ๋ Node.js์ ๋ชจ๋
โฐ ์ธ์ ์ ์ํ ๋ฏธ๋ค์จ์ด๋ก, express ์๋ฒ์์ ์ฝ๊ฒ ์ธ์ ์ ์ํ ๊ณต๊ฐ์ ๋ค๋ฃฐ ์ ์๋๋ก ๋ง๋ค์ด์ค๋ค.
const express = require('express');
const session = require('express-session');
const app = express();
app.use(
session({
// ์ธ์
์ ์ต์
์ ์ง์ ํ ์ ์๋ค.
// ์ธ์
๊ฐ์ฒด๋ ์ ์ ๋ณ๋ก ๋
๋ฆฝ์ ์ผ๋ก ์์ฑ๋ ๊ฐ์ฒด์ด๋ฏ๋ก ์ ์ ๋ณ๋ก ๊ฐ๊ฐ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์๋ค.
secret: '@codestates',
// ๋น๋ฐํค๋ฅผ ์ด์ฉํด ์ํธํํด์ ์ธ์
id๋ผ๋ ๊ฒ์ ์์ฑํ๋ค.
// ์ด๋ฅผ ํด๋ผ์ด์ธํธ์๊ฒ ์ฟ ํค๋ก ์ ์กํ๋ค.
resave: false,
saveUninitialized: true,
cookie: {
domain: 'localhost',
path: '/',
maxAge: 24 * 6 * 60 * 10000,
sameSite: 'none',
httpOnly: false,
secure: true,
},
})
);
โฐ ํด๋ผ์ด์ธํธ์ ์ ์ ์ ๊ฐ์ธ ์ ๋ณด๋ฅผ ๋ด์ง ์๊ณ ๋ ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์ ์ธ์ id๋ฅผ ์ด์ฉํด ์ ์ ์ ์ธ์ฆ์ฌ๋ถ๋ฅผ ํ๋จํ ์ ์๋ค.
'CodeStates > learning contents' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Section 3. [๊ธฐ์ ๋ฉด์ ] (0) | 2023.03.13 |
---|---|
S3) Unit 7. [Backend] Hashing / Token / OAuth (0) | 2023.03.08 |
S3) Unit 6. [๋คํธ์ํฌ] HTTP & HTTPS (0) | 2023.03.06 |
S3) Unit 6. [๋คํธ์ํฌ] TCP/IP & ๋คํธ์ํฌ ๊ณ์ธต ๋ชจ๋ธ (0) | 2023.03.06 |
S3) Unit 5. [์ฌ์ฉ์ ์นํ ์น] ์น ์ ๊ทผ์ฑ (0) | 2023.03.02 |