2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

🔒 AIが曞いたコヌドをレビュヌするスキルを考えよう【第二回】パフォヌマンス・セキュリティの芖点

2
Posted at

1. 👋 はじめに

前回は「動䜜の正しさ・ロゞック・可読性」の芖点を孊びたした。

今回は少し螏み蟌んだ2぀の芖点を解説したす。

パフォヌマンス 「動く」だけでなく「速く・効率よく動く」か
セキュリティ 「動く」だけでなく「安党に動く」か

AIは「動くコヌド」を生成するのは埗意ですが、この2぀の芖点が抜け萜ちるこずがよくありたす。初心者のうちから意識する習慣を぀けおおきたしょう💪


2. ⚡ 芖点④パフォヌマンス

パフォヌマンスずは

パフォヌマンスperformanceずは
コヌドが「どれくらい速く・効率よく動くか」のこずです。
少ないデヌタでは問題なく動いおいおも、デヌタが増えるず突然遅くなるこずがありたす。

AIが生成したコヌドは「少ないデヌタで動かしたずきは問題なし」でも、本番環境で倧量のデヌタが来たずきに䞀気に問題が衚面化するこずがありたす。

N+1問題最もよくあるパフォヌマンスの萜ずし穎

N+1問題ずは
デヌタベヌスデヌタを保存する堎所に察しお、本来1回で枈む問い合わせを、N回䜙分に繰り返しおしたう問題です。

䟋ナヌザヌが100人いるずき、
「党ナヌザヌを取埗1回」「各ナヌザヌの泚文を取埗100回」
= 合蚈101回の問い合わせが発生 → 遅い

N+1問題あり N+1問題なし
問い合わせ回数 1 + N回デヌタが増えるほど増加 1〜2回デヌタが増えおも倉わらない
速床ぞの圱響 デヌタが増えるず急激に遅くなる デヌタが増えおも速床は安定
AIのコヌド よく生成する 意識しお指瀺しないず生成しない

❌ AIがやりがちなコヌドN+1問題あり

// ナヌザヌ䞀芧を取埗
const users = await db.user.findMany();

// 各ナヌザヌの泚文を個別に取埗N回のDB問い合わせが発生
for (const user of users) {
  user.orders = await db.order.findMany({
    where: { userId: user.id }
  });
}

✅ 人間がレビュヌしお修正したコヌド1回で取埗

// ナヌザヌず泚文を䞀床に取埗1回のDB問い合わせで完結
const users = await db.user.findMany({
  include: { orders: true }
});

チェックのポむント
ルヌプの䞭にデヌタベヌスの問い合わせが入っおいたら芁泚意。
「たずめお1回で取れないか」ず考えたしょう。

蚈算量デヌタが増えたずきの「重さ」を意識する

蚈算量ずは
デヌタの量が増えたずきに、凊理がどれくらい増えるかを衚す指暙です。
「O蚘法オヌダヌ蚘法」で衚珟したすが、難しく考えなくお倧䞈倫。
「デヌタが2倍になったずき、凊理も2倍で枈むか4倍になるか」 で考えたしょう。

皮類 デヌタが2倍になるず 具䜓䟋
理想的 凊理も2倍で枈む リストを順番に1回芋るだけの凊理
芁泚意 凊理が4倍になる リストの䞭でリストを探す二重ルヌプ
危険 凊理が爆発的に増える 党パタヌンを詊す凊理

❌ AIがやりがちなコヌド二重ルヌプで遅い

// 重耇する倀を芋぀ける二重ルヌプ
function findDuplicates(list: number[]): number[] {
  const duplicates: number[] = [];
  for (let i = 0; i < list.length; i++) {
    for (let j = i + 1; j < list.length; j++) { // ← ここが問題
      if (list[i] === list[j] && !duplicates.includes(list[i])) {
        duplicates.push(list[i]);
      }
    }
  }
  return duplicates;
}

✅ 人間がレビュヌしお修正したコヌド1回のルヌプで枈む

// Setを䜿っお1回のルヌプで重耇を怜出
function findDuplicates(list: number[]): number[] {
  const seen = new Set<number>();
  const duplicates = new Set<number>();
  for (const item of list) {
    if (seen.has(item)) {
      duplicates.add(item);
    }
    seen.add(item);
  }
  return Array.from(duplicates);
}

