본문 바로가기
JavaScript/Node

[Node] session

by kwh_coding 2024. 7. 24.

자바에서 비교적 편리하게 세션과 쿠키를 다뤘던 경험과 다르게 Node 환경에서 session을 다뤄보는 것은 처음이기도 했고

구조도 달라서 꽤나 애를 먹었다.

 

따라서, 기록을 해놔야 겠다는 생각이 들었다.

 


 

1. session 설치

npm install express-mysql-session
npm install express-session

 

express-session 만으로는 세션 저장 여부를 확인할 수 없기 때문에 

express-mysql-session 을 사용해서 세션의 저장소를 함께 사용해 주어야 한다.

 

2. session 설정

app.use(
    session({
        secret: 'custom-secret',
        resave: false,
        saveUninitialized: false,
        store: sessionStore,
        cookie: {
            secure: false,
            httpOnly: true,
            maxAge: 24 * 60 * 60 * 1000,
        },
    })
);

 

각 옵션의 역할

 

secret:

 

  • 세션 데이터를 암호화하기 위한 비밀 키. 이 키는 세션 ID를 해싱하는 데 사용되며, 외부에 노출되지 않도록 해야 한다.

 

resave: 

  • 세션이 수정되지 않았더라도 세션을 다시 저장할지 여부를 설정한다. false로 설정하면, 세션이 변경되지 않은 경우 저장을 하지 않는다.

 

saveUninitialized:

  • 초기화되지 않은 세션을 저장할지 여부를 설정한다. false로 설정하면, 새로 생성된 세션이 초기화되기 전까지는 저장하지 않는다.

 

store: 

  • 세션을 저장할 스토리지 객체를 설정한다. 여기서는 sessionStore로 세션을 저장할 저장소를 정의한다. 일반적으로 데이터베이스나 메모리 스토어를 사용한다.

 

cookie: { ... }

  • 세션 쿠키의 속성을 정의한다.
  • secure: HTTPS에서만 쿠키를 전송할지 여부를 설정한다. false로 설정하면 HTTP에서도 쿠키를 전송한다. 실제 배포 시에는 true로 설정하는 것을 권장.
  • httpOnly: JavaScript에서 쿠키에 접근할 수 없도록 설정한다.
  • maxAge: 쿠키의 유효 기간을 설정한다. 여기서는 24시간(밀리초 단위)으로 설정되어 있다.\

 

 

다음은 MySQL session 설정이다.

const mysqlOptions = {
    host: '',
    port: 3306,
    user: '',
    password: '',
    database: '',
    connectionLimit: 10,
};

const connection = mysql.createPool(mysqlOptions);

const sessionStore = new MySQLStore(
    {
        expiration: 24 * 60 * 60 * 1000,
        createDatabaseTable: true,
        schema: {
            tableName: 'sessions',
            columnNames: {
                session_id: 'session_id',
                expires: 'expires',
                data: 'data',
            },
        },
    },
    connection
);

app.locals.sessionStore = sessionStore;

 

const mysqlOptions = { ... }

  • MySQL 데이터베이스에 연결하기 위한 옵션들을 정의한다.
    • host: 데이터베이스 서버의 호스트 주소이다. 로컬 환경에서 개발을 한다면 localhost.
    • port: 데이터베이스 서버의 포트 번호이다. MySQL의 기본 포트는 3306.
    • user: 데이터베이스 사용자 이름이다.
    • password: 데이터베이스 사용자의 비밀번호이다.
    • database: 연결할 데이터베이스의 이름이다.
    • connectionLimit: 최대 연결 수이다.

 

const connection = mysql.createPool(mysqlOptions);

  • MySQL 데이터베이스 연결 풀을 생성한다.
    • mysql.createPool(mysqlOptions): 주어진 옵션들로 MySQL 연결 풀을 생성한다.

 

const sessionStore = new MySQLStore({ ... }, connection);

  • 세션을 MySQL 데이터베이스에 저장하기 위한 세션 스토어를 생성한다.
    • expiration: 세션의 만료 시간을 밀리초 단위로 설정한다. 
    • createDatabaseTable: true로 설정하면 세션 테이블이 존재하지 않을 경우 자동으로 생성한다.
    • schema: 세션 테이블의 스키마를 정의한다.
      • tableName: 세션 테이블의 이름을 정의한다. 
      • columnNames: 세션 테이블의 각 컬럼의 이름을 정의한다.
        • session_id: 세션 ID를 저장하는 컬럼의 이름.
        • expires: 세션 만료 시간을 저장하는 컬럼의 이름.
        • data: 세션 데이터를 저장하는 컬럼의 이름.
    • connection: MySQL 연결 풀을 사용하여 데이터베이스에 연결한다.

 

app.locals.sessionStore = sessionStore;

  • 생성된 세션 스토어를 Express 애플리케이션의 로컬 변수로 설정한다. 
    • app.locals: Express 애플리케이션의 로컬 변수를 저장하는 객체.
    • sessionStore: MySQL 세션 스토어 객체.

 

3. session 사용 예제

기본적으로 session은  로그인에서 많이 사용된다.

 

router.post('/logout', (req, res) => {
    const session_id = req.sessionID; 
    console.log(req.sessionID);
    req.session.destroy((err) => {
        if (err) {
            return res.status(500).json({ error: '로그아웃 실패' });
        }

        const sessionStore = req.app.locals.sessionStore; 
        sessionStore.destroy(session_id, (err) => {
            if (err) {
                console.error('세션 삭제 에러:', err);
                return res.status(500).json({ error: '세션 삭제 에러' });
            }
            res.json({ success: true });
        });
    });
});

 

session_id 변수에 세션에 저장된 sessionID를 넣는다. (DB 세션테이블에 저장된 session_id 컬럼값)

console.log(req.sessionID); 는 테스트용으로 잘 출력되나 적었던 코드임 ㅋㅋ

다음엔 sessionStore에 로컬변수로 저장한 sessionStore를 가져온다.
그리고 destroy를 해주면 해당 데이터값이 삭제된다.

 

'JavaScript > Node' 카테고리의 다른 글

[Node] Socket.io 활용 WebRTC  (0) 2024.08.24
[Node] 암호화(feat. bcrypt)  (0) 2024.07.25
[Node] Node.js?  (2) 2024.07.17