발단

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 메소드 또한 동기적이라고 하니, 사용법이나 잘 알아두면 되겠다는 생각이 든다.
 
잘못된 부분이 있다면 댓글 부탁드립니다!!

발단

내가 만든 JWT 토큰은 카테캠에서 실습할 때와 다르게 Bearer 키워드가 앞에 없었다. 나도 Bearer 토큰을 만들고 싶었다.

문제

chatGPT에게 내가 현재 JWT로 토큰을 생성하고 있는데, Bearer 키워드가 붙은 토큰으로 만들어달라고 했다.
근데 이런 답변을 받았다.
’Bearer ‘ 문자열을 앞에 덧붙이라는 응답이었다.

예, Bearer 쿠키를 반환하려면 Express에서 res.cookie() 메서드를 사용하여 아래와 같이 구현할 수 있습니다.

javascriptCopy code
const express = require('express');
const app = express();

app.get('/set-cookie', (req, res) => {
  const token = 'your_generated_token';
  res.cookie('access_token', `Bearer ${token}`, { httpOnly: true, maxAge: 1000 * 60 * 60 * 24 * 7 });
  res.send('쿠키가 성공적으로 설정되었습니다!');
});

app.listen(3000, () => {
  console.log('서버가 <http://localhost:3000> 에서 실행 중입니다.');
});

이 예제에서는 클라이언트가 /set-cookie 엔드포인트로 요청을 보내면 서버가 access_token 쿠키를 설정하고, Bearer 스키마를 포함하여 해당 토큰 값을 반환합니다. 쿠키는 maxAge 옵션에 지정된 기간 동안 유효하며, httpOnly 옵션으로 인해 JavaScript를 통해 접근할 수 없으므로 특정 유형의 공격으로부터 보다 안전합니다.

결론

Bearer 키워드는 그냥 상호간의 약속이었다.
따로 Bearer JWT를 만드는 방법이 있다던가, 하는 것은 없었다.
다른 타입의 Authorization과 비교, 식별하기 위해서 사용하는 키워드였다.

추가적으로 Bearer는 '옮기는 사람' 과 같은 의미를 갖고 있다고 한다.

다른 키워드는 이 링크에 더 있다.

스택 오버플로우 글은 여기에 있다.

+ Recent posts