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;
'Node.js > NPM' 카테고리의 다른 글
익스프레스의 각 라우트에 자동으로 예외처리를 해주는 모듈 (0) | 2020.07.07 |
---|---|
bcrypt의 작동원리와 노드에서 사용하는 방법 (1) | 2020.07.06 |
회원 가입시 복잡한 패스워드만 등록 가능하게 해주는 노드 모듈 - joi (0) | 2020.07.06 |
npm 유용한 명령어들 (0) | 2020.07.03 |
사용자가 입력한 값의 유효성을 판단해주는 노드 모듈 - hapi/joi (0) | 2020.06.22 |