Node.JS는 JWT 원리를 어떻게 실현합니까
우리가 nodejs로 전단이나 다른 서비스에resful 인터페이스를 제공할 때 http 프로토콜은 무상태 프로토콜입니다. 때때로 이 요청에 따라 구체적인 사용자가 권한을 가지고 사용자의 상하문에 대해 조작해야 합니다.그래서 쿠키 세션과 jwt라는 몇 가지 기술의 출현은 모두 HTTP 프로토콜에 대한 보충이다.HTTP 프로토콜 + 상태 관리로 사용자를 위한 WEB 응용 프로그램을 구축할 수 있습니다.
2.session 및 쿠키
session과 cookies는 관련이 있습니다. session은 서비스 측이 클라이언트 cookies에 심은 session_id, 서버 저장 session_id에 대응하는 현재 사용자의 모든 상태 정보입니다.클라이언트가 서비스 측에 요청할 때마다 쿠키의session_id, 서비스 측은 구체적인 사용자 정보가 있는지 판단하고 없으면 로그인을 조정합니다.
jwt는 json 웹 token의 전칭이다. 그는session 이상의 문제를 해결했다. 장점은 서버가 어떤 세션 데이터도 저장하지 않는다는 것이다. 즉, 서버가 무상태로 변하여 더욱 쉽게 확장할 수 있다는 것이다. 어떤 상황에서 jwt를 사용하는 것이 비교적 적합하다고 생각한다. 나는 이 장면을 권한을 부여하는 것이다. 왜냐하면 jwt는 사용이 가볍고 비용이 적으며 백엔드가 무상태이기 때문에 사용이 비교적 광범위하다고 생각한다.
4.jwt의 원리
JWT의 원리는 서버 인증 후에 JSON 대상을 생성하여 사용자에게 보내는 것이다. 아래와 같다.
{
" ": " ",
" ": " ",
" ": "2018 7 1 0 0 "
}
나중에 사용자가 서버와 통신할 때 이 JSON 대상을 반환해야 합니다.서버는 완전히 이 대상만으로 사용자의 신분을 인정한다.사용자가 데이터를 왜곡하는 것을 방지하기 위해 서버는 이 대상을 생성할 때 서명을 추가합니다.5.jwt의 인증 절차
프로세스 설명:
jwt는 사용을 포함합니다.스타일의 세 부분.
{ "alg": "HS256", "typ": "JWT"}
// algorithm => HMAC SHA256
// type => JWT
이것은 고정된 쓰기 방법입니다. alg 표면은 HS256 알고리즘을 사용해야 합니다.Payload 로드, 하중, JWT는 7개의 공식 필드를 규정하였다
iss (issuer):
exp (expiration time):
sub (subject):
aud (audience):
nbf (Not Before):
iat (Issued At):
jti (JWT ID):
이 일곱 개를 제외하고는 사용자 정의할 수 있다. 예를 들어 기한이 지난 시간 등이다.서명
앞의 두 부분의header와payload에 서명하여 데이터 변조를 방지하다
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
secret은 문자열로 백엔드에 저장됩니다. 주의해야 할 것은 JWT가 영패(token)로서 URL(예를 들어api.example.com/?token=xx)에 넣을 수 있습니다.Base64에는 +,/및 = 세 개의 문자가 있으며 URL에 특별한 의미가 있으므로 = 생략됨, + 는 -,/는 _로 바뀝니다.이것이 바로 Base64URL 알고리즘입니다.7.jwt 사용 방식
HTTP에서 요청한 헤더 정보 Authorization 필드에 Bearer도 정의되어 있습니다.
Authorization: Bearer <token>
URL을 통해 전송(추천하지 않음)
http://www.xxx.com/pwa?token=xxxxx
post 요청이면 요청체에 넣을 수도 있어요.8. koa 프로젝트에서 사용
기존 라이브러리, jwt-simple 또는 jsonwebtoken을 사용할 수 있습니다
let Koa = require('koa');
let Router = require('koa-router');
let bodyparser = require('koa-bodyparser');
let jwt = require('jwt-simple');
let router = new Router()
let app = new Koa();
app.use(bodyparser());
//
let secret = 'zhenglei';
//
router.post('/login',async(ctx)=>{
let {username,password} = ctx.request.body;
if(username === 'admin' && password === 'admin'){
// ,
let token = jwt.encode(username, secret);
ctx.body = {
code:200,
username,
token,
}
}
});
//
router.get('/validate',async(ctx)=>{
let Authorization = ctx.get('authorization')
let [,token] = Authorization.split(' ');
if(token){
try{
let r = jwt.decode(token,secret);
ctx.body = {
code:200,
username:r,
token
}
}catch(e){
ctx.body = {
code:401,
data:' '
}
}
}else{
ctx.body = {
code:401,
data:' '
}
}
});
app.use(router.routes());
app.listen(4000);
let myJwt = {
sign(content,secret){
let r = crypto.createHmac('sha256',secret).update(content).digest('base64');
return this.base64urlEscape(r)
},
base64urlEscape(str){
return str.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '');
},
toBase64(content){
return this.base64urlEscape(Buffer.from(JSON.stringify(content)).toString('base64'))
},
encode(username,secret){
let header = this.toBase64({ typ: 'JWT', alg: 'HS256' });
let content = this.toBase64(username);
let sign = this.sign([header,content].join('.'),secret);
return [header,content,sign].join('.')
},
base64urlUnescape(str) {
str += new Array(5 - str.length % 4).join('=');
return str.replace(/\-/g, '+').replace(/_/g, '/');
},
decode(token,secret){
let [header,content,sign] = token.split('.');
let newSign = this.sign([header,content].join('.'),secret);
if(sign === newSign){
return Buffer.from(this.base64urlUnescape(content),'base64').toString();
}else{
throw new Error(' ')
}
}
}
10.jwt의 장단점이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JavaScript 패키지 관리자 요약ringojs:http://ringojs.org/ , Ringo 는 JVM 기반 자바 스 크 립 트 플랫폼 으로 서버 엔 드 응용 을 최적화 하여 다 중 스 레 드 의 자바 스 크 립 트 프로그램 을 개발 하 는 데...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.