ASP.NET에서 언제 Session.Abandon () 대신 Session.Clear ()를 사용해야합니까?


118

Session.Clear () 및 Session.Abandon () 모두 세션 변수를 제거합니다. 내가 알기로 Abandon ()은 현재 세션을 종료하고 새 세션이 생성되어 End 및 Start 이벤트가 발생합니다.

사용자 로그 아웃과 같은 대부분의 경우 Abandon ()을 호출하는 것이 좋습니다. 대신 Clear ()를 사용하는 시나리오가 있습니까? 성능 차이가 많이 있습니까?

답변:


172

Session.Abandon() 세션을 파괴 하고 이 Session_OnEnd 이벤트가 트리거됩니다.

Session.Clear()단지 모든 값을 제거 개체에서 (내용을). 동일한 키를 가진 세션은 여전히 ​​살아 있습니다.

따라서을 사용 Session.Abandon()하면 특정 세션이 손실되고 사용자는 새 세션 키를 받게됩니다. 예를 들어 사용자가 로그 아웃 할 때 사용할 수 있습니다.

를 사용하여 Session.Clear(), 사용자가 (당신이 예를 들어 다시 로그인 사용자를 원하지 않는 경우) 동일한 세션에 남아있는 모든 세션 특정 데이터를 다시 설정합니다.


1
"Darin Dimitrov"가 여기에서 제안했듯이 Clear () 대신 RemoveAll ()을 사용하는 것이 더 좋다고 생각합니다. stackoverflow.com/a/3931344/713246
Bibhu

4
@Bibhu : 그는 RemoveAll ()이 Clear ()보다 낫다고 어떻게 제안 했습니까? 그의 대답에서 내가 본 것은 RemoveAll ()이 Clear ()를 호출하고 기능적으로 동일하다는 것입니다.
Adam Miller

1
그냥 사용하는 Session.Abandon()사용자가 다시 인증 (크롬, FF)을 가지고 있지 않았지만, 배치 세션 내 요구 사항을 충족 발급 새로운 하나 - Windows 인증을 사용하는 내부 응용 프로그램에 '로그 아웃'으로
brichins

13

사용자가 로그 아웃 할 때만 Session.Clear ()를 사용하면 보안 허점이 발생할 수 있습니다. 세션은 웹 서버에 관한 한 여전히 유효합니다. 그런 다음 스니핑하고 세션 ID를 가져와 해당 세션을 탈취하는 것은 합리적으로 사소한 문제입니다.

이러한 이유로 사용자를 로그 아웃 할 때 Session.Abandon ()을 사용하는 것이 더 안전하고 현명하여 세션이 파괴되고 새 세션이 생성됩니다 (로그 아웃 UI 페이지가 새 세션의 일부가 되더라도, 새 세션에는 사용자 세부 정보가 없으며 새 세션을 하이재킹하는 것은 새 세션을 갖는 것과 동일하므로 음소거됩니다.)


4
빈 세션을 하이재킹하는 이유는 무엇입니까? 납치범은 여전히 ​​로그인해야하며, 새로운 사용자에게 실수로 제공 할 데이터가 없습니다.
2008

3

Session.Abandon위에서 언급 한대로 세션을 파괴하므로 누군가 로그 아웃 할 때 이것을 사용해야합니다. Session.Clear전자 상거래 웹 사이트의 쇼핑 바구니를 사용하는 것이 좋습니다 . 이렇게하면 사용자를 로그 아웃하지 않고도 바구니가 지워집니다.


하지만 Session.Abandon특정 장바구니를 지우는 데 사용 하면 어떻게됩니까?
WTFZane

0

이 문제가 있었고 둘 다 시도했지만 "pageEditState"와 같은 쓰레기를 제거하는 데 만족해야했지만 다시 찾아 보지 않도록 사용자 정보를 제거하지 않았습니다.

public static void RemoveEverythingButUserInfo()
{
    foreach (String o in HttpContext.Current.Session.Keys)
    {
        if (o != "UserInfoIDontWantToAskForAgain")
            keys.Add(o);
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.