2014-08-27 6 views
2

이전 작업 (ASP.NET webforms)에서 HttpContext.Current.Session 개체를 사용하여 현재 사용자 세션에 대한 보안 관련 사용자 데이터를 보관했습니다.webforms 세션 값을 MVC 베어러 토큰에 저장해야합니까?

Session("userID") = 4525 
Session("customerId") = 123 
Session("importantValue") = "ABC" 

WebAPI 2에서 상당히 많은 것을 배웠으므로 이제 MVC를 배우기 시작합니다. 나는 끊임없이

Synchronization and overhead

  • Session pollutes HTTP
  • Application collision
  • AppPool recycling
    1. Session 그 및/또는 HttpContext.Current이 MVC로 피해야한다 읽고 ... ...하지만이 아니다 있어요 간단한 대안에 선명도가 많이. 어떤 사람들은 TempData을 사용한다고 말하지만 다른 쿠키는 단점을 가지고 있습니다.

      내 응용 프로그램이 데이터베이스가 많아서 모든 요청에 ​​대해이 값을 다시 읽으려면 데이터베이스에 손을 대지 않는 것이 좋습니다. WebAPI2에는 쿠키로 직렬화되는 전달자 토큰이 있습니다. Identity 토큰이이 데이터를 보관할 수있을만큼 안전하고 사용자 조작 (SSL을 통해 사용되는 경우)을 방지합니까?

    +1

    이것은 개발자의 다양한 "취향"으로 인해 쉬운 질문이 아닙니다. 만약 당신이 무엇을하고 있는지 안다면,'Session' 객체를 사용할 때 아무런 해가 없습니다. –

    +0

    지금까지 세션을 사용하지 말아야한다고 주장하는 출처로 링크하십시오. 고려해야 할 사항이 있지만 결코 절대로 말하는 것은 아닙니다. 해당 출처가 세션을 사용하지 않아야하는 이유를 유발하지 않으면 계속해서 읽지 마십시오. 특정 시나리오에서 세션을 사용하지 않아야하는 이유는 완벽하지만 그 시나리오가 귀하에게 적용되는지 평가하는 것은 귀하에게 달려 있습니다. – CodeCaster

    +0

    "세션 하이재킹"이 반복되는 이유. 그러나 약간의 비틀기와 함께 이것은 완전히 제거 될 수 있습니다. 또 다른 것은 저장해야하는 데이터의 양입니다. 수백 메가 바이트에 이르는 데이터를 가지고 있다면 기존 캐시 메커니즘을 사용하는 것이 좋습니다. –

    답변

    2

    남자, "세션 대신에 TempData 사용"아이디어가 어디서 왔는지 모르겠지만 소스를 추적하고 둔탁한 개체로 쳤습니다. TempData 세션입니다. 후드 아래에서 세션 저장소를 사용합니다. 유일한 차이점은 당신이 거기에 둔 데이터가 다음 요청에 대해서만 살아남을 것이며, Session에 위치한 데이터는 세션이 만료 될 때까지 살아남는다는 것입니다. 그렇지 않으면 은 정확히 동일한 것입니다..

    그런데이 문제를 둘러싼 논쟁이 많으며 많은 부분이 잘못되어 혼란이 더욱 심해질 것입니다. 논쟁의 요지는 세션이 꽤 끔찍한 일이라는 것입니다. 그러나 국가의 개념을 추가해야하는 경우에는 대안이 없습니다.

    HTTP를 프로토콜로 사용하는 경우 무국적입니다. 각 요청은 이전 또는 이후 다른 요청의 영향을받지 않는 고유 한 엔터티입니다. 웹 API는 언급 한 이후 REST의 지침에 따라 세션을 사용하지 않으므로 "REST 호환"이라고합니다. 그리고 REST는 HTTP 이후에 모델링되며 상태도 저장되지 않습니다. 그러나 이것은 결국 실생활이며 인증 요청과 같은 작업을 수행해야합니다. 결과적으로 auth 토큰 같은 것들은 요청 쿼리 문자열이나 본문 또는 HTTP 헤더를 통해 전송됩니다. 전통적인 세션은 거의 같은 방식으로 작동하므로 여전히 "세션"이라고 주장합니다. 요청, 세션 ID가있는 "토큰"을 전달하고 서버가이를 사용하여 사용자를 동일한 클라이언트로 인식합니다. 이전 요청

    사람들이 세션에 대해 논쟁을 할 때 세션 자체에 대한 논쟁이 아니라 세션 자체의 개념에 대해 논쟁하는 것이 아니라 실제로 사용/남용되는 방식에 대해서도 말합니다. 다시 논쟁.

    다른 사람들은 세션 대신 Redis 나 다른 NoSQL 옵션을 사용하는 것이 좋다고 주장했지만, 세션이 아니라 세션 에 대해서 논쟁하고 있습니다.

    개인적으로 을 사용하는 한, MVC 프로젝트에서 Session을 사용하는 데는 아무런 문제가 없습니다. 그것은 인증 된 사용자와 같은 것들에 대한 상태를 만들기에 좋습니다. 사이트에서 새 페이지를 요청할 때마다 다시 로그인해야 할 필요가 있습니다. 그것 이외에, 나는 꽤 많이 혼자두고 간다. 실제로는 이 여러 요청에 걸쳐 유지되어야하는 몇 가지 사항이 있습니다.

    +0

    대단한 답변입니다. 감사합니다. 마지막 포인트를 만지면,'User.Identity.Name' 또는'Role' 이외에'Session'에서 어떤 유형의 것들이 있어야할까요? 쿠키 기반 인증 토큰은 해킹 당할 염려없이 클라이언트 장치에 저장할 수있을만큼 강력합니다 (ASP.NET 쿠키는 AES가 SSL을 통해서만 전달되는 것으로 생각됩니다). – EvilDr

    +1

    저는 개인적으로 전자 상거래 상황에서 "프로모션"코드를 저장하는 데 사용한 적이있는 한 가지 예입니다. 사용자가 프로모션 코드가있는 링크에서 온 경우 사용자가 체크 아웃 할 때 적용되도록 세션에 저장합니다. 나는 정직하게'Session'을 명시 적으로 (인증을 통한 암묵적인 사용을 제외하고) 사용했던 다른 많은 예를 생각할 수 없다. 사용법이 얼마나 희귀한지 알려줄 것이다. –