Node.js API에서 우발적인 비밀번호 유출을 방지하는 방법 🛡️

발행: (2026년 2월 23일 오전 04:36 GMT+9)
3 분 소요
원문: Dev.to

Source: Dev.to

The Problem

인증 시스템을 구축할 때, 사용자의 해시된 비밀번호가 API 응답에서 프런트엔드로 실수로 노출되지 않도록 보장해야 합니다.
전통적인 방법은 응답을 보내기 전에 비밀번호를 수동으로 제거하는 것입니다:

delete user.password;

⚠️ 문제점: 새로운 엔드포인트(예: 새로 만든 /profile 라우트)에서 이 단계를 잊어버리기 쉬워서 대규모 데이터 유출이 발생할 수 있습니다.

Secure Schema Definition (Mongoose)

Mongoose(MongoDB)를 사용한다면 스키마 레벨에서 비밀번호 필드를 숨기는 것을 강제할 수 있습니다:

const mongoose = require('mongoose');

const UserSchema = new mongoose.Schema({
  email: {
    type: String,
    required: true
  },
  password: {
    type: String,
    required: true,
    select: false // 👈 The secret sauce!
  }
});

select: false를 설정하면 User.findById(id)와 같은 일반 쿼리에서도 자동으로 비밀번호 해시가 제외되어 기본적으로 보안이 확보됩니다.

Explicitly Requesting the Password for Validation

비밀번호가 필요할 때(예: 로그인 과정)에는 쿼리에서 명시적으로 요청합니다:

// 1. Explicitly request the password for validation
const user = await User.findOne({ email }).select('+password');

// 2. Now you can safely compare it
const isMatch = await bcrypt.compare(inputPassword, user.password);

로그인 기능에서만 비밀번호 필드를 포함시키므로 실수로 데이터가 유출되는 위험을 차단합니다.

Conclusion

Mongoose 스키마에 select: false를 사용하면 비밀번호가 우연히 노출되는 것을 방지하는 간단하고 신뢰할 수 있는 방법을 제공한다. 여러분은 이 패턴을 이미 적용하고 있나요, 아니면 아직도 응답에서 비밀번호를 수동으로 제거하고 있나요? 댓글로 알려 주세요! 👇

0 조회
Back to Blog

관련 글

더 보기 »

OAuth란 무엇인가?

배경: X(구 Twitter)에서 최근 질문이 있었는데, “Matt Levine 스타일”로 OAuth가 어떻게 작동하는지, 그리고 더 중요한 것은 왜 그렇게 설계되었는지에 대한 설명을 요청했습니다.