설명
요청이나 세션에서 가져온 사용자별 데이터를 모듈 전역 변수나 싱글턴 객체에 저장하면 프로세스 내 다른 요청이 같은 값을 공유할 수 있습니다.
같은 프로세스가 요청을 순차적으로 처리해도 사용자별 값이 공유 상태에 남을 수 있으므로, 이 문제는 멀티스레드 실행을 전제로 하지 않습니다.
잠재적 영향
- 이전 사용자의 식별자나 권한 정보가 다음 사용자에게 노출될 수 있습니다.
- 권한 판단이 다른 사용자의 상태로 잘못 수행될 수 있습니다.
해결 방법
- 요청별 데이터는 함수 로컬 변수, 요청 객체, 세션 저장소처럼 요청 범위가 분리된 위치에 저장하세요.
- 모듈 전역 변수와 싱글턴 객체에 사용자별 인증, 세션, 개인정보를 저장하지 마세요.
예시
변경 전
javascript
let currentUser;
app.get("/profile", (req, res) => {
currentUser = req.session.user;
res.json(currentUser);
});
변경 후
javascript
app.get("/profile", (req, res) => {
const currentUser = req.session.user;
res.json(currentUser);
});
설명:
- 변경 전: 사용자 값이 전역 상태에 남아 다른 코드나 이후 요청에서 참조할 수 있습니다. 표시된 동기 핸들러 자체는 대입 직후 같은 값을 반환하지만, 공유 상태를 재사용하거나 비동기 작업이 끼면 다른 사용자의 값이 섞일 위험이 있습니다.
- 변경 후: 해당 요청의 함수 로컬 변수만 사용합니다. 세션 미들웨어와 인증은 미리 구성되어 있어야 합니다.