2016-10-16 1 views
1

명백한 답변이있을 것이라고 확신하지만 공식 문서 나 인터넷상의 어느 곳에서도 해결책을 찾지 못했습니다.PassportJS를 사용하여 요청할 때마다 사용자를 deserialize해야합니까?

Passport.js 우리는 사용자 세션을 비 직렬화하는 방법과 하나의 직렬화하는 방법 두 가지를 정의해야합니다.

official documentation 가입일

내가 읽어

전용 사용자 ID가 작은 세션 내에 저장된 데이터의 양을 유지하는 세션으로 직렬화된다.

직렬화 : 후속 요청이 수신되면,이 ID는 Wikipedia에 따라,

내 첫 번째 질문은 용어 직렬화 우려를 req.user으로 복원 할 사용자를 찾는 데 사용됩니다 데이터 구조 또는 객체 상태를 저장할 수있는 형식으로 변환하는 과정입니다.

그러나 사용자가 객체이고 객체이기 때문에 JavaScript만으로 만들어진 세계에서 네이티브, 왜 우리는 연재 중입니까? 우리는 전체 객체를 세션에 저장할 수 있습니다. 무엇을 금지합니까?

그런 다음 deserializing은 데이터베이스와 상호 작용하기 때문에 많은 양의 리소스가 필요한 프로세스입니다. 그렇다면 왜 어떤 요청을해도 비 직렬화를 실행합니까? 우리는 한 번만 그것을 할 수 있었고 그 이상의 결과에 대한 결과를 유지할 수 없었습니까?

PassportJS에 대해 많이 읽었으며 로그인 시스템을 구현할 수 있지만 이러한 불명확 한 점을 분명히하고 싶습니다. 감사합니다.

답변

0

당신이 말하는 것처럼, 유일한 사용자 데이터가 세션에서 지속 사용자 ID입니다. 사용자 ID의 탈 직렬화를 사용자에게 캐시하려면 데이터를 검색 할 시간이 염려되므로 메모리에 사용자가 직접 유지해야합니다. 이 문제는 사용자를 업데이트하는 작업 (해당 사용자가 전자 메일 주소 또는 암호를 변경하는 경우)에서 해당 캐시를 무효화/업데이트해야한다는 것입니다. 그렇지 않으면 오래된 데이터가 req.user에있을 위험이 있습니다.

당신은 데이터베이스 (Redis와 같은 메모리 저장소가 아닌)로 작업하고 있으며 모든 요청에 ​​대해 데이터베이스에서 사용자를 가져 오는 것이 성능에 미치는 영향에 대해 염려합니다. 특정 설정에 대해 알지 못해도 확신 할 수는 없지만 ID에 기반한 사용자 레코드를 가져 오는 단일 호출 (어느 데이터베이스가 잘 최적화되어 있는지)에 대한 기본 키 인덱스는 다음과 같습니다. 예를 들어 SQL 기반 db)는 요청에 중요한 대기 시간을 추가해서는 안됩니다.

관련 문제