Skip to content

hamaeyes/nodejs-session

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

3 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

nodejs-session

์„ธ์…˜ ํด๋Ÿฌ์Šคํ„ฐ๋ง์„ ์œ„ํ•ด์„œ Redis๋ฅผ ์Šคํ† ์–ด๋กœ ๊ด€๋ฆฌํ•˜๋Š” ์„ธ์…˜์„ ๊ตฌํ˜„ํ•ด ๋ณด์ž.ย 

connect-redis๋ฅผ ์ด์šฉํ•˜๋ฉด ์‹ฌํ”Œํ•˜๊ฒŒ ๊ตฌ์ถ•์ด ๊ฐ€๋Šฅํ•˜๋‹ค.ย 


ํ•„์š”ํ•œ ํŒจํ‚ค์ง€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜์ž.

ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

morgan์„ ์„ค์น˜ํ•œ ์ด์œ ๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ์ฟ ํ‚ค๊ฐ’์ด ์–ด๋–ป๊ฒŒ ์˜ฌ๋ผ์˜ค๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ๋‹ค.ย 

$ npm install express express-session morgan redis connect-redis

๋ ˆ๋””์Šค๋ฅผ ๊ตฌ์„ฑํ•˜์ž.ย 

์„ธ์…˜ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๋Š” Redis๋ฅผ ๊ตฌ์ถ•ํ•ด๋ณด์ž.ย 

์•„๋ž˜์™€ ๊ฐ™์ด docker๋กœ ๊ตฌ์„ฑํ•ด๋ณด์ž. ํŒจ์Šค์›Œ๋“œ๋ฅผ ์ง€์ •ํ–ˆ์Œ์„ ํ™•์ธํ•˜์ž.ย 

// docker-compose.yml 

services:
  redis:
    image: docker.io/bitnami/redis:7.4
    environment:
      # ALLOW_EMPTY_PASSWORD is recommended only for development.
      - ALLOW_EMPTY_PASSWORD=no
      - REDIS_PASSWORD=passw0rd
      - REDIS_DISABLE_COMMANDS=FLUSHDB,FLUSHALL
    ports:
      - '6379:6379'
    volumes:
      - 'redis_data:/bitnami/redis/data'

volumes:
  redis_data:
    driver: local

Express๋ฅผ ๊ตฌ์„ฑํ•˜์ž.ย 

express-session์œผ๋กœ ๊ตฌ์„ฑํ•œ๋‹ค.ย 

store์ •๋ณด๋งŒ redis๋กœ ์ œ๊ณตํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ mysql ๋ฐ ๋‹ค๋ฅธ ์Šคํ† ์–ด๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ๋„ ์‰ฝ๊ฒŒ ๊ฐ€๋Šฅํ•˜๋‹ค.ย 

redisClient๋ฅผ ๊ฐ€์ง€๋Š” RedisStore๋ฅผย  ์„ธ์…˜์˜ ํŒŒ๋ผ๋ฉ”ํ„ฐ๋กœ ์ฃผ์ž…๋˜๋Š” ๋ถ€๋ถ„์ด ํ•ต์‹ฌ์ด๋‹ค.ย 

import express from 'express';
import session from 'express-session';
import morgan from 'morgan';
import {RedisStore} from "connect-redis";  // ์ตœ์‹  ๋ฒ„์ „์€ `.default` ํ•„์š”  
import { createClient } from 'redis';

const redisClient = createClient({
    host: '127.0.0.1',
    port: 6379,
    password: 'passw0rd',  // Redis ๋น„๋ฐ€๋ฒˆํ˜ธ
});

redisClient.on('connect', () => console.log('๐Ÿš€ Redis ์—ฐ๊ฒฐ ์™„๋ฃŒ!'));
redisClient.on('error', (err) => console.error('โŒ Redis ์˜ค๋ฅ˜:', err));
redisClient.on('end', () => console.log('Redis ์—ฐ๊ฒฐ ์ข…๋ฃŒ') );
redisClient.connect(); 

let redisStore = new RedisStore({client:redisClient,prefix: 'oauth.session:'});

const app = express();

app.use(session({
  store: redisStore,
   secret: 'your-secret-key',  // ํ•„์ˆ˜!
   resave: false,
   saveUninitialized: false, 
   cookie: { secure: false, maxAge: 1000 * 60 * 60 }
}));

// ๋กœ๊น… 
morgan.token('headers', (req) => JSON.stringify(req.headers));
app.use(morgan(':method :url :status :res[content-length] - :response-time ms :headers'));

app.use(express.json());

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

app.get('/session',(req,res)=>{
    if (!req.session.views) req.session.views = 1;
    else req.session.views++;
    res.send(`Session View Cnt  ${req.session.views}`);
});

app.listen(8000,()=>{
    console.log("Server listening in http://localhost:8000")
});

curl ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด์„œ session์— ๊ฐ’์„ ์ƒ์„ฑํ•ด ๋ณธ๋‹ค.ย 

$ curl http://localhost:8000/session
Session View Cnt  1
$

Redis์— ์ ‘์†ํ•ด์„œ session์ •๋ณด๊ฐ€ Redis์— ์ €์žฅ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ด ๋ณธ๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์ด ์„ธ์…˜์ด ์ €์žฅ๋˜์—ˆ๊ณ  ๋งŒ๋ฃŒ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ์„ธ์…˜์ด ์‚ฌ๋ผ์งˆ ๊ฒƒ์ด๋‹ค.ย 

127.0.0.1:6379> keys *
1) "oauth.session:V3laDuWJRSLi0gX9xGzpEemdIi-y_YVC"
127.0.0.1:6379>
127.0.0.1:6379> get oauth.session:V3laDuWJRSLi0gX9xGzpEemdIi-y_YVC
"{\"cookie\":{\"originalMaxAge\":3600000,\"expires\":\"2025-02-23T08:04:25.048Z\",\"secure\":false,\"httpOnly\":true,\"path\":\"/\"},\"views\":13}"
127.0.0.1:6379>

๋งˆ์น˜๋ฉฐย 

Express ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ธ์…˜ ์Šคํ† ์–ด๋ฅผ Redis๋ฅผ ๊ฐ€์ง€๋„๋ก ๊ตฌํ˜„ํ•ด ๋ณด์•˜๋‹ค. ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ˆ˜ํ‰ํ™•์žฅํ•˜์—ฌ ๊ตฌ์„ฑ์„ ํ•˜๋”๋ผ๋„ ๋™์ผํ•œ ์„ธ์…˜ ์Šคํ† ์–ด์— ์กฐํšŒ,์ €์žฅ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ธ์…˜ ํฌ๋Ÿฌ์Šคํ„ฐ๋ง์ด ๊ตฌํ˜„๋˜์–ด์ง„๋‹ค.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published