一覧へ戻る

TypeScript, Express-session 을 이용한 로그인 처리 (1)

TypeScript와 Express-session 기반 로그인 구현의 1편으로 개념과 초기 세팅 과정을 다룹니다.
TypeScript
Express
Session
Login
Backend
2021-09-085 min read

TypeScript와 Express-session으로 로그인 처리하기 (1): 안전한 세션 설정

세션은 로그인 여부를 저장하는 편의 기능이 아니라 인증 경계입니다. 개발 서버에서 보였던 기본 설정을 운영 환경에 그대로 두면 세션 탈취, 불필요한 쿠키 발급, 서버 재시작 시 로그인 손실 같은 문제가 생길 수 있습니다.

세션 저장소와 비밀값

기본 MemoryStore는 개발 확인용입니다. 운영에서는 Redis 또는 데이터베이스 기반 저장소를 사용하고, SESSION_SECRET은 코드가 아니라 환경 변수 또는 비밀 관리 도구에서 공급하세요.
import session from "express-session";

const sessionSecret = process.env.SESSION_SECRET;
if (!sessionSecret) {
  throw new Error("SESSION_SECRET is required");
}

const isProduction = process.env.NODE_ENV === "production";

app.use(
  session({
    name: "sid",
    secret: sessionSecret,
    resave: false,
    saveUninitialized: false,
    store: sessionStore,
    cookie: {
      httpOnly: true,
      sameSite: "lax",
      secure: isProduction,
      maxAge: 1000 * 60 * 60 * 8,
    },
  }),
);
  • saveUninitialized: false는 로그인 전의 빈 세션 쿠키를 만들지 않습니다.
  • httpOnly는 클라이언트 JavaScript의 쿠키 접근을 막고, sameSite는 CSRF 위험을 낮춥니다.
  • secure: true는 HTTPS에서만 사용해야 합니다. TLS 종료 프록시 뒤라면 Express trust proxy 설정도 함께 검토하세요.

세션에 저장할 값

세션에는 이메일, 닉네임, 권한 목록처럼 클라이언트가 보낸 프로필 전체를 저장하지 말고 검증된 최소 식별자만 저장하세요. 다음 편에서 비밀번호 검증 후 세션 ID를 재발급하는 흐름을 다룹니다.
declare module "express-session" {
  interface SessionData {
    userId?: string;
  }
}