Go 言語で JWT (JSON Web Tokens) を処理したい。
以前に書いたコードを見直す機会があって調べたら状況が変化していたので記録に残しておきます。
特に記載がない限り 2021 年 3 月 14 日時点の情報になります。
調査対象
- https://github.com/dgrijalva/jwt-go
- https://github.com/square/go-jose
- https://github.com/lestrrat-go/jwx
このうち実際に使ったことがあるのは dgrijalva/jwt-go と square/go-jose です。
dgrijalva/jwt-go
最終リリース: v3.2.0 (2018 年 3 月 9 日)
dgrijalva/jwt-go (fork を含む) を使用しているリポジトリの例
- https://github.com/auth0/go-jwt-middleware
- https://github.com/etcd-io/etcd
- https://github.com/go-kit/kit
- https://github.com/ory/hydra
Go で JWT を処理する場合の定番だと思います。
古くからあるパッケージで GCP 向けの拡張 も公開されているので重宝していました。
ただし、2020 年 1 月 7 日を最後にリポジトリは更新されてません。
fork したうえで脆弱性 (CVE-2020-26160) 1 を修正したリポジトリも公開されておりこちらに切り替えているケースもあるようです。 2 3
dgrijalva/jwt-go を使用している場合は form3tech-oss/jwt-go に移行したほうがよさそうです。
I/F は変わっていないので import を書き換えるか go.mod の replace を指定すれば移行できるはずです。
(2021 年 9 月 5 日追記) dgrijalva/jwt-go および form3tech-oss/jwt-go のリポジトリはアーカイブ化されました。
両者ともコミュニティによってメンテナンスされている新しいリポジトリである golang-jwt/jwt を案内しています。
golang-jwt/jwt にはセキュリティ修正のほか Ed25519 サポートや go.mod サポートが追加されていますが go.mod で Go 1.15 以上を要求しているため環境によっては使用できないかもしれません。
square/go-jose
最終リリース: v2.5.1 (2020 年 5 月 1 日)
square/go-jose を使用しているリポジトリの例
- https://github.com/coreos/go-oidc
- https://github.com/docker/hub-tool
- https://github.com/HashiCorp/vault
- https://github.com/kubernetes/kubernetes
- https://github.com/ory/hydra
Ed25519 や JWK (JSON Web Key) を利用したくて見つけました。
ただし、現時点では master からコードがすべて削除されています。 4 5
v3 を開発するためにリポジトリを https://github.com/go-jose/go-jose に移行したようですがこちらも更新されていないようです。
※ master は v3 を開発していたブランチですので v2 を利用している場合は影響を受けません。
lestrrat-go/jwx
最終リリース: v1.1.5 (2021 年 3 月 12 日)
dgrijalva/jwt-go や square/go-jose の Issue コメントで紹介されていました。
機能も豊富で継続的にメンテナンスされているようですが Ed25519 サポートは実験的という扱いになります。
go.mod で Go 1.15 以上を要求しているため環境によっては使用できないかもしれません。
まとめにならないまとめ
メンテナンスされなくなったことに (自分が) 全く気が付いていなかったことに驚きました。
依存パッケージ更新は Dependabot の力を借りたりしているのですがそもそも更新されていないので気が付くこともなく。
問題なく動いているように見えてもたまに既存処理を見直すことは重要かもしれません。