짓다 | 의존 |
---|---|
JSON 웹 토큰 구현.
이는 draft-ietf-oauth-json-web-token-08
기반으로 개발되었습니다. node-jws를 사용합니다.
$ npm 설치 jsonwebtoken
v8에서 v9로
v7에서 v8로
(비동기) 콜백이 제공되면 콜백은 err
또는 JWT와 함께 호출됩니다.
(동기식) JsonWebToken을 문자열로 반환합니다.
payload
유효한 JSON을 나타내는 객체 리터럴, 버퍼 또는 문자열일 수 있습니다.
exp
또는 기타 클레임 은 페이로드가 객체 리터럴인 경우에만 설정됩니다. 버퍼 또는 문자열 페이로드는 JSON 유효성을 검사하지 않습니다.
payload
버퍼나 문자열이 아닌 경우JSON.stringify
사용하여 문자열로 강제 변환됩니다.
secretOrPrivateKey
는 HMAC 알고리즘의 비밀 또는 RSA 및 ECDSA의 PEM 인코딩 개인 키를 포함하는 문자열(utf-8 인코딩), 버퍼, 객체 또는 KeyObject입니다. 암호가 포함된 개인 키의 경우 객체 { key, passphrase }
사용할 수 있습니다(암호 문서 기반). 이 경우 algorithm
옵션을 전달해야 합니다. RSA 알고리즘으로 서명할 때 최소 모듈러스 길이는 2048입니다(allowInsecureKeySizes 옵션이 true로 설정된 경우 제외). 이 크기 미만의 개인 키는 오류와 함께 거부됩니다.
options
:
algorithm
(기본값: HS256
)
expiresIn
: 초 또는 시간 범위 vercel/ms를 설명하는 문자열로 표시됩니다.
예:
60
,"2 days"
,"10h"
,"7d"
. 숫자 값은 초 수로 해석됩니다. 문자열을 사용하는 경우 시간 단위(일, 시간 등)를 제공해야 합니다. 그렇지 않으면 기본적으로 밀리초 단위가 사용됩니다("120"
"120ms"
와 같음).
notBefore
: 초 또는 시간 범위 vercel/ms를 설명하는 문자열로 표시됩니다.
예:
60
,"2 days"
,"10h"
,"7d"
. 숫자 값은 초 수로 해석됩니다. 문자열을 사용하는 경우 시간 단위(일, 시간 등)를 제공해야 합니다. 그렇지 않으면 기본적으로 밀리초 단위가 사용됩니다("120"
"120ms"
와 같음).
audience
issuer
jwtid
subject
noTimestamp
header
keyid
mutatePayload
: true인 경우 서명 함수는 페이로드 객체를 직접 수정합니다. 이는 클레임이 적용된 후 토큰으로 인코딩되기 전에 페이로드에 대한 원시 참조가 필요한 경우에 유용합니다.
allowInsecureKeySizes
: true인 경우 모듈러스가 2048 미만인 개인 키를 RSA에 사용할 수 있습니다.
allowInvalidAsymmetricKeyTypes
: true인 경우 지정된 알고리즘과 일치하지 않는 비대칭 키를 허용합니다. 이 옵션은 이전 버전과의 호환성만을 위한 것이므로 사용하지 않는 것이 좋습니다.
expiresIn
,notBefore
,audience
,subject
,issuer
에는 기본값이 없습니다. 이러한 클레임은 각각exp
,nbf
,aud
,sub
및iss
사용하여 페이로드에 직접 제공할 수도 있지만 두 위치 모두에 포함할 수는 없습니다 .
exp
, nbf
및 iat
는 NumericDate 임을 기억하세요. 관련 토큰 만료(exp 청구)를 참조하세요.
헤더는 options.header
개체를 통해 사용자 정의할 수 있습니다.
noTimestamp
지정되지 않는 한 생성된 jwt에는 기본적으로 iat
(발행 위치) 클레임이 포함됩니다. iat
페이로드에 삽입되면 options.expiresIn
에 지정된 기간을 기준으로 exp
와 같은 다른 항목을 계산하기 위해 실제 타임스탬프 대신 사용됩니다.
기본값을 사용한 동기 서명(HMAC SHA256)
var jwt = require('jsonwebtoken');var token = jwt.sign({ foo: 'bar' }, 'shhhhh');
RSA SHA256을 사용한 동기 서명
// RSA SHA256으로 서명var privateKey = fs.readFileSync('private.key');var token = jwt.sign({ foo: 'bar' }, privateKey, { 알고리듬: 'RS256' });
비동기식으로 서명
jwt.sign({ foo: 'bar' }, privateKey, { 알고리즘: 'RS256' }, function(err, token) { console.log(token);});
JWT 30초 소급
var old_token = jwt.sign({ foo: 'bar', iat: Math.floor(Date.now() / 1000) - 30 }, 'shhhhh');
JWT 표준은 만료에 대한 exp
청구를 정의합니다. 만료는 NumericDate 로 표시됩니다.
윤초를 무시하고 1970-01-01T00:00:00Z UTC부터 지정된 UTC 날짜/시간까지의 초 수를 나타내는 JSON 숫자 값입니다. 이는 IEEE Std 1003.1, 2013 Edition [POSIX.1] 정의 "Epoch 이후의 초"와 동일합니다. 여기서 매일은 정수가 아닌 값을 표현할 수 있다는 점을 제외하고 정확히 86400초로 설명됩니다. 일반적인 날짜/시간, 특히 UTC에 대한 자세한 내용은 RFC 3339 [RFC3339]를 참조하세요.
이는 exp
필드에 에포크 이후의 초 수가 포함되어야 함을 의미합니다.
만료 시간이 1시간인 토큰 서명:
jwt.sign({ exp: Math.floor(Date.now() / 1000) + (60 * 60), 데이터: 'foobar'}, '비밀');
이 라이브러리를 사용하여 이와 같은 토큰을 생성하는 또 다른 방법은 다음과 같습니다.
jwt.sign({ data: 'foobar'}, 'secret', {expiresIn: 60 * 60 });//또는 더 나은 방법:jwt.sign({ 데이터: 'foobar'}, '비밀', {expiresIn: '1h' });
(비동기) 콜백이 제공되면 함수는 비동기적으로 작동합니다. 서명이 유효하고 선택적 만료, 대상 또는 발급자가 유효한 경우 콜백은 디코딩된 페이로드와 함께 호출됩니다. 그렇지 않은 경우 오류와 함께 호출됩니다.
(동기식) 콜백이 제공되지 않으면 함수가 동기식으로 작동합니다. 서명이 유효하고 선택적 만료, 대상 또는 발급자가 유효한 경우 디코딩된 페이로드를 반환합니다. 그렇지 않으면 오류가 발생합니다.
경고: 토큰이 신뢰할 수 없는 소스(예: 사용자 입력 또는 외부 요청)에서 오는 경우 반환된 디코딩된 페이로드는 다른 사용자 입력처럼 처리되어야 합니다. 반드시 소독하고 예상되는 속성으로만 작업하세요.
token
JsonWebToken 문자열입니다.
secretOrPublicKey
는 HMAC 알고리즘의 비밀 또는 RSA 및 ECDSA의 PEM 인코딩 공개 키를 포함하는 문자열(utf-8 인코딩), 버퍼 또는 KeyObject입니다. jwt.verify
비동기식으로 호출되는 경우 secretOrPublicKey
비밀 키 또는 공개 키를 가져와야 하는 함수일 수 있습니다. 자세한 예시는 아래를 참고하세요
이 의견에서 언급했듯이, base64로 인코딩된 비밀(base64를 사용하여 인코딩된 임의 바이트)을 기대하는 다른 라이브러리가 있습니다. 이 경우 Buffer.from(secret, 'base64')
전달할 수 있습니다. 이렇게 하면 비밀이 디코딩됩니다. base64를 사용하면 토큰 확인 시 원래 임의 바이트가 사용됩니다.
options
algorithms
: 허용되는 알고리즘의 이름이 포함된 문자열 목록입니다. 예를 들어 ["HS256", "HS384"]
입니다.
지정하지 않으면 제공된 키 유형에 따라 기본값이 사용됩니다.
비밀 - ['HS256', 'HS384', 'HS512']
rsa - ['RS256', 'RS384', 'RS512']
ec - ['ES256', 'ES384', 'ES512']
기본값 - ['RS256', 'RS384', 'RS512']
audience
: 청중( aud
)을 확인하려면 여기에 값을 제공하십시오. 대상은 문자열, 정규식 또는 문자열 목록 및/또는 정규식과 비교하여 확인할 수 있습니다.
예:
"urn:foo"
,/urn:f[o]{2}/
,[/urn:f[o]{2}/, "urn:bar"]
complete
: 페이로드의 일반적인 콘텐츠 대신 디코딩된 { payload, header, signature }
이 포함된 객체를 반환합니다.
issuer
(선택 사항): iss
필드에 대한 유효한 값의 문자열 또는 문자열 배열입니다.
jwtid
(선택): JWT ID( jti
)를 확인하려면 여기에 문자열 값을 입력하세요.
ignoreExpiration
: true
인 경우 토큰 만료를 확인하지 않습니다.
ignoreNotBefore
...
subject
: 제목( sub
)을 확인하려면 여기에 값을 입력하세요.
clockTolerance
: 서로 다른 서버 간의 작은 클럭 차이를 처리하기 위해 nbf
및 exp
클레임을 확인할 때 허용되는 시간(초)
maxAge
: 토큰이 계속 유효하도록 허용되는 최대 수명입니다. 이는 초 또는 시간 범위 vercel/ms를 설명하는 문자열로 표현됩니다.
예:
1000
,"2 days"
,"10h"
,"7d"
. 숫자 값은 초 수로 해석됩니다. 문자열을 사용하는 경우 시간 단위(일, 시간 등)를 제공해야 합니다. 그렇지 않으면 기본적으로 밀리초 단위가 사용됩니다("120"
"120ms"
와 같음).
clockTimestamp
: 필요한 모든 비교를 위해 현재 시간으로 사용해야 하는 시간(초)입니다.
nonce
: nonce
청구를 확인하려면 여기에 문자열 값을 입력하세요. ID 토큰의 Open ID에 사용됩니다. (오픈ID 구현 참고사항)
allowInvalidAsymmetricKeyTypes
: true인 경우 지정된 알고리즘과 일치하지 않는 비대칭 키를 허용합니다. 이 옵션은 이전 버전과의 호환성만을 위한 것이므로 사용하지 않는 것이 좋습니다.
// 대칭 토큰 확인 - synchronousvar decoded = jwt.verify(token, 'shhhhh');console.log(decoded.foo) // bar// 토큰 대칭 확인jwt.verify(token, 'shhhhh', function(err) , 디코딩됨) { console.log(decoded.foo) // bar});// 잘못된 토큰 - synchronoustry { var decoded = jwt.verify(token, 'wrong-secret');} catch(err) { // 오류}// 유효하지 않은 토큰jwt.verify(token, 'wrong-secret', function(err, decoded) { // 오류 // 정의되지 않은 상태로 디코딩됨});// 비대칭 토큰 확인var cert = fs.readFileSync('public.pem'); // 공개 키를 얻습니다.jwt.verify(token, cert, function(err, decoded) { console.log(decoded.foo) // bar});// Audiencevar 확인 확인var cert = fs.readFileSync('public.pem'); // 공개 키 가져오기jwt.verify(token, cert, {audience: 'urn:foo' }, function(err, decoded) { // 대상이 일치하지 않는 경우 err == 잘못된 대상});// 발급자 확인var cert = fs.readFileSync('public.pem'); // 공개 키 가져오기jwt.verify(token, cert, { Audience: 'urn:foo', issuer: 'urn:issuer' }, function(err, decoded) { // 발급자가 일치하지 않으면 err == 잘못된 발급자});// jwt ID 확인 var cert = fs.readFileSync('public.pem'); // 공개 키 가져오기jwt.verify(token, cert, { 청중: 'urn:foo', 발급자: 'urn:issuer', jwtid: 'jwtid' }, function(err, decoded) { // jwt ID가 일치하지 않으면 err == 잘못된 jwt ID});// subjectvar 확인 cert = fs.readFileSync('public.pem'); // 공개 키 가져오기jwt.verify(token, cert, { 청중: 'urn:foo', 발행자: 'urn:issuer', jwtid: 'jwtid', 주제: 'subject' }, function(err, decoded) { // 제목이 일치하지 않으면 err == 잘못된 제목});// alg mismatchvar cert = fs.readFileSync('public.pem'); // 공개 키 가져오기jwt.verify(token, cert, { 알고리즘: ['RS256'] }, function (err, payload) { // 토큰 alg != RS256, err == 유효하지 않은 서명});// getKey 콜백을 사용하여 확인// 예시에서는 키를 가져오는 방법으로 https://github.com/auth0/node-jwks-rsa를 사용합니다. var jwksClient = require('jwks-rsa');var 클라이언트 = jwksClient({ jwksUri: 'https://sandrino.auth0.com/.well-known/jwks.json'});function getKey(헤더, 콜백){ client.getSigningKey(header.kid, function(err, key) {var signedKey = key.publicKey || key.rsaPublicKey;callback(null, signedKey); });}jwt.verify(token, getKey, options, function(err, decoded) { console.log(decoded.foo) // 바});
(동기) 서명이 유효한지 확인하지 않고 디코딩된 페이로드를 반환합니다.
경고: 서명이 유효한지 여부는 확인되지 않습니다 . 신뢰할 수 없는 메시지에는 이 기능을 사용하면 안 됩니다. 대신
jwt.verify
사용하고 싶을 가능성이 높습니다.
경고: 토큰이 신뢰할 수 없는 소스(예: 사용자 입력 또는 외부 요청)에서 오는 경우 반환된 디코딩된 페이로드는 다른 사용자 입력처럼 처리되어야 합니다. 반드시 소독하고 예상되는 속성으로만 작업하세요.
token
JsonWebToken 문자열입니다.
options
:
json
: 헤더에 "typ":"JWT"
포함되지 않은 경우에도 페이로드에 JSON.parse를 강제 적용합니다.
complete
: 디코딩된 페이로드와 헤더가 포함된 객체를 반환합니다.
예
// 서명을 무시하고 디코딩된 페이로드 가져오기, secretOrPrivateKey 필요 없음var decoded = jwt.decode(token);// 디코딩된 페이로드 및 헤더 가져오기var decoded = jwt.decode(token, {complete: true});console.log(decoded. 헤더);console.log(decoded.payload)
확인 중에 오류가 발생할 수 있습니다. Error는 확인 콜백의 첫 번째 인수입니다.
토큰이 만료되면 오류가 발생합니다.
오류 개체:
이름: 'TokenExpiredError'
메시지: 'jwt가 만료되었습니다'
만료 날짜: [ExpDate]
jwt.verify(token, 'shhhhh', function(err, decoded) { if (err) {/* err = { 이름: 'TokenExpiredError', 메시지: 'jwt 만료', 만료At: 1408621000 } */ }});
오류 개체:
이름: 'JsonWebTokenError'
메시지:
'잘못된 토큰' - 헤더 또는 페이로드를 구문 분석할 수 없습니다.
'jwt 형식이 잘못됨' - 토큰에 세 가지 구성요소가 없습니다( .
로 구분됨).
'jwt 서명이 필요합니다'
'잘못된 서명'
'jwt 대상이 잘못되었습니다. 예상됨: [OPTIONS AUDIENCE]'
'jwt 발급자가 잘못되었습니다. 예상됨: [옵션 발행자]'
'jwt ID가 잘못되었습니다. 예상: [옵션 JWT ID]'
'jwt 제목이 잘못되었습니다. 예상됨: [옵션 제목]'
jwt.verify(token, 'shhhhh', function(err, decoded) { if (err) {/* err = { 이름: 'JsonWebTokenError', 메시지: 'jwt 형식이 잘못되었습니다' } */ }});
현재 시간이 nbf 청구 이전인 경우 발생합니다.
오류 개체:
이름: 'NotBeforeError'
메시지: 'jwt가 활성화되지 않았습니다'
날짜: 2018-10-04T16:10:44.000Z
jwt.verify(token, 'shhhhh', function(err, decoded) { if (err) {/* err = { 이름: 'NotBeforeError', 메시지: 'jwt not active', 날짜: 2018-10-04T16:10:44.000Z } */ }});
지원되는 알고리즘의 배열. 현재 지원되는 알고리즘은 다음과 같습니다.
alg 매개변수 값 | 디지털 서명 또는 MAC 알고리즘 |
---|---|
HS256 | SHA-256 해시 알고리즘을 사용하는 HMAC |
HS384 | SHA-384 해시 알고리즘을 사용하는 HMAC |
HS512 | SHA-512 해시 알고리즘을 사용하는 HMAC |
RS256 | SHA-256 해시 알고리즘을 사용하는 RSASSA-PKCS1-v1_5 |
RS384 | SHA-384 해시 알고리즘을 사용하는 RSASSA-PKCS1-v1_5 |
RS512 | SHA-512 해시 알고리즘을 사용하는 RSASSA-PKCS1-v1_5 |
PS256 | SHA-256 해시 알고리즘을 사용하는 RSASSA-PSS(노드 ^6.12.0 OR >=8.0.0만 해당) |
PS384 | SHA-384 해시 알고리즘을 사용하는 RSASSA-PSS(노드 ^6.12.0 OR >=8.0.0만 해당) |
PS512 | SHA-512 해시 알고리즘을 사용하는 RSASSA-PSS(노드 ^6.12.0 OR >=8.0.0만 해당) |
ES256 | P-256 곡선 및 SHA-256 해시 알고리즘을 사용하는 ECDSA |
ES384 | P-384 곡선 및 SHA-384 해시 알고리즘을 사용하는 ECDSA |
ES512 | P-521 곡선 및 SHA-512 해시 알고리즘을 사용하는 ECDSA |
없음 | 디지털 서명이나 MAC 값이 포함되어 있지 않습니다. |
우선, JWT 자동 새로 고침으로 인해 시스템에 취약점이 발생하지 않는지 신중하게 생각하는 것이 좋습니다.
이것을 라이브러리의 일부로 포함하는 것이 불편하지만 이 예제를 살펴보고 이것이 어떻게 수행될 수 있는지 보여줄 수 있습니다. 해당 예 외에도 이 주제에 대한 더 많은 지식을 얻기 위한 문제와 풀 요청이 있습니다.
X.509 인증서 체인이 확인되지 않았습니다.
버그를 발견했거나 기능 요청이 있는 경우 이 저장소 문제 섹션에 보고해 주세요. 공개 GitHub 문제 추적기에 보안 취약점을 보고하지 마세요. 책임 공개 프로그램은 보안 문제 공개 절차를 자세히 설명합니다.
인증0
이 프로젝트는 MIT 라이선스에 따라 라이선스가 부여됩니다. 자세한 내용은 LICENSE 파일을 참조하세요.