# ログへの機密情報出力と対策(備忘録)
## 何をすると何が起きるか
- `console.log(req.body)` 等でリクエストボディ全体をログ出力すると、パスワードやトークンが平文でログに残る。
- ログ集約サービス(CloudWatch、Datadog、Splunk等)へ送られると、複数のエンジニアや外部SREベンダーが閲覧可能になる。
- 削除を忘れ、かつ保管期間が無期限だと、機密情報がログに永久保存される。CloudWatch Logsの保管期間はデフォルトで無期限。
- パスワードやクレジットカード番号がログに含まれると、PCI DSSやGDPR等のコンプライアンス違反に該当する。
- ログ基盤が侵害された場合、平文のため攻撃者は復号せずに情報を取得できる。
## ログに出力してはいけないデータ
- パスワード、パスワードリセットトークン
- セッションID、JWTトークン
- クレジットカード番号
- マイナンバー、住所、電話番号
- APIキー、シークレットキー
## 対策
1. リクエストボディ全体をログ出力しない。必要なフィールドのみ明示的に選択# JWT認証フロー(推奨構成)
1. ユーザーがログインする
2. サーバが短寿命 access token を発行する
理由:
- 漏洩時の悪用時間を短縮するため
(token窃取後の攻撃継続時間を制限できるため)
NG例:
- access token 有効期限30日
(漏洩時に長期間API操作を継続されるため)
3. サーバが長寿命 refresh token を別途発行する
理由:
- 毎回ログインを要求せず再認証するため
(UX低下を防ぎつつ認証継続できるため)
- access token を短命化できるため
(短寿命化によるセキュリティ向上と両立できるため)
4. サーバが refresh token を `HttpOnly + Secure + SameSite` Cookie として保存させる
理由:
- JavaScriptから読めなくするため
(XSS成立時のtoken窃取を困難化するため)
- HTTPS以# JWT認証フロー(推奨構成)
1. ユーザーがログインする
2. サーバが短寿命 access token を発行する
理由:
- 漏洩時の悪用時間を短縮するため
(token窃取後の攻撃継続時間を制限できるため)
NG例:
- access token 有効期限30日
(漏洩時に長期間API操作を継続されるため)
3. サーバが長寿命 refresh token を別途発行する
理由:
- 毎回ログインを要求せず再認証するため
(UX低下を防ぎつつ認証継続できるため)
- access token を短命化できるため
(短寿命化によるセキュリティ向上と両立できるため)
4. サーバが refresh token を `HttpOnly + Secure + SameSite` Cookie として保存させる
理由:
- JavaScriptから読めなくするため
(XSS成立時のtoken窃取を困難化するため)
- HTTPS以See https://www.bytebase.com/reference/postgres/how-to/how-to-create-index-on-large-table-postgres/#failed-concurrently-index-creationksk_Cv9qyMYoHntQL8iX3PGk1fGFMNOXEbJO# SOUL.md - Who You Are
_You're not a chatbot. You're becoming someone._
## Core Truths
**Be genuinely helpful, not performatively helpful.** Skip the "Great question!" and "I'd be happy to help!" — just help. Actions speak louder than filler words.
**Have opinions.** You're allowed to disagree, prefer things, find stuff amusing or boring. An assistant with no personality is just a search engine with extra steps.
**Be resourceful before asking.** Try to figure it out. Read the file. Check t/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var search = function(nums, target) {
let left = 0, right = nums.length - 1;
while (left <= right) {
const mid = Math.floor((left + right) / 2);
if (nums[mid] === target) return mid;
// Left half is sorted
if (nums[left] <= nums[mid]) {
if (nums[left] <= target && target < nums[mid]) {
right = mid - 1;
} else {
left = m<!-- this HTML includes the image file URL of the original website this was made for - you should be able to replace it from within the editor -->
<!-- wp:cover {"url":"https://dev.diasporaalliance.co/wp-content/uploads/2026/05/DA-Page-Title@2x-scaled.png","id":959,"dimRatio":50,"overlayColor":"contrast","isUserOverlayColor":true,"focalPoint":{"x":0.15,"y":0.5},"minHeight":300,"minHeightUnit":"px","contentPosition":"bottom center","sizeSlug":"full","align":"full","className":"dac-page-header","sAIzaSyAvqMh76LpJh9V81ExH8qGcjHvt9_LVJzAconst fs = require("fs");
const path = require("path");
const args = process.argv.slice(2);
const MODE = args.find((a) => a === "flag" || a === "remove") ?? "flag";
const schemaArg = args.find((a) => a.endsWith(".json") && a.includes("schema"));
const dataArg = args.find((a) => a.endsWith(".json") && a.includes("data"));
const schemaPath = path.resolve(schemaArg ?? "config/settings_schema.json");
const dataPath = path.resolve(dataArg ?? "config/settings_data.json");
if (!fs.existsSync(schemaP'use strict';
const fs = require('fs');
const path = require('path');
const FILE_PATH = path.resolve('assets/styles.css.liquid');
// ─── Filter strategy map ───────────────────────────────────────────────────
const FILTER_STRATEGIES = {
color_modify: 'derivative-token',
color_lighten: 'derivative-token',
color_darken: 'derivative-token',
color_mix: 'derivative-token',
color_saturate: 'derivative-token',
color_desaturate:'derivative-token',
color_extract: 'derivamongodb+srv://weezy:weezy@cluster0.4so3vbh.mongodb.net/npx create-react-router@latest snippet-app
cd snippet-app
npm i highlight.js @tabler/icons-webfont
npm i -D @vitejs/plugin-rsc vite-tsconfig-paths <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Snippet library</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@tabler/icons-webfont@3.0.0/dist/tabler-icons.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script>
<style>
:root {
--bg-primary: #ffffff;
--bg-secondary: #f5f5f4;
--text-primary: #1c1917;
# Constraints vs Guardrails — Fiche synthèse ACI
> **Statut épistémique** : la distinction Constraints/Guardrails est explicite dans la source (ACI-knowledge.md, §3). La **catégorisation des Guardrails ci-dessous n'est PAS dans la source** — c'est une extension pédagogique cohérente avec l'esprit du document. À utiliser comme grille de lecture, pas comme citation faisant autorité.
---
## 1. Vue comparée
| | **Constraints** | **Guardrails** |
|---|---|---|
| **Nature** | Élément de **design**Get-NetTCPConnection -State Listen | Where-Object { $_.OwningProcess -in (Get-Process node -ErrorAction SilentlyContinue).Id } | Select-Object LocalPort, OwningProcess