리액트(프론트엔드)에서 기존에 사용하던 ^8.5.1이 높은 보안이슈가 있길래 최신으로 업데이트 했더니 sign이 안되는 현상이 발견됐다…
typescript
해당 보안이슈 메시지
bash
깃허브에 방문해보니 jsonwebtoken은 브라우저에서 사용하게 할 의도는 없었다고 한다. js번들 크기를 증가키시기 때문에 다른 모듈을 사용하라고 함.
gzipped만 봐도 용량이 커보이긴 한다.
Solution
node의 내장 crypto 모듈을 이용해서 sign, base64UrlFromBase64 구현
typescript
💡
base64url란?
base64는 인코딩 할 때 url에서 사용하는 +, / 이 2개가 포함되어 있어서 안전하지 않으니 -, _로 대체한 방식이다. 추가로 base64에서는 6 bit로 떨어지지 않으면 마지막에 =문자를 추가하는데 = 문자도 제거해서 안전하게 만들면 base64url 완성
- header, payload, signature를 .으로 이어주면 JWT완성
Try
https://jwt.io/에서 간단히 Verify테스트해볼 수 있다.
- Signature 부분에 키를 넣는다.
- Encoded 부분에 sign에서 나온 문자열을 넣는다.
Signature Verified가 뜨면 정상적으로 동작한다고 보면 됨.
jsonwebtoken모듈 삭제로 인해 빌드해보면 16kb정도 줄었다.
Buffer객체에 toString에 base64url이 있긴 한데 처음엔 됐다가 안되던데 왜 그런진 모르겠다.