Node.js API에서 우발적인 비밀번호 유출을 방지하는 방법 🛡️
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를 사용하면 비밀번호가 우연히 노출되는 것을 방지하는 간단하고 신뢰할 수 있는 방법을 제공한다. 여러분은 이 패턴을 이미 적용하고 있나요, 아니면 아직도 응답에서 비밀번호를 수동으로 제거하고 있나요? 댓글로 알려 주세요! 👇