정적 웹사이트는 쉽게 확장 가능합니다. 모든 것을 캐시하기만 하면 다른 서버의 상태 저장 콘텐츠를 사용자에게 결합하는 것에 대해 생각할 필요가 없습니다.
안타깝게도 대부분의 웹 애플리케이션은 개인화된 경험을 제공하기 위해 상태 저장 콘텐츠를 사용합니다. 애플리케이션이 로그인할 수 있다면 사용자의 세션을 기억해야 합니다. 고전적인 처리 방법은 클라이언트가 임의의 고유 세션 식별자가 포함된 쿠키를 설정하고 식별된 세션 데이터가 서버에 저장되는 것입니다.
상태 저장 서비스 확장
서비스를 확장할 때 다음 세 가지 옵션이 있습니다.
그러나 모두 결함이 있습니다.
그러나 다른 각도에서 생각해보면 네 번째 옵션이 있습니다. 클라이언트에 세션 데이터를 저장하는 것입니다.
클라이언트 세션
클라이언트에 세션을 저장하면 다음과 같은 장점이 있습니다.
그러나 클라이언트 측 세션에는 심각한 문제가 있습니다. 즉, 사용자가 세션 데이터를 조작하지 않을 것이라고 보장할 수 없습니다.
예를 들어, 사용자의 ID를 쿠키에 저장합니다. 다른 사람의 계정에 액세스하기 위해 사용자가 쉽게 수정할 수 있습니다.
이는 클라이언트측 세션의 가능성을 부정하는 것처럼 보이지만 이 문제를 깔끔하게 해결할 수 있는 방법이 있습니다. 즉, 세션 데이터(여전히 쿠키에 저장되어 있음)를 암호화하고 패키징하는 것입니다. 이런 방식으로 사용자가 세션 데이터를 수정하는 것에 대해 걱정할 필요가 없으며 서버가 데이터를 확인합니다.
실제 적용에서는 암호화된 서버 키가 쿠키에 저장됩니다. 서버 키 확인 후에만 세션 데이터를 읽고 수정할 수 있는 권한이 있습니다. 클라이언트 세션입니다.
노드 클라이언트 세션
Node.JS에는 클라이언트 측 세션을 구현할 수 있는 라이브러리인 node-client-session이 있습니다. 이는 Connect의 내장 세션 및 cookieParser 미들웨어(노드 미들웨어 프레임워크)를 대체할 수 있습니다.
Express 프레임워크 애플리케이션에서의 사용:
const clientSessions = require("client-sessions");
app.use(clientSessions({ secret: '0GBlJZ9EKBt2Zbi2flRPvztczCewBxXK' // 设置一个随机长字符串! })
그런 다음 req.session 개체에 속성을 추가합니다.
app.get('/login', function (req, res){ req.session.username = 'JohnDoe'; });
속성 읽기:
app.get('/', function (req, res){ res.send('Welcome ' + req.session.username); });
세션을 종료하려면 재설정 방법을 사용하세요.
app.get('/logout', function (req, res) { req.session.reset(); });
페르소나 세션에서 즉시 로그아웃
(참고: Persona는 Mozzilla가 출시한 온라인 신원 시스템입니다.)
서버측 Session과 달리 클라이언트측 Session의 문제점은 서버가 Session을 삭제할 수 없다는 점입니다.
서버측 아키텍처에서는 세션 데이터를 삭제할 수 있습니다. 클라이언트 쿠키로 식별된 세션이 존재하지 않을 수 있습니다. 그러나 클라이언트 측 아키텍처에서는 세션 데이터가 서버 측에 있지 않으며 모든 클라이언트에서 세션 데이터가 삭제된다는 보장은 없습니다. 즉, 사용자의 클라이언트 상태(로그인)와 서버 상태(로그아웃)를 동기화할 수 없습니다.
이러한 결함을 보완하기 위해 클라이언트 세션에 만료 시간이 추가되었습니다. 세션 데이터(암호화 및 패키지)를 확장하기 전에 만료 시간을 확인하십시오. 만료되면 세션 데이터를 삭제하고 사용자 상태(예: 로그아웃)를 변경합니다.
만기 메커니즘은 다양한 애플리케이션(특히 짧은 만료 시간 요구 사항)에서 잘 작동합니다. 예를 들어 페르소나에서는 사용자가 비밀번호가 위협을 받거나 훼손된 사실을 발견한 경우, 사용자가 즉시 세션 데이터에서 로그아웃할 수 있는 방법을 제공해야 합니다.
이는 서비스 백엔드에 약간의 상태 정보를 유지한다는 의미입니다. 즉시 로그아웃을 처리하는 방법은 사용자 데이터 테이블과 세션 데이터에 토큰을 추가하는 것입니다.
API가 호출될 때마다 세션 데이터의 토큰과 데이터베이스의 토큰이 비교됩니다. 그렇지 않은 경우 오류 메시지를 반환하고 사용자를 종료합니다.
이렇게 하면 토큰을 쿼리하기 위한 중복 데이터베이스 작업이 추가됩니다. 다행히 대부분의 API 호출에는 사용자 데이터 테이블을 읽어야 하므로 토큰만 함께 가져오세요.