블로그 목록

익스프레스 세션 기반 로그인 인증 미들웨어 구현과 권한 제어 절차

Node.js Express 환경에서 express-session 라이브러리를 사용해 로그인 상태를 유지하고, 보호된 라우트에 접근을 제어하는 인증 미들웨어 작성 및 세션 만료·로그아웃 처리 방법을 단계별로 정리합니다.

개발 익스프레스 세션 기반 로그인 인증 미들웨어 구현
익스프레스 서버 환경에서 세션 기반 로그인 인증 미들웨어를 설정하고 테스트하는 코드 화면

목표와 준비 사항: 세션 인증 구조 이해와 환경 구성

이번 실습의 목표는 Node.js와 Express 프레임워크를 기반으로 express-session 라이브러리를 연동하고, 특정 라우트에 비로그인 사용자가 접근하지 못하도록 차단하는 인증 미들웨어를 직접 구현하는 것입니다. HTTP 프로토콜은 본래 상태를 보존하지 않는 무상태(Stateless) 특성을 갖기 때문에, 사용자가 로그인한 뒤 연속적으로 요청을 보낼 때 신원을 유지하기 위한 세션과 쿠키 메커니즘이 필요합니다. 클라이언트는 로그인 성공 시 서버가 발급한 세션 ID를 쿠키로 보관하고, 이후 요청마다 이 쿠키를 함께 전송하여 본인을 식별합니다.

실습을 시작하기 전 Node.js(LTS 버전 권장)와 npm이 설치되어 있어야 합니다. 터미널에서 작업 폴더를 생성한 뒤 'npm init -y' 명령어로 package.json 파일을 만들고, 세션 관리에 필요한 패키지들을 설치합니다. 핵심 라이브러리인 'express'와 세션을 관리해 주는 'express-session'을 'npm install express express-session' 명령어로 설치하면 실습을 위한 최소한의 백엔드 실행 환경이 준비됩니다.

express-session 패키지 설치와 프로젝트 폴더 구조

실행 순서: 세션 미들웨어 등록과 인증 판별 함수 작성

본격적인 구현은 세션 미들웨어를 Express 애플리케이션에 등록하는 것부터 시작합니다. 서버 엔트리 포인트 파일(app.js 또는 index.js)에서 express-session을 불러온 뒤 app.use()로 미들웨어를 장착합니다. 이때 세션 암호화 키인 secret 값, 요청이 변경되지 않아도 세션을 다시 저장할지 결정하는 resave 옵션, 초기화되지 않은 빈 세션을 저장할지 제어하는 saveUninitialized 옵션을 설정합니다.

세션 등록이 완료되면 요청 객체(req)에 session 속성이 활성화됩니다. 다음 단계는 보호할 라우트 바로 앞에서 요청을 가로채 세션 유효성을 점검하는 사용자 정의 인증 미들웨어(isAuthenticated) 함수를 만드는 것입니다. 이 함수는 req.session 객체 내에 로그인 정보(예: userId)가 존재하는지 검사하고, 유효한 값이 있다면 next()를 호출하여 다음 컨트롤러로 제어권을 넘기며, 값이 없다면 401 권한 없음 에러나 로그인 안내 메시지를 반환합니다.

Express 세션 설정 옵션과 미들웨어 연결 구조도

구체적인 입력 예시: 로그인, 미들웨어, 보호 라우트, 로그아웃 코드

실제 코드로 애플리케이션의 동작 흐름을 구현해 봅니다. 가상의 회원 데이터로 로그인을 검증하고 세션을 생성하며, 보호된 마이페이지 라우트와 세션을 파기하는 로그아웃 라우트를 작성합니다. 본 예시는 동작 원리를 직관적으로 이해하기 위한 간소화된 구조입니다.

const express = require('express');
const session = require('express-session');
const app = express();

app.use(express.json());
app.use(session({
secret: 'dev-secret-key-1234',
resave: false,
saveUninitialized: false,
cookie: { httpOnly: true, maxAge: 1000 * 60 * 30 }
}));

const isAuthenticated = (req, res, next) => {
if (req.session && req.session.user) {
return next();
}
return res.status(401).json({ message: '로그인이 필요한 서비스입니다.' });
};

