Node.js에서 인증을 다시 작성하지 마세요 — Devise 영감을 받은 Auth Kit을 만들었습니다

발행: (2025년 12월 27일 오후 01:31 GMT+9)
6 min read
원문: Dev.to

Source: Dev.to

새로운 Node.js 백엔드를 시작할 때마다 인증은 프로젝트에서 가장 반복적이고 취약한 부분이 됩니다.
스택에 관계없이 나는 같은 작업을 계속해서 다시 작성하고 있습니다:

  • 사용자 등록 흐름
  • bcrypt를 이용한 비밀번호 해싱
  • JWT 생성 및 검증
  • 역할 기반 접근 제어
  • 인증 로직에 얽힌 데이터베이스‑특화 쿼리

수년간 API를 구축해 왔음에도 불구하고, 인증은 여전히 복사‑붙여넣기식 아키텍처처럼 느껴집니다 — 매번 조금씩 다르고, 결코 완벽하지 않으며, 내가 사용하는 데이터베이스나 ORM에 과도하게 결합되어 있습니다. 이러한 불만이 바로 제가 node-auth-kit을 만든 이유입니다.

npm: https://www.npmjs.com/package/node-auth-kit
GitHub: https://github.com/learningyogendra-netizen/node-auth-kit

Node.js 생태계의 “Auth Gap”

Node.js 생태계는 방대하지만, 인증은 보통 두 가지 극단 중 하나에 빠집니다:

  1. DIY 함정 – Passport.js와 같은 라이브러리는 강력하지만 매우 저수준이라 인증 로직이 컨트롤러, 서비스, 모델에 흩어져 있습니다.
  2. 블랙박스 함정 – 프레임워크와 SaaS 인증 제공자는 빠르게 동작하지만, 흐름을 커스터마이징하거나 데이터베이스를 마이그레이션하거나 데이터를 직접 제어해야 할 때, 락인된 것을 깨닫게 됩니다.

Ruby on Rails를 사용해 본 적이 있다면 Devise가 그리울 것입니다:

  • 강력한 기본값
  • 예측 가능한 구조
  • 필요할 때 확장 가능

저는 Node.js에서도 같은 Devise 철학을 원했습니다.

핵심 아이디어: 설계상 데이터베이스 독립성

대부분의 Node.js 인증 튜토리얼은 인증을 ORM 모델(Mongoose, Prisma 등)에 직접 넣도록 가르칩니다. 이는 작동하지만, 다음과 같은 상황이 생기면 문제가 됩니다:

  • 인증을 격리해서 테스트하기
  • 데이터베이스 교체하기
  • 프로젝트 간 로직 재사용하기

node-auth-kit어댑터 아키텍처를 사용해 다른 접근 방식을 취합니다:

  • Core engine – 인증 로직(비밀번호 규칙, JWT, 역할, 훅) 처리
  • Adapters – 데이터베이스 통신 처리

기본 데이터 저장소와 관계없이 인증 로직은 동일하게 유지됩니다.

실제 예시

컨트롤러를 직접 작성하는 대신, 인증 엔진을 설정합니다:

import {
  deviceAuth,
  mongooseAdapter,
  createAuthRouter,
} from 'node-auth-kit';

deviceAuth
  .init({
    authType: 'jwt',
    signupFields: ['email', 'password'],
    defaultRole: 'user',
    token: {
      accessTokenTtl: '1h',
    },
  })
  .useAdapter(
    mongooseAdapter({
      userModel: User,
    })
  );

app.use('/auth', createAuthRouter());

그게 전부입니다. 이제 다음 엔드포인트를 사용할 수 있습니다:

  • POST /auth/register
  • POST /auth/login
  • GET /auth/me

Boilerplate 없이 라우트 보호

라우트를 보호하는 것은 단순히 미들웨어입니다:

import { authenticate, authorize } from 'node-auth-kit';

app.get('/profile', authenticate, (req, res) => {
  res.json(req.user);
});

app.get('/admin', authenticate, authorize('admin'), (req, res) => {
  res.json({ message: 'Admin access granted' });
});

중복된 로직이 없습니다.

라이프사이클 훅 (과소평가된 기능)

node-auth-kit은 깔끔한 확장성을 위한 라이프사이클 훅을 지원합니다:

  • beforeRegister
  • afterRegister
  • beforeLogin
  • afterLogin

예시:

deviceAuth.registerHook('afterRegister', async (user) => {
  // send welcome email, log analytics, etc.
});

왜 오픈소스했는가

인증은 너무 중요한 요소라서 비공개 저장소에 숨겨진 코드로 남겨둘 수 없습니다. 모든 팀이 로그인 시스템을 처음 1~2일 동안 다시 구축하는 데 시간을 낭비하지 않아야 합니다. node-auth-kit은 Node.js 인증을 위한 공유되고 의견이 반영된 시작점을 만들기 위한 저의 시도입니다.

현재 상태 및 로드맵

  • ✅ JWT 인증
  • ✅ 역할 기반 인가
  • ✅ 어댑터 기반 DB 지원
  • ✅ 안정적인 Mongoose 어댑터
  • 🚧 Prisma 어댑터 (진행 중)
  • 🔜 리프레시 토큰
  • 🔜 다중 디바이스 세션
  • 🔜 비밀번호 재설정 및 이메일 인증

60초 안에 시작하기

npm i node-auth-kit

npm: https://www.npmjs.com/package/node-auth-kit
GitHub: https://github.com/learningyogendra-netizen/node-auth-kit

이것이 시간을 절약한다면, GitHub에 ⭐를 달아 주시면 프로젝트 성장에 큰 도움이 됩니다.

최종 생각

인증 재작성은 그만두세요.
제품을 만들기 시작하세요.

Back to Blog

관련 글

더 보기 »

실험적인 Hono auth npm 패키지

제가 만들고 있는 것은 개발자들이 일반적인 보일러플레이트인 login, register, JWT, email verification 등을 작성하지 않고도 앱에 바로 넣을 수 있는 auth 패키지입니다.