[TIL] 10.30 JWT 사용자 인증

2019. 10. 30. 22:58TIL

오늘한일

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 값을 알 수 있다. 

 

jwt 확인

 

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