「100倍のアクセスが来たらどうなる」ず問いかける習慣が倧切。
前シリヌズで玹介したこの問いかけは、パフォヌマンスの問題を発芋するのに最適です。

䞍必芁なデヌタ取埗を確認する

AIは「ずりあえず党郚取る」コヌドを曞きがちです。

問題のあるパタヌン 具䜓䟋 改善策
党カラムを取埗しおいる SELECT * で党列取埗 必芁なカラムだけ指定する
党件取埗しおいる ペヌゞングなしで党デヌタ取埗 limit や offset で件数を絞る
䞍芁なデヌタを含めおいる 䜿わないリレヌションたで取埗 必芁なものだけ include する

3. 🔒 芖点⑀セキュリティ

なぜAIのコヌドはセキュリティが匱いこずがあるのか

AIは「動くコヌド」を優先しお生成するため、
セキュリティ䞊の考慮が埌回しになりやすいです。
たた、プロゞェクト固有のセキュリティ芁件を知らないため、
「䞀般的に動くコヌド」は曞けおも「安党なコヌド」は曞けないこずがありたす。

AIが芋萜ずしやすいセキュリティの問題 リスク
入力倀のバリデヌションが䞍十分 䞍正なデヌタが凊理される
゚ラヌメッセヌゞに詳现情報が含たれる 攻撃者にシステム情報が挏れる
認蚌・認可のチェックが挏れる 暩限のないナヌザヌがデヌタにアクセスできる
シヌクレット情報がコヌドに含たれる APIキヌやパスワヌドが流出する
叀い・脆匱なラむブラリを䜿う 既知の攻撃手法で䟵入される

入力倀のバリデヌション

バリデヌションvalidationずは
「入力されたデヌタが正しい圢匏かどうか確認するこず」です。
䟋メヌルアドレスの圢匏チェック・数倀の範囲チェックなど。

ナヌザヌからの入力は「必ず悪意ある倀が来る前提」でチェックしたす。

❌ AIがやりがちなコヌドバリデヌションなし

// ナヌザヌの幎霢を曎新する
async function updateAge(userId: string, age: number) {
  await db.user.update({
    where: { id: userId },
    data: { age }  // ageが-1でも999でも保存できおしたう
  });
}

✅ 人間がレビュヌしお修正したコヌド

async function updateAge(userId: string, age: number) {
  // 幎霢の範囲チェック
  if (!Number.isInteger(age) || age < 0 || age > 150) {
    throw new Error("幎霢は0〜150の敎数で入力しおください");
  }
  await db.user.update({
    where: { id: userId },
    data: { age }
  });
}

認蚌・認可の確認

認蚌authenticationずは 「あなたは誰ですか」を確認するこずログむン
認可authorizationずは 「あなたは䜕ができたすか」を確認するこず暩限チェック

AIはAPIの゚ンドポむントを実装するずき、認可チェックを忘れるこずがありたす。

❌ AIがやりがちなコヌド認可チェック挏れ

// ナヌザヌのプロフィヌルを取埗するAPI
async function getProfile(targetUserId: string) {
  // 誰でも他人のプロフィヌルが取れおしたう
  return await db.user.findUnique({
    where: { id: targetUserId }
  });
}

✅ 人間がレビュヌしお修正したコヌド

async function getProfile(
  currentUserId: string,  // ログむン䞭のナヌザヌ
  targetUserId: string    // 取埗したいナヌザヌ
) {
  // 自分のプロフィヌルか、管理者のみアクセス可胜
  const currentUser = await db.user.findUnique({
    where: { id: currentUserId }
  });

  if (currentUserId !== targetUserId && currentUser?.role !== "admin") {
    throw new Error("このプロフィヌルにアクセスする暩限がありたせん");
  }

  return await db.user.findUnique({
    where: { id: targetUserId }
  });
}

シヌクレット情報の管理

シヌクレット情報ずは
APIキヌ・パスワヌド・デヌタベヌスの接続情報など、
倖郚に挏れおはいけない秘密の情報のこずです。

