설명
웹 요청이나 세션에서 가져온 사용자별 데이터를 클래스 변수에 저장하면 프로세스 내 다른 요청과 인스턴스가 같은 값을 공유할 수 있습니다.
같은 프로세스가 요청을 순차적으로 처리해도 사용자별 값이 공유 상태에 남을 수 있으므로, 멀티스레드가 아니어도 문제가 발생할 수 있습니다.
잠재적 영향
- 이전 사용자의 식별자나 권한 관련 값이 다음 사용자에게 노출될 수 있습니다.
- 요청 간 상태 오염으로 잘못된 권한 판단이 발생할 수 있습니다.
해결 방법
- 요청별 데이터는 함수 로컬 변수, 요청마다 새로 생성하는 인스턴스, 사용자별 세션 저장소처럼 범위가 분리된 위치에 저장하세요.
- 클래스 변수와 모듈 전역 변수에 사용자별 인증, 세션, 개인정보를 저장하지 않습니다.
예시
변경 전
python
class UserDescription:
user_name = ""
def update_description(request):
UserDescription.user_name = request.POST.get("name")
변경 후
python
class UserDescription:
def __init__(self, user_name):
self.user_name = user_name
def update_description(request):
return UserDescription(request.POST.get("name"))
설명:
- 변경 전: 웹 요청이나 세션에서 가져온 사용자별 데이터를 클래스 변수에 저장하면 프로세스 내 다른 요청과 인스턴스가 같은 값을 공유할 수 있습니다.
- 변경 후: 요청마다 새 인스턴스를 생성하여 값을 분리합니다. 같은 인스턴스를 여러 사용자에게 공유하면 인스턴스 변수도 데이터를 격리하지 못합니다.