문제

웹 애플리케이션을 생성할 때 단일 사용자를 나타내는 User 객체가 있다고 가정할 때, 사용자가 로그인한 정보를 저장하는 가장 좋은 방법은 무엇이라고 생각하시나요?

제가 생각한 두 가지 방법은 다음과 같습니다.

  • 세션 변수에 사용자 데이터베이스 ID를 저장했습니다.
  • 전체 사용자 개체를 세션 변수에 저장했습니다.

더 나은 제안이나 위의 방법을 사용하는 데 문제가 있습니까?보안 문제나 메모리 문제 등이 있을 수 있습니다.

도움이 되었습니까?

해결책

객체보다는 ID를 저장하는 것이 좋습니다.단점은 해당 사용자의 정보를 얻으려고 할 때마다 데이터베이스에 접속해야 한다는 것입니다.그러나 페이지의 모든 밀리초가 중요하지 않은 한 성능은 문제가 되지 않습니다.여기에는 두 가지 장점이 있습니다.

  1. 사용자 정보가 어떻게든 변경되면 세션에 오래된 정보가 저장되지 않습니다.예를 들어 관리자가 사용자에게 추가 권한을 부여한 경우 사용자가 로그아웃했다가 다시 로그인할 필요 없이 해당 권한을 즉시 사용할 수 있습니다.

  2. 세션 정보가 하드 드라이브에 저장되어 있으면 직렬화 가능한 데이터만 저장할 수 있습니다.따라서 사용자 개체에 데이터베이스 연결, 열린 소켓, 파일 설명자 등과 같은 항목이 포함된 경우 이는 제대로 저장되지 않으며 제대로 정리되지 않을 수도 있습니다.

대부분의 경우 이러한 우려는 문제가 되지 않으며 어느 접근 방식이든 괜찮습니다.

다른 팁

보안을 위해 세션 ID(GUID 또는 암호학적으로 안전한 RNG)를 생성하고 세션 ID를 사용자 ID에 매핑하는 테이블을 갖겠습니다.그런 다음 세션 ID를 쿠키에 저장하고 사용자 ID에 대한 프록시 역할을 하도록 합니다.

|Session |UserID |
|--------+-------|
|a1d4e...+ 12345 |
|--------+-------|
|c64b2...+ 23456 |
|--------+-------|

이를 통해 누구도 자신의 ID를 추측하여 다른 사용자를 사칭할 수 없습니다.또한 사용자의 세션을 제한하여 자주 로그인해야 합니다(보통 2주).세션에 대한 다른 데이터를 저장하려면 해당 데이터를 이 테이블에 추가하면 됩니다.

모든 사용자 속성(권한까지 확장됨)을 세션에 저장하면 사용자에 대한 모든 변경 사항은 사용자가 다시 로그인할 때까지 적용되지 않습니다.

개인적으로 저는 빠른 참조를 위해 이름과 ID를 저장하고 필요할 때 나머지를 가져옵니다.

대부분의 경우 ID를 저장하는 것이 가장 좋습니다.이에 대한 중요한 이유 중 하나는 확장성입니다.사용자 개체(또는 해당 ID 대신 데이터베이스의 모든 엔터티)를 저장하면 사이트를 제공하는 서버 수를 확장하는 데 문제가 발생하게 됩니다.자세한 내용은 Google에서 "아무것도 공유하지 않는 아키텍처"를 참조하세요.

어떤 플랫폼을 사용하느냐에 따라 다르다고 생각합니다.ASP.net을 사용하고 있다면 꼭 살펴보겠습니다. 양식인증 클래스와 로그인한 사용자 설정을 저장하는 데 사용할 수 있는 모든 내장(및 확장 가능) 기능이 있습니다.

사용자 ID와 세션 ID의 해시 값을 저장한 다음 이를 데이터베이스의 세션 테이블에 일치시킵니다.그렇게 하면 세션 데이터를 스푸핑하기가 더 어려워집니다.추가 확인으로 IP도 확인할 수 있나요?

세션 변수에 저장된 사용자 ID에 의존하고 해당 사용자가 상당히 쉽게 변경되고 다른 구성원으로 액세스할 수 있기 때문에 해당 사용자임을 신뢰하고 싶은지 잘 모르겠습니다.

나는 일반적으로 사용자를 세션에 저장합니다.로그인할 때까지 변경할 수 없는 문제는 변경한 후 세션의 개체를 새 복사본으로 바꾸면 해결될 수 있습니다.

우리의 사용자 개체는 상당히 가볍기 때문에 세션 변수에 저장하기로 결정했습니다.이것이 가장 효율적인지는 확실하지 않지만 지금까지는 매우 훌륭하게 작동하고 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top