๐ ๊ณต๋ถํ๋ ์ง์ง์ํ์นด๋ ์ฒ์์ด์ง?
[Authentication in Node.js] Using Sessions & Cookies ๋ณธ๋ฌธ
[Authentication in Node.js] Using Sessions & Cookies
์ง์ง์ํ์นด 2023. 6. 20. 15:43<๋ณธ ๋ธ๋ก๊ทธ๋ The Full Stack Junkie ๋์ ์ ํ๋ธ๋ฅผ ์ฐธ๊ณ ํด์ ๊ณต๋ถํ๋ฉฐ ์์ฑํ์์ต๋๋ค :-)>
=> Understanding Authentication in Node.js - Sessions &Cookies - Web Development Concepts
๐ฅ๏ธ Using Sessions & Cookies
โก๏ธ ์ฟ ํค Cookie
: ์น ์๋ฒ๊ฐ ๋ธ๋ผ์ฐ์ ์๊ฒ ์ง์ํ์ฌ ์ฌ์ฉ์์ ๋ก์ปฌ ์ปดํจํฐ์ ํ์ผ ๋๋ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๋ ์์ ๊ธฐ๋ก ์ ๋ณด ํ์ผ
: ์ฟ ํค์ ๋ํ ์ ๋ณด๋ฅผ ๋งค ํค๋(Http Header) ์ ์ถ๊ฐํ์ฌ ๋ณด๋ด๊ธฐ ๋๋ฌธ์ ์๋นํ ํธ๋ํฝ์ ๋ฐ์
: ์ฟ ํค๊ฐ ์ ์ถ๋๋ฉด ๋ณด์์ ๋ํ ๋ฌธ์ ์ ๋ ๋ฐ์
Name
์ฟ ํค์ ์ด๋ฆ
Value
์ฟ ํค์ ์ ์ฅ๋ ๊ฐ
Expires
์ฟ ํค๊ฐ ์ธ์ ์ญ์ ๋๋์ง ๊ฒฐ์
Max-Age๋ฅผ ํตํด ์ง์ ๋ ๋ง๋ฃ์ผ์ด ๋๋ฉด ๋์คํฌ์์ ์ฟ ํค๊ฐ ์ ๊ฑฐ
Domain
์ฟ ํค๊ฐ ์ฌ์ฉ๋๋ ๋๋ฉ์ธ์ ์ง์
ํ์ฌ ํ์ ์ค์ธ ๋๋ฉ์ธ๊ณผ ์ผ์นํ์ง ์์ ๊ฒฝ์ฐ, “ํ์ฌ ์ฟ ํค”๋ก ๊ฐ์ฃผ๋๋ฉฐ ๋ธ๋ผ์ฐ์ ์์ ๊ฑฐ๋ถ
ํ ๋๋ฉ์ธ์์ ๋ค๋ฅธ ๋๋ฉ์ธ์ ๋ํ ์ฟ ํค๋ฅผ ์ฌ์ฉํ์ง ๋ชปํ๊ฒ ์ค์ .
Path
์ฟ ํค๋ฅผ ๋ฐํํ ๊ฒฝ๋ก๋ฅผ ๊ฒฐ์
Secure
๋ณด์ ์ฐ๊ฒฐ ์ค์
HttpOnly
Http ์ธ์ ๋ค๋ฅธ ํต์ ์ฌ์ฉ ๊ฐ๋ฅ ์ค์
โก๏ธ ์ธ์ HTTP Session
: 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)
: 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 }
}
โก๏ธ 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
'๐ฉโ๐ป ๋ฐฑ์๋(Back-End) > Node js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Markdown Blog] Node.js, Express ๋ฐ MongoDB (0) | 2023.06.22 |
---|---|
[Node js Project - 4] Zoom Clone with Node JS (1) | 2023.06.18 |
[Node js Project - 3] Create a Discord Bot (0) | 2023.06.17 |
[Node js Project - 2] Store Locator API (0) | 2023.06.17 |
[Node js Project - 1] Realtime Chat With Users & Rooms (0) | 2023.06.16 |