2019. 10. 30. 22:58ㆍTIL
오늘한일
JWT를 사용한 사용자 인증을 구현하였다.
1.jwt.sign
jwt.sign(
{email: user.dataValues.u_email},
jwtKey.secret,
{expiresIn: '20m'}
)
로그인을 할 때 jwt의 sign 함수를 사용한다. sign 함수는 기본 값으로 HMAC SHA256 알고리즘을 사용한다.
첫 번째 인자
=> payload 즉 내용을 작성하면 된다. 하지만 claim에 대한 정보는 암호화하지 않기 때문에 중요한 정보는 작성하지 않는 것이 좋다.
두 번째 인자
=> secret key를 전달한다.
세 번째 인자
=> 토큰에 대한 정보를 객체로 전달한다.(토큰 시간 등)
암호화된 토큰을 https://jwt.io/ 이 사이트에서 확인해 볼 수 있다.
토큰 값을 Encoded에 넣고 secretKey 값을 VERIFY SIGNATURE에 넣으면 PLAYLOAD 값을 알 수 있다.
2.jwt.verify
유저 정보를 수정하거나 탈퇴를 할 때 토큰 payload로 보내준 email 값이 필요하다.
그냥 토큰 값을 받으면 64자리의 암호화된 문장이기 때문에 이것을 디코딩할 필요가 있다.
jwt.verify를 사용하면 payload값을 추출할 수 있다.
<checkToken.js>
jwt.verify를 미들웨어로 만들어 주었다.
router.use((req, res, next) => {
let token = req.headers.token;
let salt = jwtKey.secret;
if (token) {
jwt.verify(token, salt, (err, token) => {
if (err) res.json(err); // TODO 토큰이 만료되면 로그인 페이지로 리디렉트 필요!
req.token = token;
next();
});
} else {
next();
}
});
첫 번째 인자
=> token값을 전달한다.
두 번째 인자
=> secrectKey 값을 전달한다. 디코딩하기 위해서는 인코딩할 때와 같은 secretKey 값이 필요하다.
<app.js>
client에서 header에 token을 담아 보내면 미들웨어는 순서대로 실행이 되기 때문에 checkToken 함수가 실행이 된다.
checkToken 함수가 실행이 되면서 payload 값을 추출해 낼 수 있고 payload 내의 email 값으로 토큰의 주인을 찾아 해당 사용자의 정보를 수정할 수 있다.
app.use(cors());
app.use(bodyparser.json());
app.use(bodyparser.urlencoded({extended: true}));
app.use(checkToken)
app.use("/users", users)
'TIL' 카테고리의 다른 글
[TIL]11.01 front- flow (0) | 2019.11.01 |
---|---|
[TIL]10.31 Rest API (0) | 2019.10.31 |
[TIL] 10.29 crpyto, user table 재설정 (0) | 2019.10.30 |
[TIL] mysql 찝찝한 해결, migration/seed, crpyto 암호화 (0) | 2019.10.28 |
[TIL] 10.27 mysql server open error (0) | 2019.10.27 |