본문 바로가기

Node.js/NPM

JSON Web Token이란? 노드에서의 사용 예제

 JSON Web Token, 줄여서 jwt는 서버에서 사용자를 식별할 수 있는 정보를 담아 클라이언트에 내려줄 때 쓰는 토큰이다.

서버가 한 번 인증한 사용자에게 카드키를 준 거라고 생각하면 쉽다.

토큰을 받은 클라이언트는 다음에 따로 인증을 하지 않아도 토큰을 이용해 로그인한 상태로 웹에 접근할 수 있다.

 

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

 

참고 : https://jwt.io/

 

jwt는 세 부분으로 나뉜다.

빨간색 부분은 헤더로 어떤 알고리즘이 적용됐는지 등의 정보가 담겨 있다. 넘어가도 된다.

핑크색 부분은 payload로 실제적인 객체 데이터가 담겨 있다.

 

{
    "sub": "1234567890",
    "name": "John Doe",
    "iat": 1516239022
}

 

토큰을 받고 나서 클라이언트가 서버에 무엇인가 요청을 할 때

인증이 필요한 요청이라면 토큰을 보내고

서버에서는 사용자를 확인할 수 있다.

또한 토큰이 암호화 되어 있으니 사용자의 생일과 같은 정보를 넣어도 좋고

토큰에 사용자에 관한 충분한 정보를 넣었다면

서버에 별도의 요청을 하지 않아도 된다.

클라이언트에서 분홍색 부분을 디코드 하려면 jwt-decode 모듈을 쓰자.

 

하늘색 부분은 인증과 관련된다.

만약 누군가가 클라이언트에 저장된 토큰을 가로채 핑크색 사용자 정보를 조작한 뒤 서버에 접근한다 해도

전체적인 값이 달라지면 서버에 저장된 시크릿 키에 의해 하늘색 부분의 토큰도 달라지기 때문에 막힌다.

오직 서버에서만 유효한 토큰을 제공할 수 있다.

 

 

1. Token 생성하기

 

const jwt = require('jsonwebtoken');

 

const token = jwt.sign({ _id: 1, name: 'socratone' }, 'secretKey');

// 생성된 token을 클라이언트로 보내준다.

res.header('x-auth-token', token).send({/* ... */});

 

 

2. Token을 이용해 인증하기

 

미들웨어로 만들어서 쓴다.

 

const jwt = require('jsonwebtoken');

 

function auth(req, res, next) {

    const token = req.header('x-auth-token'); // 클라이언트에서 헤더로 보낸 토큰을 받는다.

    if (!token) return res.status(401).send('토큰이 없습니다.');

 

    try {

        const decoded = jwt.verify(token, 'secretKey');

        req.user = decoded; // 디코딩이 잘 되면 user 객체에 담아 다음으로 넘겨준다.

        next();

    } catch (ex) {

        res.status(400).send('유효하지 않은 토큰입니다.');

    }

}

 

module.exports = auth;