JavaScriptにAPIキーを直書きしてしまうと、誰でも簡単にそのAPIキーを取得できるため、セキュリティ上非常に危険です。APIキーを安全に管理するためのチェックリスト

JavaScriptにAPIキーを直書きしてしまうと、誰でも簡単にそのAPIキーを取得できるため、セキュリティ上非常に危険です。APIキーの盗難を防ぐためには、以下の方法を検討してください。


### 解決方法

1. **APIキーをサーバーサイドで管理する**  

   クライアントサイド(ブラウザ)にAPIキーを埋め込まず、サーバーサイド(バックエンド)でAPIキーを管理します。クライアントからは、サーバーにリクエストを送り、サーバーが代わりにGPT-4 APIを呼び出してその結果を返す形にします。


2. **プロキシサーバーを設置する**  

   プロキシサーバーを作成し、クライアントからプロキシサーバーを経由してAPIリクエストを行う方法です。プロキシサーバーがAPIキーを使用してAPIを呼び出し、クライアントに結果を返します。


3. **環境変数でAPIキーを管理する**  

   サーバーサイドでAPIキーを環境変数に設定し、コード上には直接記載しないようにします。こうすることで、APIキーが漏洩するリスクを減らします。


### 必要なもの

- **サーバーサイドの設定**: Azure上でサーバーサイドのコードを実行できる環境を設定します。例えば、Azure FunctionsやAzure App Serviceなどを使用できます。

- **APIキーの管理**: Azure Key Vaultを使用してAPIキーを安全に管理することができます。サーバーサイドのコードからKey VaultにアクセスしてAPIキーを取得します。


### 修正の手順

1. **バックエンドの構築**:

   - Azure FunctionsやAzure App Serviceを使用して、サーバーサイドのAPIエンドポイントを構築します。

   - このエンドポイントが、クライアントからのリクエストを受け取り、GPT-4 APIを呼び出し、その結果を返す役割を果たします。


2. **APIキーの管理**:

   - Azure Key VaultにAPIキーを保存します。

   - サーバーサイドのコードで、Azure Key VaultからAPIキーを取得して使用します。


3. **フロントエンドの修正**:

   - 現在JavaScriptに直書きしている部分を、サーバーサイドのエンドポイントにリクエストを送る形に修正します。


### サンプルコード

以下は簡単なサンプルコードです。


#### バックエンド (Node.js + Express)

```javascript

const express = require('express');

const axios = require('axios');

const { DefaultAzureCredential } = require('@azure/identity');

const { SecretClient } = require('@azure/keyvault-secrets');


const app = express();

const port = process.env.PORT || 3000;


const credential = new DefaultAzureCredential();

const vaultName = "your-keyvault-name";

const url = `https://${vaultName}.vault.azure.net`;

const client = new SecretClient(url, credential);


async function getAPIKey() {

  const secret = await client.getSecret("your-api-key-secret-name");

  return secret.value;

}


app.use(express.json());


app.post('/api/gpt4', async (req, res) => {

  try {

    const apiKey = await getAPIKey();

    const response = await axios.post('https://api.openai.com/v1/engines/gpt-4/completions', {

      prompt: req.body.prompt,

      max_tokens: req.body.max_tokens

    }, {

      headers: {

        'Authorization': `Bearer ${apiKey}`

      }

    });

    res.json(response.data);

  } catch (error) {

    res.status(500).send(error.toString());

  }

});


app.listen(port, () => {

  console.log(`Server running on port ${port}`);

});

```

ここから先は

2,039字

¥ 1,500

期間限定!Amazon Payで支払うと抽選で
Amazonギフトカード5,000円分が当たる

この記事が気に入ったらチップで応援してみませんか?