[시큐어코딩 가이드] 2-6-1. 잘못된 세션에 의한 데이터 정보 노출

캡슐화

중요한 데이터 또는 기능성을 불충분하게 캡슐화하거나 잘못 사용함으로써 발생하는 보안약점으로 정보노출, 권한 문제 등이 발생할 수 있다.

 

잘못된 세션에 의한 데이터 정보 노출

정의

다중 스레드 환경에서는 싱글톤(Singleton) 객체 필드에 경쟁조건이 발생할 수 있습니다. 따라서 다중 스레드 환경에서는 정보를 저장하는 전역변수가 포함되지 않도록 코드를 작성하여 서로 다른 세션에서 데이터를 공유하지 않도록 해야 합니다.

 

안전한 코딩기법

싱글톤 패턴을 사용하는 경우, 변수 범위에 주의를 기울여야 합니다. 특히 다중 스레드 환경에서 클래스 변수의 값은 하위 메소드와 공유되므로 필요한 경우 인스턴스 변수로 선언하여 사용해야 합니다.

 

코드예제

다음은 안전하지 않은 코드예제입니다. 다중 스레드 환경에서 파이썬 클래스 변수는 스레드 간 서로 공유하게 되는데, 클래스 변수에 값을 할당할 경우 서로 다른 세션 간에 데이터가 공유되어 의도하지 않은 데이터가 전달될 수 있습니다.

#잘못된 세션에 의한 데이터 정보 노출(안전X)
class UserDescription:
    user_name = ''

    def get_user_profile(self):
        result = self.get_user_discription(UserDescription.user_name)
        ...
        return result

    def show_user_profile(self, request):
        UserDescription.user_name = request.POST.get('name',)
        self.user_profile = self.get_user_profile()
        return render(request, 'success.html', {'msg': self.user_profile})

 

다음은 안전한 코드예제로, 공유가 금지된 변수는 인스턴스 변수로 선언하여 세션 간에 공유되지 않도록 해야 합니다.

#잘못된 세션에 의한 데이터 정보 노출(안전O)
class UserDescription:
    user_name = ''

    def get_user_profile(self):
        result = self.get_user_discription(UserDescription.user_name)
        ...
        return result

    def show_user_profile(self, name):
        self.user_name = request.POST.get('name',)
        self.user_profile = self.get_user_profile()

        return render(request, 'success.html', {'msg': self.user_profile})

 

 

 

캡슐화/잘못된 세션에 의한 데이터 정보 노출

[참고문헌] Python 시큐어코딩 가이드(2022) / KISA(한국인터넷진흥원)