app.post('/api/login', (req, res) => {
const { username, password } = req.body;
if (username === 'testuser' && password === '1234') {
req.session.user = { id: 1, username: 'testuser' };
return res.json({ message: '로그인 성공' });
}
return res.status(400).json({ message: '계정 정보가 일치하지 않습니다.' });
});

app.get('/api/profile', isAuthenticated, (req, res) => {
res.json({ message: '접근 승인', user: req.session.user });
});

app.post('/api/logout', (req, res) => {
req.session.destroy((err) => {
if (err) return res.status(500).json({ message: '로그아웃 처리 실패' });
res.clearCookie('connect.sid');
return res.json({ message: '로그아웃 완료' });
});
});

app.listen(3000, () => console.log('Server running on port 3000'));

로그인 라우트와 인증 미들웨어 전체 구현 코드

기대 결과 확인: API 클라이언트를 통한 세션 쿠키 검증

작성한 서버를 실행한 뒤 curl이나 Postman, 또는 브라우저 개발자 도구를 사용해 단계별로 결과를 검증합니다. 먼저 로그인하지 않은 상태에서 'GET /api/profile' 요청을 전송합니다. 서버는 isAuthenticated 미들웨어에 걸려 HTTP 상태 코드 401과 함께 '로그인이 필요한 서비스입니다.'라는 JSON 응답을 반환해야 정상입니다.

이어서 'POST /api/login' 엔드포인트로 JSON 본문에 testuser 계정 정보를 담아 요청을 전송합니다. 정상적으로 성공 응답이 내려오면 응답 헤더의 'Set-Cookie' 항목에 'connect.sid'라는 세션 식별자가 쿠키로 발급된 것을 확인할 수 있습니다. API 클라이언트에서 이 세션 쿠키를 포함한 상태로 다시 'GET /api/profile'을 호출하면 이번에는 200 응답과 함께 사용자 세션 정보가 정상적으로 출력됩니다. 마지막으로 'POST /api/logout'을 호출하면 세션 저장소에서 데이터가 파기되고 쿠키가 삭제되어 다시 마이페이지 접근이 차단되는지 확인합니다.

Set-Cookie 응답 확인과 401 권한 차단 테스트 결과

주의점: 메모리 스토어 한계와 실무 보안 체크리스트

express-session을 실무 프로젝트에 배포할 때는 몇 가지 치명적인 주의점을 반드시 확인해야 합니다. 기본 설정으로 제공되는 세션 저장소는 Node.js 프로세스의 메모리를 직접 사용하는 'MemoryStore' 방식입니다. 이는 서버 프로세스가 재시작되거나 장애로 꺼지면 모든 사용자의 로그인 상태가 즉시 사라진다는 치명적인 약점이 있습니다. 또한 PM2 클러스터 모드나 다중 인스턴스 서버 환경에서는 인스턴스 간 세션 공유가 불가능하므로, 실제 운영 환경에서는 Redis나 데이터베이스 기반의 외부 세션 스토어(예: connect-redis, connect-mongo)를 필히 연동해야 합니다.

보안 옵션도 철저히 관리해야 합니다. 세션 쿠키 탈취를 방지하기 위해 cookie 설정 객체에서 'httpOnly: true'를 지정하여 자바스크립트를 통한 document.cookie 접근을 원천 차단해야 합니다. HTTPS 환경으로 배포할 때는 'secure: true'를 활성화하여 암호화된 통신에서만 쿠키가 전송되도록 강제하고, 교차 사이트 요청 위조(CSRF) 공격을 방어하기 위해 'sameSite' 옵션을 'lax' 또는 'strict'로 명시하는 것이 안전합니다.

운영 환경을 위한 Redis 세션 스토어와 보안 쿠키 옵션
조회 17
One&One 상담 이 글의 주제를 우리 업무에 적용하고 싶다면

업무자동화, 홈페이지 제작, 네이버 자동화까지 필요한 흐름을 카카오톡 오픈채팅에서 바로 상담해 드립니다.

  • 실무 적용 방향 정리
  • 자동화·홈페이지·네이버 연계 상담
  • 1:1 오픈채팅 빠른 응답
카카오톡 오픈채팅 상담 업무자동화 원앤원 · 모바일/PC 모두 참여 가능