저는 회사의 프로젝트 중 상당수에서 나타난 디자인 패턴을보고 있습니다. 역사적으로 올바르게 기능했지만, 다른 개발자들도이 패턴을 사용하여 세션 손상 가능성을 제기한다고 들었습니다. 스택 오버플로에 대한 다른 .NET 개발자의 통찰력을 찾고 있습니다.이 ASP.NET 세션 액세스 기술은 다중 사용자에게 안전합니까?
기본적으로 클래스는 주로 static
또는 싱글 톤 패턴이며, 주로 개발자가 작성한 내용에 따라 App_Code
에 저장됩니다.
이 클래스는 속성을 통해 현재 세션에 대한 액세스를 캡슐화합니다. (클래스가 싱글 일 때이 정적되지 않습니다.)
public static class SessionHelper
{
public static string SessionValue
{
get
{
object o = HttpContext.Current.Session["sessionValueName"];
if (o == null)
{
// Replace the following with code to store & retrieve
// a default value of the appropriate datatype.
o = string.Empty;
HttpContext.Current.Session["sessionValueName"] = o;
}
return o.ToString(); // or cast, ensure cast is valid & return.
}
set
{
HttpContext.Current.Session["sessionValueName"] = value;
}
}
// Other properties, strongly-typed, as above.
}
내가 과거에 웹 사이트의 정적 데이터, 주로 정적 때문에 문제를 보았다
: 이러한 속성 모두의 형태를 취할 데이터는 세션 당 상태를 유지하는 데 사용되었습니다. (예를 들어, 정적으로 선언 된 "사용자 별"코드 숨김 멤버를 보았습니다. 내 코드가 아 닙니다. 내 팀은 그 혼란을 쓴 회사의 정리 대원이었습니다.)
그러나, 이것은 HttpContext.Current.Session
에 대한 정적 인 항목 일 뿐이므로 클래스가 Session
속성에 캡슐화 된 것과 근본적으로 다른 것은 아니므로 안전해야합니다. 앞에서 말했듯이,이 패턴을 사용하는 회사는 다른 사이트에서는 전혀 문제가없는 것으로 나타났습니다. 여기에는 꽤 크고 활동적인 사용자베이스가 포함되어 있습니다. 그러나 나는 새로운 관점을 얻고 싶습니다.
잠재적으로 다중 사용자 문제, 경쟁 조건 또는 위의 패턴으로 세션 손상을 일으킬 수있는 다른 결함/결함이 있습니까?
+1 나는 생각합니다. 우리는 일반적으로 같은 페이지에 있습니다. 나는 이것이 분리 된 클래스라는 것을 분명히하지 못했고 모든 세션 액세스가이 클래스를 통과하기 때문에 하드 코딩 된 키만이 클래스에서 사용됩니다. 내 질문 텍스트를 적절하게 업데이트 할 것입니다. 그러나, 나는 독창적 인 object-in-session 아이디어와 비슷합니다. :) –
흠 ... 나는이 접근법을 정말로 좋아하지 않는다. 즉, 하나의 세션 항목에 액세스 할 때마다 모든 것을 얻거나 설정하고 있다는 뜻입니다. 이것은 세션 공급자에 따라 비용이 많이 드는 작업 일 수 있습니다. – Bryan
@ 브라이언 : 좋은 지적입니다! 그러나 일반적으로 우리는 세션 상태를 가능한 한 작게 유지하려고 노력하며, 20 개의 값을 포함하는 하나의 객체를 얻는 것과 (또는 내 접근법 에서처럼) 5 또는 10 개의 값을 개별적으로 얻는 것의 차이는 크지 않을 것입니다. – M4N