중복으로 표시 될 가능성이 높지만 원하는 것을 정확히 찾을 수 없습니다.
이것은 일반적인 문제이며 잘 정의 된 모범 사례 솔루션이 있다고 확신합니다.
배경
단일 페이지 SaaS 앱에는 많은 끌어서 놓기가 있으며 사용자는 일정 시간 동안 많은 서버 통신 없이도 상호 작용할 수 있습니다
서버 세션은 비 영구 세션 쿠키를 사용하여 사용자 개체 만 보유합니다.
X 시간 후 서버에서 세션이 만료 됨
일부는 로그인 중에 만로드됩니다
문제
- 사용자가 앱에서 작업을 마치면 로그 아웃하지 않고 브라우저를 계속 열어 둡니다.
- X 시간 이상 후에 사용자가 다시 방문 함 (서버에서 세션이 무효화 됨)
- 사용자는 서버 연결없이 앱과 상호 작용 (드래그 앤 드롭, 텍스트 편집 ...)
- 다음 서버 상호 작용에서만 (자동 저장이 없다고 가정하자) 사용자가 로그인 페이지에 던져지고 일부 작업이 손실 됨
가능한 해결책
여기에 내가 생각한 몇 가지 해결책이 있습니다. 다른 것들이 있고 근본적으로 문제가있는 경우 듣고 싶습니다.
1. 절대 사용자를 로그 아웃하지 마십시오
- 어떻게? 긴 세션을 유지하거나 영구 쿠키를 유지하거나 javaScript "live a keep"핑
- 장점 : 사용자는 아무것도 걱정할 필요가 없으며 문제를 해결합니다.
- 단점 : PCI와 호환되지 않고 안전하지 않으며 개발 변경이 필요합니다. 예를 들어 사용자 로그인시에만 세션에로드 된 항목은 pub 하위 모델로 이동하거나 (이벤트 변경 사항을 청취) 캐시 시간이 초과되어야합니다.
2. 로컬 스토리지
- 어떻게? 새 로컬 스토리지를 사용하여 로그 아웃 된 상태를 일시적으로 저장하고 로그인 페이지로 리디렉션하고 로그인 한 후에도 지속
- 장점 : 세션 시간 제한을 처리하는 것이 아니라 "오프라인 작업"지원을위한 기반
- 단점 : 구현하기가 어려우며 모든 브라우저가 지원하지는 않지만 데이터 트리의 상태 병합을 수행해야합니다.
3. 자동 저장
모델을 변경하는 모든 사용자 작업은 즉시 (또는 일종의 클라이언트 쪽 대기열을 통해) 유지되어야합니다. 예를 들어 확인란을 선택하거나 텍스트 필드를 변경하거나 작업이 완료되면 끌어다 놓으면 변경 사항이 유지됩니다.
- 어떻게? MV ** 프레임 워크 (Backbone.js / Knockout.js / Ember.js / Angular.js 등)를 사용하여 모델을 바인딩하고 변경 사항을 유지하십시오.
- 장점 : 깨끗한 솔루션처럼 보입니다. 사용자가 활동하는 한 세션이 활성 상태이며 클라이언트 측 작업은 지속되지 않습니다.
- 단점 : 세션 시간이 초과 된 후 사용자가 마지막으로 수행 한 작업입니다.
4. 세션이 만료 된 후 사용자를 로그 아웃하십시오.
이것은 몇 가지 접근 방식을 가질 수 있습니다
서버에게 "세션이 만료되었습니다"라고 물어보십시오. 이것은 서버에 대한 단순한 질문이 세션을 연장하기 때문에 약간의 캐치 22 / Schrodinger의 고양이입니다.
- 어떻게? 그러한 질문을 지원하는 서버가 있거나 (아무것도 모르지만 Java 랜드로 제공됨) 세션 ID 테이블과 마지막 액세스 시간을 수동으로 유지하고 세션을 전달하여 서버에 요청할 수 있습니다 쿠키 대신 매개 변수로 ID를 사용하면 이것이 가능한지 확실하지 않지만 위험하고 안전하지 않으며 나쁜 디자인 whatsever.login 페이지는 로그인 한 후에도 지속됩니다.
- 장점 : 서버에서 이러한 기본 지원이 있었다면 깨끗하고 합법적 인 질문처럼 들립니다 (사용자 X가 여전히 세션을 가지고 있는지 여부를 묻는 경우).
- 단점 : 서버가 서버를 지원하지 않으면 (그리고 서버 나 프레임 워크 에이 기능이 있는지 모르겠습니다) 해결 방법에는 잠재적으로 큰 보안 위험이 있습니다.
내가 들었던 한 가지 해결 방법은 서버 측에서 세션이 짧고 클라이언트 측 핑을 유지하는 것입니다.
- 어떻게? 서버의 짧은 세션, 클라이언트는 모든 sessionTimeOut / 2를 ping합니다. 최대 재시도 횟수는 Y입니다.
- 장점 : 문제가 빠르고 더러워 짐
- 단점 : 해킹처럼 느껴 서버가 세션을 갱신하지 않고 직접 세션 갱신을 처리합니다.
클라이언트 측 타이머
어떻게? 클라이언트 측에 타이머가 있고 모든 요청에서 최대 서버 세션 시간 제한에서 패딩을 뺀 값과 같도록 모든 요청을 다시 시작하여 타이머를 서버와 동기화합니다. 사용자가 서버에 요청을 보내지 않은 후 UI에 "세션이 있습니다. 시간이 초과 될 예정입니까? 계속 하시겠습니까? " (당신은 온라인 뱅킹에있는 것처럼)
장점 : 문제 해결
- 단점 : 동기화가 작동하는지 확인하는 것 외에는 생각할 수 없습니다.
질문
위의 분석에서 누락 된 부분이 있거나 어리석은 실수가있을 수 있으며 문제를 해결하기 위해 귀하의 도움을 원합니다. 이를 위해 어떤 다른 솔루션을 사용할 수 있습니까?
now
. 4.2 서버를 죽이고 비용을 증가시키는 좋은 방법처럼 들립니다. 4.3 안드로이드에서는 홈 화면으로 돌아갈 때 프로세스가 일시 중지되어 클라이언트 측 타이머를 방해 할 수 있습니다.