{{-- resources/views/web/partials/dev_session_overlay.blade.php --}} @php // 개발 모드에서만 노출 $show = config('app.debug') || app()->environment('local'); // 이 overlay 자체가 세션을 수정하는 "dev action" 처리(컨트롤러/라우트 없이) if ($show && request()->isMethod('post') && request()->has('_dev_sess_action')) { // CSRF는 web 미들웨어에 걸려있으니 토큰 포함된 요청만 처리됨. $action = request()->input('_dev_sess_action'); if ($action === 'flush') { session()->flush(); session()->save(); } if ($action === 'put') { $k = (string) request()->input('_dev_sess_key', ''); $v = (string) request()->input('_dev_sess_value', ''); // 빈 키 방지 if ($k !== '') { // "a.b.c" 점 표기 지원 data_set(session()->all(), $k, $v); // data_set은 배열에만 반영되므로 세션에 직접 put session()->put($k, $v); session()->save(); } } // POST 재전송 방지 + 현재 페이지로 되돌리기 $redir = url()->current(); $qs = request()->query(); if (!empty($qs)) $redir .= '?' . http_build_query($qs); header('Location: ' . $redir, true, 302); exit; } // 세션 전체 $sess = session()->all(); // 민감값 마스킹 $maskKeys = []; // $maskKeys = [ // 'password', 'passwd', 'pw', 'token', 'access_token', 'refresh_token', // 'api_key', 'secret', 'authorization', 'csrf', '_token', // 'g-recaptcha-response', 'recaptcha', 'otp', // 'ci', 'di', 'phone', 'mobile', 'email', // ]; $mask = function ($key, $val) use ($maskKeys) { $k = strtolower((string)$key); foreach ($maskKeys as $mk) { if (str_contains($k, $mk)) return '***'; } return $val; }; // key:value 라인 생성(재귀) $lines = []; $dump = function ($data, $prefix = '') use (&$dump, &$lines, $mask) { foreach ((array)$data as $k => $v) { $key = $prefix . (string)$k; if (is_array($v)) { $lines[] = $key . ' : ['; $dump($v, $prefix . ' '); $lines[] = $prefix . ']'; } else { if (is_bool($v)) $v = $v ? 'true' : 'false'; if ($v === null) $v = 'null'; $vv = is_string($v) ? (mb_strlen($v) > 260 ? mb_substr($v, 0, 260) . '…' : $v) : (string)$v; $vv = $mask($k, $vv); $lines[] = $key . ' : ' . $vv; } } }; $dump($sess); $text = implode("\n", $lines); @endphp @if($show)
{!! e($text) !!}