๐Ÿ˜Ž ๊ณต๋ถ€ํ•˜๋Š” ์ง•์ง•์•ŒํŒŒ์นด๋Š” ์ฒ˜์Œ์ด์ง€?

[Authentication in Node.js] Using Sessions & Cookies ๋ณธ๋ฌธ

๐Ÿ‘ฉ‍๐Ÿ’ป ๋ฐฑ์—”๋“œ(Back-End)/Node js

[Authentication in Node.js] Using Sessions & Cookies

์ง•์ง•์•ŒํŒŒ์นด 2023. 6. 20. 15:43
728x90
๋ฐ˜์‘ํ˜•

<๋ณธ ๋ธ”๋กœ๊ทธ๋Š” The Full Stack Junkie ๋‹˜์˜ ์œ ํŠœ๋ธŒ๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค :-)>

=> Understanding Authentication in Node.js - Sessions &Cookies - Web Development Concepts

 

๐Ÿ–ฅ๏ธ Using Sessions & Cookies

Sessions&nbsp;&&nbsp;Cookies

 

โžก๏ธ ์ฟ ํ‚ค Cookie

https://velog.io/@guswlsapdlf/Session-Cookie-Persistent-Cookie

: ์›น ์„œ๋ฒ„๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ์ง€์‹œํ•˜์—ฌ ์‚ฌ์šฉ์ž์˜ ๋กœ์ปฌ ์ปดํ“จํ„ฐ์— ํŒŒ์ผ ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๋Š” ์ž‘์€ ๊ธฐ๋ก ์ •๋ณด ํŒŒ์ผ

: ์ฟ ํ‚ค์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋งค ํ—ค๋”(Http Header) ์— ์ถ”๊ฐ€ํ•˜์—ฌ ๋ณด๋‚ด๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๋‹นํ•œ ํŠธ๋ž™ํ”ฝ์„ ๋ฐœ์ƒ

: ์ฟ ํ‚ค๊ฐ€ ์œ ์ถœ๋˜๋ฉด ๋ณด์•ˆ์— ๋Œ€ํ•œ ๋ฌธ์ œ์ ๋„ ๋ฐœ์ƒ

Name
์ฟ ํ‚ค์˜ ์ด๋ฆ„
Value
์ฟ ํ‚ค์˜ ์ €์žฅ๋œ ๊ฐ’
Expires
์ฟ ํ‚ค๊ฐ€ ์–ธ์ œ ์‚ญ์ œ๋˜๋Š”์ง€ ๊ฒฐ์ •
Max-Age๋ฅผ ํ†ตํ•ด ์ง€์ •๋œ ๋งŒ๋ฃŒ์ผ์ด ๋˜๋ฉด ๋””์Šคํฌ์—์„œ ์ฟ ํ‚ค๊ฐ€ ์ œ๊ฑฐ
Domain
์ฟ ํ‚ค๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๋„๋ฉ”์ธ์„ ์ง€์ •
ํ˜„์žฌ ํƒ์ƒ‰ ์ค‘์ธ ๋„๋ฉ”์ธ๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ, “ํƒ€์‚ฌ ์ฟ ํ‚ค”๋กœ ๊ฐ„์ฃผ๋˜๋ฉฐ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ฑฐ๋ถ€
ํ•œ ๋„๋ฉ”์ธ์—์„œ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์— ๋Œ€ํ•œ ์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ์„ค์ •.
Path
์ฟ ํ‚ค๋ฅผ ๋ฐ˜ํ™˜ํ•  ๊ฒฝ๋กœ๋ฅผ ๊ฒฐ์ •
Secure
๋ณด์•ˆ ์—ฐ๊ฒฐ ์„ค์ •
HttpOnly
Http ์™ธ์— ๋‹ค๋ฅธ ํ†ต์‹  ์‚ฌ์šฉ ๊ฐ€๋Šฅ ์„ค์ •

 

โžก๏ธ ์„ธ์…˜ HTTP Session

https://nesoy.github.io/articles/2017-03/Session-Cookie

: HTTP Session id๋ฅผ ์‹๋ณ„์ž๋กœ ๊ตฌ๋ณ„ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ €์— ์ฟ ํ‚คํ˜•ํƒœ๊ฐ€ ์•„๋‹Œ ์ ‘์†ํ•œ ์„œ๋ฒ„ DB์— ์ •๋ณด๋ฅผ ์ €์žฅ

: ํด๋ผ์ด์–ธํŠธ๋Š” HTTP Session id๋ฅผ ์ฟ ํ‚ค๋กœ ๋ฉ”๋ชจ๋ฆฌ ์ €์žฅ๋œ ํ˜•ํƒœ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์Œ

: ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์‚ฌ๋ผ์ง

1) ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— Resource๋ฅผ ์š”์ฒญ
2) ์„œ๋ฒ„์—์„œ๋Š” HTTP Request๋ฅผ ํ†ตํ•ด ์ฟ ํ‚ค์—์„œ Session id๋ฅผ ํ™•์ธ์„ ํ•œ ํ›„์— ์—†์œผ๋ฉด Set-Cookie๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ ๋ฐœํ–‰ํ•œ Session-id ๋ณด๋ƒ„
3) ํด๋ผ์ด์–ธํŠธ๋Š” HTTP Request ํ—ค๋”์— Session id๋ฅผ ํฌํ•จํ•˜์—ฌ ์›ํ•˜๋Š” Resource๋ฅผ ์š”์ฒญ
4) ์„œ๋ฒ„๋Š” Session id๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์„ธ์…˜์„ ์ฐพ์•„ ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ ์ •๋ณด๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ ์ ์ ˆํ•œ ์‘๋‹ตํ•จ

 