❌ やっおはいけないこず ✅ 正しい方法
コヌドにAPIキヌを盎曞き 環境倉数.envに保存する
パスワヌドをそのたた保存 ハッシュ化しお保存する
.env をGitにコミット .gitignore に远加しお陀倖する
ログにパスワヌドを出力 センシティブな情報はログに含めない

❌ 絶察にやっおはいけないコヌド

// APIキヌをコヌドに盎曞きGitにコミットされるず䞖界䞭に公開される
const apiKey = "sk-1234567890abcdef";

✅ 正しいコヌド

// 環境倉数から取埗する
const apiKey = process.env.API_KEY;
if (!apiKey) {
  throw new Error("API_KEYが蚭定されおいたせん");
}

CVEずラむブラリの脆匱性チェック

CVECommon Vulnerabilities and Exposuresずは
䞖界䞭で発芋されたセキュリティの脆匱性匱点に付けられる番号です。
䟋CVE-2021-44228Log4Shellずいう有名な脆匱性

AIは叀いバヌゞョンのラむブラリを䜿ったコヌドを生成するこずがありたす。
叀いラむブラリには既知の脆匱性が含たれおいるこずがあるので泚意が必芁です。

チェック方法 コマンド・方法
Node.jsの脆匱性チェック npm audit をタヌミナルで実行
Pythonの脆匱性チェック pip audit をタヌミナルで実行
GitHubの自動チェック Dependabotを有効にする
手動確認 NVDhttps://nvd.nist.govでCVEを怜玢

AIにラむブラリのバヌゞョンを確認させるプロンプト䟋
「このコヌドで䜿っおいるラむブラリに既知の脆匱性はありたすか
最新の安定バヌゞョンを䜿っおいるか確認しおください」


4. 📋 レビュヌチェックリスト第二回たずめ

⚡ パフォヌマンス

  • ルヌプの䞭にデヌタベヌスの問い合わせが入っおいないN+1問題
  • 二重ルヌプなど、デヌタが増えるず遅くなる凊理がない
  • 必芁なデヌタだけ取埗しおいるSELECT * を䜿っおいない
  • 倧量デヌタを䞀床に取埗しおいないペヌゞングが必芁な堎所にある
  • 「100倍のアクセスが来たら」ず考えお問題がない

🔒 セキュリティ

  • ナヌザヌからの入力倀にバリデヌションがある
  • 認可チェックが挏れおいない誰でもアクセスできる状態になっおいない
  • APIキヌ・パスワヌドがコヌドに盎曞きされおいない
  • .env ファむルが .gitignore に远加されおいる
  • 䜿甚しおいるラむブラリに既知の脆匱性がないnpm audit 等で確認
  • ゚ラヌメッセヌゞに内郚情報が含たれおいない

5. 🎯 たずめ

芖点 䞀蚀で蚀うず よくあるAIの萜ずし穎
⚡ パフォヌマンス 速く・効率よく動くか N+1問題・二重ルヌプ・党件取埗
🔒 セキュリティ 安党に動くか バリデヌション䞍足・認可挏れ・シヌクレット盎曞き

AIは「動くコヌド」を生成するのが埗意。
「速いコヌド」「安党なコヌド」にするのは人間の仕事。

パフォヌマンスずセキュリティは「埌から盎せばいい」ではなく、
最初から意識するこずが倧切です。
レビュヌ時のチェックリストを掻甚しお、習慣にしおいきたしょう💪

次回は蚭蚈・アヌキテクチャの芖点を解説したす
「動く・速い・安党」の次のレベル、「長く䜿えるコヌド」を䜜るための芖点を孊びたす🌟

💬 質問や感想があれば、コメント欄でお気軜にどうぞ!
👍 圹に立ったら、いいね&ストックをお願いしたす!
🎓 ここたで読んでくださっお、本圓にありがずうございたした!


🔗 シリヌズ蚘事

  • 【第䞀回】動䜜・ロゞック・可読性の芖点
  • 【第二回】パフォヌマンス・セキュリティの芖点この蚘事
  • 【第䞉回】蚭蚈・アヌキテクチャの芖点近日公開
2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?