발단

jsonwebtoken을 사용하다보면 자연스레 jwt.sign이라는 함수를 접하게 된다. 

jwt.sign(payload, secretOrPrivateKey, [options, callback])

jwt.sign()은 이런 방식으로 사용할 수 있는데, callback 부분이 모호했다.
이 함수의 콜백에서는 첫 번째 인자로 토큰 생성 실패시 에러, 두 번째 인자로는 생성 완료시 만들어진 토큰이 들어온다. 근데 콜백을 굳이 쓸 이유가 없어보였다.

문제

function sign(id, email, secret) {
  return new Promise((resolve, reject) => {
    jwt.sign({ accountID: id, email: email }, secret, (error, token) => {
      if (error) {
        reject(error);
      } else {
        resolve(token);
      }
    });
  });
}

jwt.sign 함수를 이렇게 사용하는 꼴을 많이 봤다. 
jsonwebtoken 깃헙도 찾아보았으나, 콜백 사용에 대한 뚜렷한 이유가 없어보였다.
기본적으로 프로미스, 콜백이 섞이다보면 가독성이 떨어진다고 느끼는데(내가 많이 초보여서 그럴 수도 있다.),
전부 async await과 같은 패턴으로 만드는 것이 분명히 가능해보였다.

let signedToken

jwt.sign(payLoad, 'secret', (err, token) => {
  if (err) throw err
  console.log(token) // Token logs here successfully
  signedToken = token
  console.log(signedToken) // signedToken logs successfully
})

console.log(signedToken) // logs 'Undefined'

이런 코드에선 오히려 jwt.sign이 완료되기 전에 마지막 라인이 실행되어 Undefined가 출력되는 것도 확인할 수 있었다. (당연하긴 하다.)
어떤 상황에서 콜백을 사용해야 하나 궁금했다.

결론

https://stackoverflow.com/questions/54629127/is-there-a-benefit-to-performing-jwt-operations-as-async

 

Is there a benefit to performing JWT operations as async?

I'm using the highly popular jsonwebtoken package for node. Signing and verifying are typically performed synchronously, but async options are also provided. I thought that the operations involved...

stackoverflow.com

내가 사용하는 환경에선 의미가 없었다.
 
jwt.sign, jwt.vertify의 2번째 인자로 들어가는 비밀키를 비동기적으로 얻을 때. 그 때 만큼은 필요한듯 했다.
키를 얻는데에 시간이 오래 걸리면 다른 작업이라도 먼저 해야하니까 콜백을 사용해서 비동기적으로 처리할 수 있다는데...... 어차피 sign, vertify 이후의 일은 마지막에 인증된 사용자에 대해서 해줄만한 일 아닌가? 
- sign 이후엔 쿠키에 담아서 보내주기, 계정 DB에 저장하기 정도..
- vertify 이후엔 decode된 값과 대조하기 정도..
내 수준에선 이 정도밖에 떠오르지 않았고, 확실한 것은 현재 내 상황에선 의미가 없다는 것이었다.
 
위의 스택오버플로우 글을 보면 crypto 메소드 또한 동기적이라고 하니, 사용법이나 잘 알아두면 되겠다는 생각이 든다.
 
잘못된 부분이 있다면 댓글 부탁드립니다!!

+ Recent posts