🗝️
[小ネタ]WebアプリのセッションIDに情報をセキュアに持たせるライブラリ
はじめに
セッションIDを復号してuserIdや期限情報が取得できれば、RDBMSやKVSで紐付けしなくてよいため、結果ネットワークI/Oが減りパフォーマンスメリットが大きいです。
vvo/iron-sessionが便利そうだなと思いつつも、Next.jsやExpress, Fastifyといったフレームワークから使われることが想定されており、AWS Lambdaで使いたい場合に使えそうな関数が見つかりませんでした。
セッションIDを生成するコア部は@hapijs/ironなので、こちらを活用することで任意の場所で呼び出すことができます。
AWS LambdaのランタイムNode.js 14.Xでは動作確認済みです。
使い方
@hapi/iron公式から拝借します。
ライブラリの導入
yarn add @hapi/iron
最低32文字以上の文字列(パスワード)を指定してセッションIDを生成します。パスワードはキーストアで管理するのが良いでしょう。
暗号化して復号化するサンプル
import * as Iron from '@hapi/iron';
const main = async () => {
const obj = {
a: 1,
b: 2,
c: [3, 4, 5],
d: {
e: 'f',
},
};
const password = 'some_not_random_password_that_is_at_least_32_characters';
try {
const sealed = await Iron.seal(obj, password, Iron.defaults);
console.log(sealed);
const unsealed = await Iron.unseal(sealed, password, Iron.defaults);
console.log(unsealed);
} catch (err) {
console.log(err.message);
}
};
main().then(() => console.log('Success!'));
$ yarn ts-node src/h-api-iro/index.ts
# seal
Fe26.2**70a5e00e53b52fc23f74487a8c29ce555343a4b137e61377f1811a8ec3c7f332*hpCHKzlUapLmHsZF7qCHgQ*OcUgZ5TNIZagZftUeDGSrQIVrN5LK9pOONXyHjW6S6DfUi8RZi3eu3Tc4rcpftra**a13a0e731e45fdfc4287a95cdb7aac09fc0db10dd0a023ea735ff180bcee0457*cksLUdsRDoiKtanQWzNXt_KmL_VDBCsIuLt0PI0mrYY
# unseal
{ a: 1, b: 2, c: [ 3, 4, 5 ], d: { e: 'f' } }
当然ですが、AWS Lambda(Node 14.X)でも動作しています。
さいごに
使い方間違ってたら、ご指摘頂けたらと思います。。
Discussion