2013-12-08 5 views
0

서버 쪽에서 Node.js와 Passportjs를, 앱의 클라이언트 쪽에서 Emberjs를 사용하고 있습니다. 나의 현재 인증 전략은 Passport-Local을 사용하여 표준 전자 메일/암호 조합을 가진 사용자를 표준으로 인증 한 다음 세션 생성 메커니즘을 연결하여 별도의 테이블에 저장되고 사용자에게 다시 전달되는 인증 토큰을 생성하는 것입니다 추가 보호 된 경로에서 사용하기 위해. (REST 헤더에 전달됨).Nodejs - 인증 토큰을 디코드해야합니까?

토큰을 만들면 문제가 없지만 추가 단계가 필요한 경우 해결하기 위해 고심하고 있습니다.

현재패스를 페이로드로 사용하고 사용자 UID (다른 node-uuid)를 암호로 사용하여 node-jwt-simple으로 토큰을 생성합니다. 그런 다음 이것을 클라이언트 측의 $.cookie과 서버 측의 테이블에 생성 날짜와 함께 저장합니다.

분명히 node-jwt-simple의 단계 중 하나는 토큰을 인코딩하는 것입니다. 제공된 디코드 기능도 있습니다. 내 질문은, 내가 내 확인을 할 때 토큰을 디코드해야합니까, 아니면 단순히 데이터베이스의 토큰에 대한 일치를 위해 사용자의 세션 쿠키 (REST 헤더)를 확인하고 있습니까? 토큰을 생성하는 데 모든 노력을 기울이기는 커녕 중요한 단계를 놓치기 만하면됩니다.하지만 더 유용한 보안을 제공 할 수있는 방법으로 디코딩 할 수는 없습니다.

업데이트 : 나는이 밖으로 지난 밤 일을 생각

:

이 솔루션은 비밀로 정적 문자열, JWT의 페이로드로 사용자의 UID를 사용하는 것 같다을 (촬영을 서버 환경 변수 또는 비슷한 것과 같은 것으로부터), 인코딩 된 토큰 만 데이터베이스에 저장하십시오. 다시 인증하기 위해 클라이언트에 토큰을 전달한 다음 클라이언트가 보호 된 경로에 액세스하려고하면 인코딩 된 토큰과 함께 해당 UID를 서버로 전달한 다음 서버로 디코딩하고 디코딩 된 페이로드를 UID와 비교해야합니다 통과되었습니다. 일치하면 일치 인증에 성공하고 그렇지 않으면 토큰이 삭제되고 사용자가 다시 로그인해야합니다. 이렇게하면 Secret 키를 알지 못하거나 사용자의 UID를 가지지 않아도 토큰 저장소가 효과적으로 쓸모 없게되지만 인증 프로세스가 더욱 안전하게됩니다.

답변

1

토큰의 유효성을 검사하지 않으면 고유하고 클라이언트가 추측 할 수없는 한 세션 쿠키로 사용할 다른 임의의 데이터를 만들 수 있습니다.

하지만 이미 많은 노력을 기울 였기 때문에 유효 기간을 알려주는 유용한 토큰을 인코딩 할 수 있습니다. exp 필드이므로 데이터베이스에서 읽을 필요가 없습니다.

JWT를 완전히 이해할 수 있을지 모르겠지만 문제는 내가 아는 토큰을 디코딩하는 데 필요한 정보라는 것입니다. 따라서 데이터베이스에서 검색을 수행해야합니다.

무작위 세션 키를 사용하는 것으로 충분할 것이라고 생각합니다. 다음 함수 :

var crypto = require('crypto'); 

/** 
* Create random bytes and encode base64url. 
* @param {int} [lengthInBytes=40] the size of the raw token in bytes 
*  (will be longer since base64url-encoded) 
* @param {function} callback node-style callback-function; 
*  data-parameter is a string w/ a shortened (no trailing ==) 
*  base64url-encoded string of the generated bytes. 
*/ 
exports.createRandomToken = function createRandomToken(lengthInBytes, callback) { 
    if (typeof lengthInBytes === 'function') { 
     callback = lengthInBytes; 
     lengthInBytes = 40; 
    } 
    crypto.randomBytes(lengthInBytes, function (ex, buf) { 
     if (ex) { 
      callback(ex); 
      return; 
     } 
     callback(null, buf.toString('base64') 
          .replace(/\//g, '_') 
          .replace(/\+/g, '-') 
          .replace(/=/g, '')); 
    }); 
}; 
+0

내가 해독 할 수있는 이유는 무엇입니까? (해독하는 것이 유용한 이유) : 사용자의 UID를 페이로드로 인코딩하여 서버 측에서 일부 비공개 문자열을 사용하면 모든 인증 요청마다 토큰과 함께 UID를 서버에 전달하면 서버는 토큰을 디코딩하고 UID와 비교하여 페이로드를 확인할 수 있습니다. 일치하면 토큰이 파기되므로 다시 로그인해야합니다. 이렇게하면 토큰이 서버에서 도난당한 경우 사용되는 것을 방지하고 클라이언트가 쿠키가 도용 된 경우에만 보안 구멍을 남기며 HTTPS로 해결할 수 있습니다. –

0
  1. 설정은 가능한 한 작은 토큰 (5 분, 30 분,도 아니다 개월도 년)의 시간이 만료됩니다.
  2. 사용할 때마다 (사용자가 로그인 할 때, 의심의 여지과)는
  3. 는 토큰 암호, 신용 카드 번호 및 기밀 정보를 보관하지 마십시오 된 토큰을 업데이트 토큰 새로운 토큰을 얻을 토큰 새로 고침 새로 고침 업데이트 (나는 shure 다. :))
  4. 권한 확인 (예 : ip 검사)에 필요한 모든 정보를 저장한다. REST API 및 수평 확장에 적합합니다.
관련 문제