Node.JS는 JWT 원리를 어떻게 실현합니까

7414 단어 Node.JSJWT원리
1. 세션 관리가 필요한 이유
우리가 nodejs로 전단이나 다른 서비스에resful 인터페이스를 제공할 때 http 프로토콜은 무상태 프로토콜입니다. 때때로 이 요청에 따라 구체적인 사용자가 권한을 가지고 사용자의 상하문에 대해 조작해야 합니다.그래서 쿠키 세션과 jwt라는 몇 가지 기술의 출현은 모두 HTTP 프로토콜에 대한 보충이다.HTTP 프로토콜 + 상태 관리로 사용자를 위한 WEB 응용 프로그램을 구축할 수 있습니다.
2.session 및 쿠키
session과 cookies는 관련이 있습니다. session은 서비스 측이 클라이언트 cookies에 심은 session_id, 서버 저장 session_id에 대응하는 현재 사용자의 모든 상태 정보입니다.클라이언트가 서비스 측에 요청할 때마다 쿠키의session_id, 서비스 측은 구체적인 사용자 정보가 있는지 판단하고 없으면 로그인을 조정합니다.
  • 쿠키 보안이 좋지 않아 공격자는 로컬 쿠키를 획득하여 사기를 치거나 쿠키를 이용하여 CSRF 공격을 할 수 있습니다
  • 쿠키는 여러 도메인 이름 아래에서 크로스 도메인 문제가 존재합니다
  • session의 정보는 서버에 저장되어 있습니다.js는 stke에 여러 대의 기계를 배치할 때 공유session을 해결해야 하기 때문에session의 지속화 문제를 야기하기 때문에session은 분포식 구조를 지원하지 않고 가로 확장을 지원할 수 없으며 데이터베이스를 통해 세션 데이터를 저장하여 공유할 수 있습니다.지구층이 실패하면 인증 실패가 발생합니다.
  • 3.jwt의 정의
    jwt는 json 웹 token의 전칭이다. 그는session 이상의 문제를 해결했다. 장점은 서버가 어떤 세션 데이터도 저장하지 않는다는 것이다. 즉, 서버가 무상태로 변하여 더욱 쉽게 확장할 수 있다는 것이다. 어떤 상황에서 jwt를 사용하는 것이 비교적 적합하다고 생각한다. 나는 이 장면을 권한을 부여하는 것이다. 왜냐하면 jwt는 사용이 가볍고 비용이 적으며 백엔드가 무상태이기 때문에 사용이 비교적 광범위하다고 생각한다.
    4.jwt의 원리
    JWT의 원리는 서버 인증 후에 JSON 대상을 생성하여 사용자에게 보내는 것이다. 아래와 같다.
    
    {
     " ": " ",
     " ": " ",
     " ": "2018 7 1 0 0 "
    }
    
    나중에 사용자가 서버와 통신할 때 이 JSON 대상을 반환해야 합니다.서버는 완전히 이 대상만으로 사용자의 신분을 인정한다.사용자가 데이터를 왜곡하는 것을 방지하기 위해 서버는 이 대상을 생성할 때 서명을 추가합니다.
    5.jwt의 인증 절차
    프로세스 설명:
  • 브라우저가 로그인을 요청하고 사용자 이름과 비밀번호를 지참합니다
  • 서비스 측은 사용자 이름과 코드에 따라 데이터베이스에 가서 신분을 검증하고 알고리즘에 따라 사용자 식별자를 패키지로 token을 생성한다
  • 서버가 브라우저에 JWT 정보를 되돌려줍니다. JWT는 민감한 정보를 포함해서는 안 됩니다. 이것은 매우 중요한 점입니다
  • 브라우저는 사용자 자료를 요청하여 방금 받은 토큰을 서버에 발송합니다. 일반적으로header에 넣고 필드는authorization입니다
  • 서버에서 데이터에 token, decode token의 정보가 있는 것을 발견하고 다시 서명하여 정체를 확인한다
  • 서버가 이 사용자의 사용자 자료를 되돌려줍니다
  • 서버는payload에서 만료 시간을 설정할 수 있으며, 만료되면 클라이언트가 다시 인증을 시작할 수 있습니다
  • 6.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);
    
  • 두 개의 인터페이스를 실현하는데 하나는/login 인증이 로그인 여부이고, 하나는validate입니다. 권한이 있는지 검증합니다
  • 로그인 인터페이스를 요청할 때 클라이언트는username과password를 가지고 백엔드는 일반적으로 데이터베이스를 검사하여 현재 사용자가 존재하는지 검증한다. 만약에 존재한다면username에 서명을 하고 이 민감한 정보도 서명하지 마라
  • 클라이언트가 백엔드에서 token 영패를 받고 다른 인터페이스를 요청합니다. 예를 들어 이 예의/validate를 요청할 때ajax가 요청할 때header에서 authorization 필드를 지정하고 백엔드에서 token을 받아서 decode를 한 다음에header와payload를 다시 한 번 서명할 수 있습니다. 만약에 앞뒤의 서명이 일치하면 변경되지 않았다는 것을 설명할 수 있습니다. 권한 검증이 통과됩니다.동기화 과정이기 때문에trycatch로 오류를 포착할 수 있습니다
  • 9. 원리의 실현
  • sha256 해시 알고리즘은 nodejs의 내장 암호화 모듈crypto로 base64 문자열을 생성할 수 있습니다. 주의해야 할 것은base64를 생성하려면 +-=로 교체해야 합니다. =생략되고, +로 교체되고,/로 교체해야 합니다.이것이 바로 Base64URL 알고리즘입니다..
  • 토큰 영패의 구성은 헤더,payload와sigin의 통과이다.구성하다
  • base64urlUnescape의 디코딩은 고정 쓰기이고 decode는 base64의 내용을 출력합니다
  • 
    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의 장단점
  • JWT는 기본적으로 암호화되지 않지만 암호화할 수 있습니다.원본 토큰이 생성되면 토큰을 사용하여 다시 암호화할 수 있습니다
  • JWT가 암호화되지 않은 방법은 일부 비밀 데이터가 JWT를 통해 전송될 수 없다는 것이다
  • JWT는 인증뿐만 아니라 정보 교환에도 사용할 수 있다.JWT를 잘 사용하면 서버가 데이터베이스를 요청하는 횟수를 줄이는 데 도움이 된다..
  • JWT의 가장 큰 단점은 서버가 세션 상태를 저장하지 않기 때문에 사용 기간에 영패의 권한을 취소하거나 변경할 수 없다는 것이다.즉, 일단 JWT가 서명 서명을 하면 유효기간 내에 계속 유효할 것이다..
  • JWT 자체는 인증 정보를 포함하기 때문에 정보가 유출되면 누구나 영패의 모든 권한을 얻을 수 있다.도용을 줄이기 위해서 JWT의 유효기간을 너무 길게 설정하는 것은 좋지 않다.어떤 중요한 조작에 대해 사용자는 사용할 때 매번 신분 검증을 해야 한다..
  • 도용과 절도를 줄이기 위해 JWT는 HTTP 프로토콜을 사용하여 코드를 전송하는 것을 권장하지 않고 암호화된 HTTPS 프로토콜을 사용하여 전송합니다
  • 지금까지 노드였습니다.JS가 JWT 원리를 어떻게 실현하는지에 대한 상세한 내용은 Node에 관한 것이다.JS가 JWT의 원리를 실현하는 자료는 우리의 다른 관련 문장을 주목하세요!

    좋은 웹페이지 즐겨찾기