TIL 25์ผ์ฐจ (20240129)

๋ฐ•์„ธ์—ฐยท2024๋…„ 1์›” 29์ผ

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
20/70
post-thumbnail


์˜ค๋Š˜ ๋ชฉํ‘œ๋Š” ์ตœ์†Œ 2-5๊นŒ์ง€ ์™„๊ฐ•!!

: ์‚ฌ์šฉ์ž๊ฐ€ ์›น ์‚ฌ์ดํŠธ๋ฅผ ๋ฐฉ๋ฌธํ•  ๋•Œ๋งˆ๋‹ค ์ด์ „์— ๋ฐฉ๋ฌธํ–ˆ๋˜ ์ •๋ณด๋ฅผ ๊ธฐ์–ตํ•˜๋Š” ๋ฐ์ดํ„ฐ ํŒŒ์ผ, ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ์‚ฌ์ดํŠธ์— ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณด์•ˆ์— ์ทจ์•ฝํ•  ์ˆ˜ ์žˆ์Œ, ๋ฌธ์ž์—ด ํ˜•์‹์œผ๋กœ ์กด์žฌํ•˜๋ฉฐ ์ฟ ํ‚ค ๊ฐ„์—๋Š” ์„ธ๋ฏธ์ฝœ๋ก (;)์œผ๋กœ ๊ตฌ๋ถ„๋จ

๐Ÿ–ฅ๏ธ Session

: ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„์—๋งŒ ์ €์žฅํ•จ. ์ผ๋ฐ˜์ ์œผ๋กœ ์„ธ์…˜ Id๋ฅผ ์ฟ ํ‚ค๋ฅผ ์ด์šฉํ•ด ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌํ•˜์—ฌ, ์„œ๋ฒ„๋Š” ์ด ์„ธ์…˜ Id๋ฅผ ์ด์šฉํ•ด ์ €์žฅ๋œ ์„ธ์…˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•จ. ๋ณด์•ˆ์„ฑ์€ ์ข‹์œผ๋‚˜ ์‚ฌ์šฉ์ž๊ฐ€ ๋งŽ์€ ๊ฒฝ์šฐ ์„œ๋ฒ„์— ์ €์žฅํ•ด์•ผํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์•„์ ธ ์„œ๋ฒ„ ์ปดํ“จํ„ฐ๊ฐ€ ๊ฐ๋‹น ๋ชปํ•  ์ˆ˜ ์žˆ์Œ


app.get("/set-cookie", (req, res) => {
  let expire = new Date();
  expire.setMinutes(expire.getMinutes() + 60); // ๋งŒ๋ฃŒ ์‹œ๊ฐ„์„ 60๋ถ„์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  
  //1. Set-Cookie ์‚ฌ์šฉํ•˜์—ฌ Cookie ํ• ๋‹น
  res.writeHead(200, {
    'Set-Cookie': `name=sparta; Expires=${expire.toGMTString()}; HttpOnly; Path=/`,
  });
  
  //2. res.cookie ์ด์šฉํ•˜์—ฌ Cookie ํ• ๋‹น
  res.cookie('name', 'sparta', {
    expires: expires
  });
  
  return res.end();
});

req.headers.cookie๋ฅผ ์ด์šฉํ•˜์—ฌ ์ฟ ํ‚ค ์กฐํšŒํ•˜๊ธฐ (๊ฐœ๋ฐœ์ž ๋„๊ตฌ-application - ์ฟ ํ‚ค)

	app.get('/get-cookie', (req, res) => {
     const cookie = req.headers.cookie;
     console.log(cookie); // ์ถœ๋ ฅํ•˜๋ฉด name=sparta
     
     //cookie-parser ๋ฏธ๋“ค์›จ์–ด ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ
     const cookies = req.cookies;
     console.log(cookies); // ์ถœ๋ ฅํ•˜๋ฉด { name: 'sparta' }
     
     return res.status(200).json({ cookie });
   });
yarn add cookie-parser // ํ„ฐ๋ฏธ๋„

// app.js
import cookieParser from 'cookie-parser';
app.use(cookieParser()); 

-> ์‚ฌ์šฉํ•œ ์ฝ”๋“œ๋Š” ์œ„์˜ ์ฝ”๋“œ์—์„œ ํ™•์ธ ๊ฐ€๋Šฅ

Session ๋งŒ๋“ค๊ธฐ

