> 웹 프론트엔드 > JS 튜토리얼 > Node.js에서 클라이언트 세션 사용에 대한 자세한 설명programming_node.js

Node.js에서 클라이언트 세션 사용에 대한 자세한 설명programming_node.js

WBOY
풀어 주다: 2016-05-16 15:53:22
원래의
1157명이 탐색했습니다.

정적 웹사이트는 쉽게 확장 가능합니다. 모든 것을 캐시하기만 하면 다른 서버의 상태 저장 콘텐츠를 사용자에게 결합하는 것에 대해 생각할 필요가 없습니다.

안타깝게도 대부분의 웹 애플리케이션은 개인화된 경험을 제공하기 위해 상태 저장 콘텐츠를 사용합니다. 애플리케이션이 로그인할 수 있다면 사용자의 세션을 기억해야 합니다. 고전적인 처리 방법은 클라이언트가 임의의 고유 세션 식별자가 포함된 쿠키를 설정하고 식별된 세션 데이터가 서버에 저장되는 것입니다.


상태 저장 서비스 확장

서비스를 확장할 때 다음 세 가지 옵션이 있습니다.

  1. 서로 다른 서버 간 세션 데이터 동기화
  2. 여러 서버가 단일 포인트 센터에 연결(Session 획득)
  3. 사용자가 동일한 서버에 액세스하는지 확인

그러나 모두 결함이 있습니다.

  • 데이터 동기화로 인해 성능 오버헤드가 증가합니다
  • 단일 포인트 센터로 인해 시스템 확장성이 저하됩니다
  • 지난번에 사용자가 방문한 서버에 점검이 필요한 경우 대처 방법

그러나 다른 각도에서 생각해보면 네 번째 옵션이 있습니다. 클라이언트에 세션 데이터를 저장하는 것입니다.


클라이언트 세션

클라이언트에 세션을 저장하면 다음과 같은 장점이 있습니다.

  • 어떤 서버든 상관없이 세션 데이터는 유효합니다
  • 서버 상태를 유지할 필요가 없습니다
  • 서버 동기화가 필요하지 않습니다
  • 마음대로 새 서버 추가

그러나 클라이언트 측 세션에는 심각한 문제가 있습니다. 즉, 사용자가 세션 데이터를 조작하지 않을 것이라고 보장할 수 없습니다.


예를 들어, 사용자의 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 호출에는 사용자 데이터 테이블을 읽어야 하므로 토큰만 함께 가져오세요.


관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