🗝️

[小ネタ]WebアプリのセッションIDに情報をセキュアに持たせるライブラリ

2022/02/23に公開

はじめに

セッション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)でも動作しています。
img

さいごに

使い方間違ってたら、ご指摘頂けたらと思います。。

Discussion