/* set-session API ์ž‘์„ฑ*/
   let session = {};
 app.get('/set-session', function (req, res, next) {

   const name = 'sparta';
   const uniqueInt = Date.now(); // ์„ธ์…˜์— ์‚ฌ์šฉ์ž์˜ ์‹œ๊ฐ„ ์ •๋ณด ์ €์žฅ
   // session ๊ฐ์ฒด์— uniqueInt๋ฅผ key, name์„ value๋กœ ์ €์žฅ
   session[uniqueInt] = { name };

   res.cookie('sessionKey', uniqueInt);
   return res.status(200).end();
 });
 
 /* get-session API ์ž‘์„ฑ*/
  app.get('/get-session', function (req, res, next) {
     const { sessionKey } = req.cookies;
     console.log(session);
     // ํด๋ผ์ด์–ธํŠธ์˜ ์ฟ ํ‚ค์— ์ €์žฅ๋œ ์„ธ์…˜ํ‚ค๋กœ ์„œ๋ฒ„์˜ ์„ธ์…˜ ์ •๋ณด๋ฅผ ์กฐํšŒ.
     const name = session[sessionKey];
     return res.status(200).json({ name });
   });

JWT (JSON Web Token)

  • Json ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ „์†กํ•˜๊ณ  ๊ฒ€์ฆํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ฃผ๋Š” ์›น ํ† ํฐ
  • header, payload, signature์˜ ์„ธ ๊ฐ€์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง (.์œผ๋กœ ๊ตฌ๋ถ„ํ•˜๋ฏ€๋กœ ํ•ญ์ƒ ์  2๊ฐœ๋ฅผ ๊ฐ€์ง)
  • JWT๋Š” ๋น„๋ฐ€ํ‚ค๋ฅผ ๋ชจ๋ฅด๋”๋ผ๋„ ๋ณตํ˜ธํ™”(Decode)ํ•  ์ˆ˜ ์žˆ์Œ (๋ณ€์กฐ๋Š” ๋ถˆ๊ฐ€๋Šฅ)
    โžก๏ธ Stateless(๋ฌด์ƒํƒœ): nodejs ์„œ๋ฒ„๊ฐ€ ์ฃฝ์—ˆ๋‹ค ์‚ด์•„๋‚˜๋„ ๋˜‘๊ฐ™์€ ๋™์ž‘์„ ํ•จ
    cf. cookie, session: ์„œ๋ฒ„์— ์ €์žฅํ•˜๋ฏ€๋กœ Stateful(์ƒํƒœ ๋ณด์กด) - ์„œ๋ฒ„๊ฐ€ ์ฃฝ์—ˆ๋‹ค ์‚ด์•„๋‚ฌ์„ ๋•Œ ์กฐ๊ธˆ์ด๋ผ๋„ ๋™์ž‘์ด ๋‹ค๋ฆ„
  • ๋ฏผ๊ฐํ•œ ์ •๋ณด๋Š” ๋‹ด์ง€ ์•Š์•„์•ผํ•จ
  • ํŠน์ • ์–ธ์–ด์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์Œ

โž• ๊ฒŒ์‹œํŒ ์ž‘์„ฑํ•˜๊ธฐ ไธญ ๋ฐฐ์šด ๊ฒƒ๋“ค

schema.prisma

model Users {
  userId    Int      @id @default(autoincrement()) @map("userId")
  email     String   @unique @map("email")
  password  String   @map("password")
  createdAt DateTime @default(now()) @map("createdAt")
  updatedAt DateTime @updatedAt @map("updatedAt")

  userInfos UserInfos?
  posts     Posts[]

  @@map("Users")
}

userInfos์˜ ๊ฒฝ์šฐ 1:1์˜ ๊ด€๊ณ„์ด๋ฏ€๋กœ ?๊ฐ€ ๋ถ™์ง€๋งŒ posts์˜ ๊ฒฝ์šฐ 1:N์ด๋ฏ€๋กœ [ ]๋กœ ๊ฐ์‹ธ์ค€๋‹ค.

user Users @relation(fields: [userId], references: [userId], onDelete:Cascade)

model Posts์™€ UserInfos์— ๋“ค์–ด๊ฐ€๋Š” ์ฝ”๋“œ. fields์˜†์—๋Š” ํ˜„์žฌ ํ…Œ์ด๋ธ”์˜ ์นผ๋Ÿผ์ด, references ์˜†์—๋Š” ์ฐธ์กฐํ•  ํ…Œ์ด๋ธ”(์ฝ”๋“œ์—์„œ๋Š” Users)์˜ ์นผ๋Ÿผ์„ ์“ด๋‹ค. onDelete:Cascade์˜ ๊ฒฝ์šฐ ์ฐธ์กฐํ•œ ์นผ๋Ÿผ์˜ ์ •๋ณด๊ฐ€ ์‚ฌ๋ผ์ง€๋ฉด ๊ฐ™์ด ์‚ฌ๋ผ์ง€๊ฒŒ ํ•œ๋‹ค๋Š” ์˜๋ฏธ.

profile
๋ฐฐ์›Œ๋‚˜๊ฐ€๋Š” ์ค‘

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