Node.js에서 인증을 다시 작성하지 마세요 — Devise 영감을 받은 Auth Kit을 만들었습니다
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 생태계는 방대하지만, 인증은 보통 두 가지 극단 중 하나에 빠집니다:
- DIY 함정 – Passport.js와 같은 라이브러리는 강력하지만 매우 저수준이라 인증 로직이 컨트롤러, 서비스, 모델에 흩어져 있습니다.
- 블랙박스 함정 – 프레임워크와 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/registerPOST /auth/loginGET /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은 깔끔한 확장성을 위한 라이프사이클 훅을 지원합니다:
beforeRegisterafterRegisterbeforeLoginafterLogin
예시:
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에 ⭐를 달아 주시면 프로젝트 성장에 큰 도움이 됩니다.
최종 생각
인증 재작성은 그만두세요.
제품을 만들기 시작하세요.