โžก๏ธ JWT (JSON Web Token)

https://velog.io/@couchcoding/HTTP-2-HTTP%EC%97%90%EC%84%9C-%EC%83%81%ED%83%9C%EB%A5%BC-%EC%A0%80%EC%9E%A5%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%84-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90-Session-Cookie

: Header(Json), Payload(Json), Signature(Hash)ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ Base64๋กœ ์ธ์ฝ”๋”ฉํ•˜์—ฌ ๋งŒ๋“  ํ† ํฐ

: JWT๋Š” json payload์— ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์•„์„œ ์„œ๋ช…์„ ๋™๋ด‰ํ•œ ์ฆ๋ช… ํ† ํฐ์œผ๋กœ ํ† ํฐ ์ž์ฒด์— ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ

1) ์ธ์ฆ ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด ์ธ์ฆ์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ์ธ์ฆ ์„œ๋ฒ„๋Š” ์ž์‹ ์˜ ์„œ๋ช…๊ณผ ์œ ํšจ๊ธฐ๊ฐ„์„ ํฌํ•จํ•œ JWT๋ฅผ ๋ฆฌํ„ด
2) Header์˜ Authroization์— ๋‹ด์•„ API๋ฅผ ์š”์ฒญํ•˜๋ฉด ์„œ๋ฒ„๋Š” ์ธ์ฆ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด ํ† ํฐ ์œ ํšจ์„ฑ์„ ๊ฒ€์ฆ

 

๐Ÿ–ฅ๏ธ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ค์ •

โžก๏ธ server.js

// server.js
const express = require("express");
const app = express();

app.get("/", (req, res) => {
  res.send("Hello sessions");
});

const PORT = process.env.PORT || 8080;
app.listen(PORT, () => {
  console.log(`Server running on http://localhost:${PORT}`);
});

โžก๏ธ express-session

// ๋ชจ๋“  uri์— ์ ‘๊ทผ ํ–ˆ์„ ๋•Œ ์ ์šฉ๋˜๋„๋ก ๋ผ์šฐํ„ฐ๋ฅผ ๋งŒ๋“ฆ
app.use(
  session({
    // ์•”ํ˜ธํ™”์— ๋Œ€ํ•œ ๋‚ด์šฉ
    secret: "key that all sign cookie",
    // ๋งค request ๋งˆ๋‹ค ์„ธ์…˜์„ ๊ณ„์† ๋‹ค์‹œ ์ €์žฅ
    resave: false,
    // request์—์„œ ์ƒˆ๋กœ ์ƒ์„ฑ๋œ session์— ์•„๋ฌด๋Ÿฐ ์ž‘์—…์ด ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์€ ์ƒํ™ฉ
    saveUninitialized: false,
  })
);

########################### req.session ###########################
Session {
  cookie: { path: '/', _expires: null, originalMaxAge: null, httpOnly: true }
}

sessionId

 

โžก๏ธ Mongoose ์„ค์ •

const express = require("express");
const session = require("express-session");
const bcrypt = require("bcryptjs");
const mongoose = require("mongoose");
const MongoDBSession = require("connect-mongodb-session")(session);
const app = express();

// DB config
require("dotenv").config();
const db = process.env.MONGODB_URI;

const UserModel = require("./models/User");

// connect to Mongo
mongoose
  .connect(db, {
    useNewUrlParser: true, // useNewUrlParser : ์—๋Ÿฌ ๋ฐฉ์ง€
    useUnifiedTopology: true,
  })
  .then((req) => console.log("๐Ÿ’šMongoDB Connected..."))
  .catch((err) => console.log(err));

const store = new MongoDBSession({
  url: db,
  collection: "mySessions",
});

app.set("view engine", "ejs");
app.use(express.urlencoded({ extended: true }));

// ๋ชจ๋“  uri์— ์ ‘๊ทผ ํ–ˆ์„ ๋•Œ ์ ์šฉ๋˜๋„๋ก ๋ผ์šฐํ„ฐ๋ฅผ ๋งŒ๋“ฆ
app.use(
  session({
    // ์•”ํ˜ธํ™”์— ๋Œ€ํ•œ ๋‚ด์šฉ
    secret: "key that all sign cookie",
    // ๋งค request ๋งˆ๋‹ค ์„ธ์…˜์„ ๊ณ„์† ๋‹ค์‹œ ์ €์žฅ
    resave: false,
    // request์—์„œ ์ƒˆ๋กœ ์ƒ์„ฑ๋œ session์— ์•„๋ฌด๋Ÿฐ ์ž‘์—…์ด ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์€ ์ƒํ™ฉ
    saveUninitialized: false,
    store: store,
  })
);

const PORT = process.env.PORT || 8080;
app.listen(PORT, () => {
  console.log(`Server running on http://localhost:${PORT}`);
});

 

โžก๏ธ login / register / dashboard / home page ์„ค์ •

 

โžก๏ธ register ํ•˜๊ณ , login ํ›„ mongodb

 

728x90
๋ฐ˜์‘ํ˜•
Comments