ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Node.js[JWT] - 토큰 기반 인증 - 2
    Node.js 2018. 3. 24. 17:01






    - Token 인증방식



    REST API에서 로그인은 일반적인 로그인과 다른 방식을 가진다.


    일반적으로 로그인은 서버의 session을 통해 이루어지는데, 서버는 접속중인 클라이언트들을 이 session을 통해 관리한다.

    사이트에 접속하면 session에 해당 클라이언트가 기록되고 로그인을 하게 되면 해당 클라이언트가 로그인한 것을 저장하게 된다.

    이후 해당 클라이언트는 로그인이 요구되는 정보에 접근할수 있게 된다.

    이 방식은 접속자수가 늘어나면 서버의 메모리 사용량이 증가하게 되고 성능에 영항을 미친다.


    REST API에서는 서버가 session을 가지는 방식이 아닌 Token 인증 방식을 사용한다.


    로그인 API로 아이디와 패스워드가 일치함이 확인되면 서버는 토큰을 발행하고, 로그인후 이용가능한 API들에는 유효한 토큰이 있는 경우에만 사용할수 있게 한다. 토큰인증방식의 대표적인 방법으로 JWT(JSON Web Token)에 대해서 알아보도록 하자.




    - JWT



    -    웹표준 으로서 두 개체에서 JSON 객체를 사용하여 가볍고 자기수용적인 방식으로 정보를 안전성있게 전달한다.


    자기 수용적인 방식?


    JWT 는 필요한 모든 정보를 자체적으로 지니고 있다.

    JWT 에서 발급된 토큰은 토큰에 대한 기본정보(Header), 전달할 정보(유저정보)(payload), JWT 해쉬의 생성과 해독을 위한 키(signature) 로 구성되어 있다.


    안전성있게 전달된다?


    전달방식은 웹서버의 경우 HTTP 의 헤더에 넣어서 전달 하거나 URL의 파라미터로 전달할수 있다.



    JWT - Header


    Header는 두가지 정보를 지니고 있다.

    typ : 토큰의 타입 - JWT

    alg : 해싱 알고리즘 - HMAC SHA256(HS256) , RSA 



    JWT - payload


    Payload는 토큰에 담을 정보가 들어있다.

    여기에 담는 정보의 한 '조각'을 Claim 이라고 부르며 이는 key / value 의 한쌍으로 이루어져 있다.

    Claim에는 세 분류로 되어 있으며



    등록된(registered) Claim

    공개(public) Claim

    비공개(private) Claim


    }


    1. 등록된(registered) Claim


    서비스에서 필요한 정보들이 아닌, 토큰에 대한 정보들을 담기위하여 이름이 이미 정해진 Claim 이다.

    iss(발행자) , exp(만료 시간), sub(주제) 등의 정보가 포함되어있다.


    2. 공개(public) Claim


    공개 Claim들은 충돌이 방지된 (collision-resistant) 이름을 가지고 있어야한다. 

    충돌을 방지하기 위해서는, Claim 이름을 URI 형식으로 짓는다.


    3. 비공개(private) Claim


     서비스에 필요한 정보가 들어간다고 보면 된다. 회원 정보(유저 ID, 유저 PW, 유저 nickname 등)

     


    JWT - signature


    Signature 에서 Header 의 인코딩값과 payload 의 인코딩 값을 합친 후 비밀키로 해쉬를 하여 생성한다.



    생성된 토큰값의 형식의 예



    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.XbPfbIHMI6arZ3Y922BhjWgQzWXcXNrz0ogtVhfEd2o



    https://jwt.io/#debugger 에서 확인해보면 알수 있다.




    - Node.js & JWT



    로그인 기능이 구현되어있는 코드에서 JWT를 어떻게 사용하는지에 대해 알아보자.


    1. jsonwebtoken 모듈 설치,적용



     

    npm install jsonwebtoken --save 


    const jwt = require('josonwebtoken')




    2. login Router 안에 jwt 발급을 위한 코딩


    jwt.sign 함수 사용


    param1 :  payload(유저 정보)


    ex) tokenId : 유저 아이디 , tokenNickName : 유저 닉네임

    {
    tokenId: rows[0].userId,
    tokenNickName: rows[0].userNickName
    }

    param2 :  secretOrPrivateKey(hash 생성에 사용되는 key 문자열)


    발급과 검증을 위해 사용되는 비밀키


    ex) "MySecret"



    param3 :  options(hash 생성 알고리즘, token 유효기간등)을 설정 


    ex) algorithm : "HS256" , expiresln : "24h"

    {
    algorithm: "HS256",

    expiresIn: "24h"

    }

    param4 : Callback 함수 token 생성후 실행되는 함수이다. error와 token 문자열을 파라미터로 사용한다


    ex)

    (err, token) => {
    if (err) reject(err)
    resolve(token)
    }

    3. verify Router 코딩


    클라이언트에 HTTP 의 헤더를 통해 전달된  토큰값로 저장


     

    let token = req.headers['x-access-token']





    토큰이 없다면

    if (!token) {
    return res.status(403).json({
    success: false,
    message: 'not logged in'
    })
    }

    토큰이 있다면


    jwt.verify 함수 사용


    토큰 hash를 확인하고 토큰에 들어있는 정보를 해독


    param1 : token 값


    param2 :  secretOrPrivateKey(hash 생성에 사용되는 key 문자열)


    parma3 : Callback 함수 token 검증후 실행되는 함수이다. error와 decoded 문자열을 파라미터로 사용한다


    ex)

    jwt.verify(token,"MySecret",(err,decoded)=>{

    if(err) reject(err);
    resolve(decoded)
    })



    토큰발급과 검증은  Postman 으로 확인


    < 로그인에 성공할시 Token 발급 >



    < Token 전달시 검증 >




    https://jwt.io/

    https://velopert.com/2389

    https://www.a-mean-blog.com/ko/blog/Node-JS-API/_/JWT-JSON-Web-Token-%EB%A1%9C-%EB%A1%9C%EA%B7%B8%EC%9D%B8-REST-API-%EB%A7%8C%EB%93%A4%EA%B8%B0


    'Node.js' 카테고리의 다른 글

    Node.js - Webpack  (0) 2018.08.09
    Node.js - Babel  (0) 2018.08.07
    Node.js[2] - Event Loop, 주의사항  (0) 2018.04.01
    Node.js[JWT] - 토큰 기반 인증 - 1  (0) 2018.02.24
    Node.js[1] - Single thread,Async,Callback  (0) 2018.02.16
Designed by Tistory.