{"id":528,"date":"2026-09-13T11:54:11","date_gmt":"2026-09-13T11:54:11","guid":{"rendered":"https:\/\/gilnas.synology.me\/wordpress\/528\/"},"modified":"2026-09-13T11:54:11","modified_gmt":"2026-09-13T11:54:11","slug":"nuxt-4-5-1-%eb%b3%b4%ec%95%88-%ed%8c%a8%ec%b9%98%ec%99%80-payload-cache-%ec%a0%90%ea%b2%80-nuxt-security-patch-checklist","status":"publish","type":"post","link":"https:\/\/gilnas.synology.me\/wordpress\/528\/","title":{"rendered":"Nuxt 4.5.1 \ubcf4\uc548 \ud328\uce58\uc640 payload cache \uc810\uac80 | Nuxt Security Patch Checklist"},"content":{"rendered":"<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/gilnas.synology.me\/wordpress\/wp-content\/uploads\/2026\/09\/nuxt-2026-09-13.jpg\" alt=\"Nuxt 4.5.1 \ubcf4\uc548 \ud328\uce58\uc640 payload cache \uc810\uac80 | Nuxt Security Patch Checklist\" \/><\/figure>\n<p><strong>\ud575\uc2ec \ub2f5\ubcc0:<\/strong> Nuxt \uc571\uc5d0\uc11c <code>routeRules<\/code>\ub85c \uc778\uc99d\uc744 \ub098\ub204\uac70\ub098 server islands, ISR\/SWR cache, DevTools\ub97c \uc4f0\uace0 \uc788\ub2e4\uba74 Nuxt \ubcf4\uc548 \ud328\uce58\ub294 \u201c\ub098\uc911\uc5d0 \ubb36\uc5b4\uc11c \uc62c\ub9b4 \uc758\uc874\uc131 \uc5c5\ub370\uc774\ud2b8\u201d\uac00 \uc544\ub2d9\ub2c8\ub2e4. Nuxt \ud300\uc740 Nuxt 4.5.1\uacfc 3.21.10\uc744 \ubcf4\uc548 \ub9b4\ub9ac\uc2a4\ub85c \ub0b4\uace0 \uc989\uc2dc \uc5c5\uadf8\ub808\uc774\ub4dc\ub97c \uad8c\uace0\ud588\uc2b5\ub2c8\ub2e4. \uc774\ubc88 \uc218\uc815\uc5d0\ub294 \ud2b9\uc815 \uc870\uac74\uc758 \uc11c\ubc84 \uce21 \uc6d0\uaca9 \ucf54\ub4dc \uc2e4\ud589, server island\uc758 \uc784\uc758 \ucef4\ud3ec\ub10c\ud2b8 \uc778\uc2a4\ud134\uc2a4\ud654, \ub300\uc18c\ubb38\uc790\uac00 \uc11e\uc778 route rule\uc758 \uc778\uc99d \uc6b0\ud68c, DoS, \uce90\uc2dc\ub41c payload\uc758 \uad50\ucc28 \uc0ac\uc6a9\uc790 \ub178\ucd9c, \uac1c\ubc1c \uc11c\ubc84 \uacbd\ub85c \ub178\ucd9c\uc774 \ud3ec\ud568\ub429\ub2c8\ub2e4.<\/p>\n<p>\ud2b9\ud788 \uc704\ud5d8\ud55c \uc7a5\uba74\uc740 \ud3c9\uc18c \ucf54\ub4dc\uac00 \uba40\uca61\ud574 \ubcf4\uc778\ub2e4\ub294 \uc810\uc785\ub2c8\ub2e4. <code>pages\/Admin.vue<\/code> \ub54c\ubb38\uc5d0 \ub9cc\ub4e0 <code>'\/Admin'<\/code> route rule\uacfc \uae30\ubcf8\uc758 \ub300\uc18c\ubb38\uc790 \uad6c\ubd84 \uc5c6\ub294 \ub77c\uc6b0\ud305\uc774 \uc5b4\uae0b\ub098\uba74, \ud398\uc774\uc9c0\ub294 \uc5f4\ub9ac\ub294\ub370 \uc758\ub3c4\ud55c <code>appMiddleware<\/code>\ub294 \uac74\ub108\ub6f8 \uc218 \uc788\uc5c8\uc2b5\ub2c8\ub2e4. \ub610 \uc778\uc99d\ub41c \uc0ac\uc6a9\uc790\uc758 \ub370\uc774\ud130\ub97c SSR\ub85c \ub80c\ub354\ub9c1\ud558\uba74\uc11c <code>swr<\/code>\ub098 <code>isr<\/code>\ub97c \ubd99\uc600\ub2e4\uba74, HTML\uc740 \uc815\uc0c1\uc801\uc73c\ub85c vary\ub418\uc5b4\ub3c4 <code>_payload.json<\/code>\uc774 CDN\uc5d0 \ub0a8\uc544 \ub2e4\ub978 \uc694\uccad\uc5d0 \uc804\ub2ec\ub420 \uc218 \uc788\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n<p><strong>\uc624\ub298\uc758 \uacb0\ub860:<\/strong> \ubc84\uc804\ub9cc \uc62c\ub9ac\uace0 \ub05d\ub0b4\uc9c0 \ub9c8\uc138\uc694. <code>npx nuxt upgrade --dedupe<\/code>\ub85c patched release\uc640 <code>@nuxt\/devtools@3.3.1<\/code>\uc744 lockfile\uae4c\uc9c0 \ubc18\uc601\ud55c \ub4a4, CDN cache purge\uc640 route\/\uc12c \ucef4\ud3ec\ub10c\ud2b8\/\uac1c\ubc1c \uc11c\ubc84 \uc124\uc815\uc744 \ud568\uaed8 \uc810\uac80\ud574\uc57c \ud569\ub2c8\ub2e4. Nuxt \ubcf4\uc548 \uc5c5\ub370\uc774\ud2b8\uc758 \uc644\ub8cc \uae30\uc900\uc740 build \uc131\uacf5\uc774 \uc544\ub2c8\ub77c, \ubc30\ud3ec\ub41c URL\uc5d0\uc11c \uc774\uc804 payload\uc640 \uc778\uc99d \uc6b0\ud68c\uac00 \uc0ac\ub77c\uc84c\ub2e4\ub294 \ud655\uc778\uc785\ub2c8\ub2e4.<\/p>\n<h2>\ubb34\uc2a8 \uc77c\uc774 \uc788\uc5c8\ub098<\/h2>\n<p><strong>Nuxt \ud300\uc758 \uacf5\uc2dd \ubcf4\uc548 \uacf5\uc9c0:<\/strong> <a href=\"https:\/\/nuxt.com\/blog\/v4-5-security\" target=\"_blank\" rel=\"noopener\">Nuxt Security Patch Releases<\/a>\ub294 Nuxt 4.5.1\uacfc 3.21.10\uc744 \ubc30\ud3ec\ud588\uace0, lockfile\uc744 \uc0c8\ub85c \ub9cc\ub4e4\uc5b4 <code>@nuxt\/devtools@3.3.1<\/code>\ub3c4 \uac00\uc838\uc624\ub77c\uace0 \uc548\ub0b4\ud569\ub2c8\ub2e4. \uc774\ubbf8 \uc55e\uc120 route rule \uad8c\uace0(CVE-2026-53721)\uc5d0 \ub300\uc751\ud588\ub354\ub77c\ub3c4 \ucda9\ubd84\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. Nuxt\ub294 \uadf8 \uc218\uc815\uc5d0\uc11c \uc0dd\uae34 regression \ud558\ub098\ub97c \uc774\ubc88 \ub9b4\ub9ac\uc2a4\uc5d0\uc11c \ub2e4\uc2dc \uace0\ucce4\ub2e4\uace0 \uba85\uc2dc\ud569\ub2c8\ub2e4.<\/p>\n<p><strong>2026\ub144 7\uc6d4 27\uc77c GitHub release:<\/strong> <a href=\"https:\/\/github.com\/nuxt\/nuxt\/releases\/tag\/v4.5.1\" target=\"_blank\" rel=\"noopener\">v4.5.1<\/a>\uc740 server-side RCE, server island props\ub97c \ud1b5\ud55c unauthorized component instantiation, route rule authorization bypass, server component DoS, cached page\uc758 cross-user payload disclosure, dev server path disclosure\ub97c \uc218\uc815\ud55c\ub2e4\uace0 \ubc1d\ud799\ub2c8\ub2e4. \uacf5\uc2dd \uad8c\uace0 \uba85\ub839\uc740 <code>npx nuxt upgrade --dedupe<\/code>\uc785\ub2c8\ub2e4.<\/p>\n<p><strong>\ubc30\uacbd\uacfc \uacbd\uacc4:<\/strong> <a href=\"https:\/\/nuxt.com\/blog\/v4-5\" target=\"_blank\" rel=\"noopener\">Nuxt 4.5<\/a>\ub294 SSR streaming\uc744 experimental\u00b7\uae30\ubcf8 \ube44\ud65c\uc131\uc73c\ub85c \uc81c\uacf5\ud558\uba70, bot\/crawler\uc5d0\ub294 \uc644\uc804 \ub80c\ub354 HTML\uc744 \ubcf4\ub0b4\ub3c4\ub85d \uc124\uacc4\ud588\uc2b5\ub2c8\ub2e4. \uc774\ub294 \uc774\ubc88 \ucde8\uc57d\uc810\uacfc \uac19\uc740 \ubb38\uc81c\ub294 \uc544\ub2c8\uc9c0\ub9cc, streaming\u00b7cache\u00b7route rule\uc744 \ud55c\uaebc\ubc88\uc5d0 \ubc14\uafb8\uba74 \uc751\ub2f5 \ud5e4\ub354\uc640 payload \ub3d9\uc791\uc744 \uc77d\uae30 \uc5b4\ub824\uc6cc\uc9c4\ub2e4\ub294 \uc6b4\uc601\uc0c1 \uc774\uc720\uac00 \ub429\ub2c8\ub2e4. \uc5c5\uadf8\ub808\uc774\ub4dc \uac00\uc774\ub4dc\ub294 <a href=\"https:\/\/nuxt.com\/docs\/4.x\/getting-started\/upgrade\" target=\"_blank\" rel=\"noopener\">Nuxt 4 migration<\/a>\uc758 \ub514\ub809\ud130\ub9ac\u00b7TypeScript \ubcc0\ud654\ub3c4 \ubcc4\ub3c4\ub85c \ub2e4\ub8f9\ub2c8\ub2e4.<\/p>\n<h2>\uc65c \uc911\uc694\ud55c\uac00<\/h2>\n<p>Nuxt\uc758 <code>routeRules<\/code>\ub294 cache, redirect, headers, middleware \uac19\uc740 \uc6b4\uc601 \uc815\ucc45\uc744 URL \ud328\ud134\uc5d0 \ubd99\uc77c \uc218 \uc788\uc5b4 \ud3b8\ub9ac\ud569\ub2c8\ub2e4. \uadf8\ub7ec\ub098 \uc815\ucc45\uacfc \uc2e4\uc81c router\uac00 URL \ub300\uc18c\ubb38\uc790 \ud574\uc11d\uc744 \ub2e4\ub974\uac8c \ud558\uba74, \ubcf4\uc548\uc740 \ud654\uba74\uc774 \uc544\ub2c8\ub77c \ubb38\uc790\uc5f4 \ube44\uad50\uc758 \uc791\uc740 \ucc28\uc774\uc5d0\uc11c \ubb34\ub108\uc9d1\ub2c8\ub2e4. server islands\ub3c4 \ub9c8\ucc2c\uac00\uc9c0\uc785\ub2c8\ub2e4. \uc11c\ubc84\uac00 \ub80c\ub354\ub9c1\ud558\ub294 \uc791\uc740 \ucef4\ud3ec\ub10c\ud2b8\ub77c \uc131\ub2a5 \ub3c4\uad6c\ucc98\ub7fc \ubcf4\uc774\uc9c0\ub9cc, props\uac00 \ub3d9\uc801 \ucef4\ud3ec\ub10c\ud2b8\ub098 attribute fallthrough\ub85c \ub118\uc5b4\uac00\uba74 \uc785\ub825 \uac80\uc99d\uc740 \uc11c\ubc84 \uacf5\uaca9 \ud45c\uba74\uc774 \ub429\ub2c8\ub2e4.<\/p>\n<p>\uacf5\uc2dd \uacf5\uc9c0\uac00 \ub9d0\ud558\ub294 \uc601\ud5a5 \uc870\uac74\uc744 \uadf8\ub300\ub85c \uc77d\ub294 \uac83\uc774 \uc911\uc694\ud569\ub2c8\ub2e4. <code>vue.runtimeCompiler<\/code>\ub294 \uae30\ubcf8\uc801\uc73c\ub85c \uaebc\uc838 \uc788\uc5b4 \ubaa8\ub4e0 \uc571\uc774 RCE \ub300\uc0c1\uc740 \uc544\ub2d9\ub2c8\ub2e4. \ud558\uc9c0\ub9cc server islands\uc640 polymorphic <code>as<\/code> prop, <code>@nuxt\/ui<\/code>\/<code>reka-ui<\/code> \ud328\ud134\uc744 \uc4f0\ub294 \uc571\uc740 \ubcc4\ub3c4 \uc810\uac80\uc774 \ud544\uc694\ud569\ub2c8\ub2e4. \u2018\uc6b0\ub9ac \uc571\uc740 \ud574\ub2f9\ud558\uc9c0 \uc54a\uc744 \uac83\u2019\uc774\ub77c\ub294 \ucd94\uce21\ubcf4\ub2e4 \ucf54\ub4dc \uac80\uc0c9\uacfc \uc2e4\uc81c \uc694\uccad \ud14c\uc2a4\ud2b8\uac00 \ube60\ub974\uace0 \uc548\uc804\ud569\ub2c8\ub2e4.<\/p>\n<h3>1. \ud328\uce58 \ud6c4 CDN cache purge\ub294 \uc120\ud0dd\uc774 \uc544\ub2c8\ub77c \ubcf5\uad6c \ub2e8\uacc4\uc785\ub2c8\ub2e4<\/h3>\n<p><strong>\ubcc0\uacbd:<\/strong> \uacf5\uc2dd \uacf5\uc9c0\ub294 \uc778\uc99d \uc0ac\uc6a9\uc790\ubcc4 \ub370\uc774\ud130\ub97c \ub80c\ub354\ub9c1\ud55c \ud398\uc774\uc9c0\uc5d0 <code>cache<\/code>, <code>swr<\/code>, <code>isr<\/code> route rule\uc744 \uc4f8 \ub54c cached <code>_payload.json<\/code>\uc774 \ub2e4\ub978 \uc0ac\uc6a9\uc790 \ub610\ub294 \ube44\uc778\uc99d \ubc29\ubb38\uc790\uc5d0\uac8c \uc81c\uacf5\ub420 \uc218 \uc788\uc5c8\ub2e4\uace0 \uc124\uba85\ud569\ub2c8\ub2e4. <strong>\uc2e4\uc81c \uc601\ud5a5:<\/strong> \uc0c8 Nuxt \ucf54\ub4dc\uac00 \ubb38\uc81c\ub97c \ub9c9\uc544\ub3c4 \uae30\uc874 edge\/CDN cache\ub294 \uc800\uc808\ub85c \uc0ac\ub77c\uc9c0\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. <strong>\uc801\uc6a9 \uc870\uac74:<\/strong> \uac1c\uc778\ud654\ub41c dashboard, \uc8fc\ubb38, \ud504\ub85c\ud544, \uad00\ub9ac\uc790 route\ub294 public cache\uc5d0\uc11c \uc81c\uc678\ud558\uace0 <code>routeRules<\/code>\ub97c URL \ubaa9\ub85d\uc73c\ub85c \uac80\ud1a0\ud569\ub2c8\ub2e4. <strong>\uac80\uc99d:<\/strong> \ubc30\ud3ec \uc9c1\ud6c4 CDN\/edge cache\ub97c purge\ud558\uace0, \uc11c\ub85c \ub2e4\ub978 \ud14c\uc2a4\ud2b8 \uacc4\uc815\uacfc \ube44\uc778\uc99d \uc694\uccad\uc73c\ub85c <code>_payload.json<\/code>\uc758 \uc0c1\ud0dc \ucf54\ub4dc\u00b7Cache-Control\u00b7\ubcf8\ubb38\uc744 \ube44\uad50\ud569\ub2c8\ub2e4. \uace0\uac1d \ub370\uc774\ud130\uac00 \ub2f4\uae34 \uc751\ub2f5\uc744 \ub85c\uadf8\uc5d0 \uc800\uc7a5\ud558\uc9c0 \ub9c8\uc138\uc694.<\/p>\n<h3>2. routeRules \uc778\uc99d\uc740 URL casing\uae4c\uc9c0 \ud14c\uc2a4\ud2b8\ud574\uc57c \ud569\ub2c8\ub2e4<\/h3>\n<p><strong>\ubcc0\uacbd:<\/strong> \ub300\ubb38\uc790\uac00 \ud3ec\ud568\ub41c rule key\uc5d0 <code>appMiddleware<\/code>\ub97c \uc778\uc99d \uad00\ubb38\uc73c\ub85c \uc4f0\ub294 \uacbd\uc6b0, \uae30\ubcf8 case-insensitive routing\uc5d0\uc11c\ub294 \ud398\uc774\uc9c0\uac00 \uc81c\uacf5\ub418\uc9c0\ub9cc middleware\uac00 \uac74\ub108\ub6f8 \uc218 \uc788\uc5c8\uc2b5\ub2c8\ub2e4. \ud328\uce58 \ud6c4 route rule\uc740 vue-router\ucc98\ub7fc \ub300\uc18c\ubb38\uc790 \uad6c\ubd84 \uc5c6\uc774 \ub9de\ucda5\ub2c8\ub2e4. <strong>\uc2e4\uc81c \uc601\ud5a5:<\/strong> <code>pages\/Admin.vue<\/code>, legacy redirect, \uc678\ubd80 \ub9c1\ud06c\uac00 \uc11e\uc778 \uc11c\ube44\uc2a4\uac00 \ud2b9\ud788 \uc704\ud5d8\ud569\ub2c8\ub2e4. <strong>\uc801\uc6a9 \uc870\uac74:<\/strong> \uad8c\ud55c\uc740 \uac00\ub2a5\ud558\uba74 <code>server\/api<\/code>\uc5d0\uc11c\ub3c4 \uac80\uc99d\ud558\uace0, \ud074\ub77c\uc774\uc5b8\ud2b8 middleware\ub9cc \uc720\uc77c\ud55c \uacbd\uacc4\ub85c \ub450\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \uc758\ub3c4\uc801\uc73c\ub85c case-sensitive matching\uc774 \ud544\uc694\ud558\uba74 \uacf5\uc9c0\ub300\ub85c <code>router.options.sensitive: true<\/code>\ub97c \uac80\ud1a0\ud558\ub418 URL \uc815\ucc45\uc744 \ubb38\uc11c\ud654\ud569\ub2c8\ub2e4. <strong>\uac80\uc99d:<\/strong> \uc0c1\uc704 \ubcf4\ud638 route\ub97c \uc18c\ubb38\uc790\u00b7\ub300\ubb38\uc790\u00b7\ud63c\ud569 \ub300\uc18c\ubb38\uc790\ub85c \uc694\uccad\ud574 \ubaa8\ub450 \ub3d9\uc77c\ud558\uac8c 401\/403 \ub610\ub294 \ub85c\uadf8\uc778 redirect\uac00 \ub418\ub294\uc9c0 e2e\uc5d0 \ub123\uc2b5\ub2c8\ub2e4.<\/p>\n<h3>3. server islands props\ub294 \uc120\uc5b8\ud558\uace0, \ub3d9\uc801 root\uc5d0\ub294 \uc804\ub2ec\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4<\/h3>\n<p><strong>\ubcc0\uacbd:<\/strong> Nuxt\ub294 server island\uac00 undeclared prop\uc744 polymorphic <code>as<\/code> root\ub85c \uc804\ub2ec\ud560 \ub54c \uc784\uc758 HTML element\ub098 \uc804\uc5ed component \uc778\uc2a4\ud134\uc2a4\ud654\uac00 \uac00\ub2a5\ud560 \uc218 \uc788\ub2e4\uace0 \uc124\uba85\ud569\ub2c8\ub2e4. runtime compiler\uae4c\uc9c0 \ucf1c\uc9c4 \ud2b9\uc815 \uad6c\uc131\uc5d0\uc11c\ub294 <code>template<\/code> key\uac00 \uc11c\ubc84 \ucf54\ub4dc \uc2e4\ud589\uc73c\ub85c \uc774\uc5b4\uc9c8 \uc218 \uc788\uc2b5\ub2c8\ub2e4. <strong>\uc2e4\uc81c \uc601\ud5a5:<\/strong> UI \ucd94\uc0c1\ud654\uc5d0\uc11c \ud754\ud55c <code>as<\/code>, <code>asChild<\/code>, <code>v-bind=\"$attrs\"<\/code>\uac00 \uc11c\ubc84 \uc785\ub825 \uacbd\uacc4\uac00 \ub429\ub2c8\ub2e4. <strong>\uc801\uc6a9 \uc870\uac74:<\/strong> <code>components\/islands\/<\/code>\uc5d0\uc11c dynamic component\uc640 attribute fallthrough\ub97c \uac80\uc0c9\ud558\uace0, \uc678\ubd80 \uc694\uccad\uc5d0\uc11c \uc624\ub294 props\ub294 zod \uac19\uc740 schema\ub85c allowlist\ud569\ub2c8\ub2e4. \ud544\uc694\ud558\uba74 <code>inheritAttrs: false<\/code>\ub97c \uc0ac\uc6a9\ud569\ub2c8\ub2e4. <strong>\uac80\uc99d:<\/strong> <code>\/__nuxt_island<\/code>\uc5d0 \uc608\uc0c1 \ubc16 <code>as<\/code>, oversized body, <code>template<\/code> \uac12\uc744 \ub123\ub294 \uc74c\uc131 \ud14c\uc2a4\ud2b8\ub97c staging\uc5d0\uc11c \uc218\ud589\ud558\uace0 4xx \ucc98\ub9ac\uc640 CPU \uc0ac\uc6a9\ub7c9\uc744 \ubd05\ub2c8\ub2e4.<\/p>\n<h3>4. DevTools\ub294 \ub85c\uceec\ub9cc\uc758 \ubb38\uc81c\ub77c\uace0 \ub2e8\uc815\ud558\uba74 \uc548 \ub429\ub2c8\ub2e4<\/h3>\n<p><strong>\ubcc0\uacbd:<\/strong> <code>@nuxt\/devtools@3.3.1<\/code>\uc740 Vite HMR socket\uc5d0 \ub178\ucd9c\ub41c \uc778\uc99d \uc5c6\ub294 RPC\ub97c \ud1b5\ud55c critical development-only RCE\ub97c \uc218\uc815\ud569\ub2c8\ub2e4. <strong>\uc2e4\uc81c \uc601\ud5a5:<\/strong> production bundle\uc5d0\ub294 \uc5c6\ub354\ub77c\ub3c4, \uac1c\ubc1c\uc790\uac00 <code>nuxi dev --host<\/code>\ub85c LAN\uc5d0 \uc5f4\uac70\ub098 \uc545\uc131 \ud398\uc774\uc9c0\ub97c \ubc29\ubb38\ud55c \uc0c1\ud0dc\uc5d0\uc11c dev server\ub97c \uc4f0\uba74 \uc704\ud5d8 \uacbd\ub85c\uac00 \uc0dd\uae41\ub2c8\ub2e4. <strong>\uc801\uc6a9 \uc870\uac74:<\/strong> lockfile\uc758 DevTools \ubc84\uc804\uc744 \ud655\uc778\ud558\uace0, \uac1c\ubc1c \uc11c\ubc84\ub294 \uae30\ubcf8 loopback\uc5d0 bind\ud569\ub2c8\ub2e4. \uacf5\uc720 preview\ub294 dev server\uac00 \uc544\ub2c8\ub77c production build\ub85c \uc6b4\uc601\ud569\ub2c8\ub2e4. <strong>\uac80\uc99d:<\/strong> CI\uc5d0\uc11c dependency tree\ub97c \uac80\uc0ac\ud558\uace0, \ud300 \uc628\ubcf4\ub529 \ubb38\uc11c\uc5d0\uc11c <code>--host<\/code> \uc0ac\uc6a9 \uc870\uac74\uacfc \ubc29\ud654\ubcbd \uaddc\uce59\uc744 \uba85\uc2dc\ud569\ub2c8\ub2e4.<\/p>\n<h2>\uac1c\ubc1c\uc790 \uc2e4\ud589 \uacc4\ud68d<\/h2>\n<ol>\n<li><strong>P0:<\/strong> \uac01 \uc11c\ube44\uc2a4\uc758 <code>nuxt<\/code>\uacfc <code>@nuxt\/devtools<\/code> \uc2e4\uc81c resolved \ubc84\uc804\uc744 lockfile\uacfc \ubc30\ud3ec image\uc5d0\uc11c \ud655\uc778\ud569\ub2c8\ub2e4.<\/li>\n<li><strong>P0:<\/strong> <code>npx nuxt upgrade --dedupe<\/code> \ud6c4 clean install, <code>nuxi typecheck<\/code>, unit test, production build\ub97c CI\uc5d0\uc11c \uc2e4\ud589\ud569\ub2c8\ub2e4.<\/li>\n<li><strong>P0:<\/strong> <code>cache<\/code>, <code>swr<\/code>, <code>isr<\/code> routeRules\uc640 \uc778\uc99d \ud398\uc774\uc9c0\ub97c \ub300\uc870\ud558\uace0 \ubc30\ud3ec \ub4a4 CDN\/edge cache\ub97c purge\ud569\ub2c8\ub2e4.<\/li>\n<li><strong>P1:<\/strong> \ubcf4\ud638 URL\uc758 lowercase\/uppercase\/mixed-case \uc694\uccad\uc744 Playwright \ub610\ub294 API smoke test\uc5d0 \ucd94\uac00\ud569\ub2c8\ub2e4.<\/li>\n<li><strong>P1:<\/strong> server islands\uc5d0\uc11c <code>as<\/code>, <code>asChild<\/code>, dynamic component, <code>$attrs<\/code> \uc804\ub2ec\uc744 \uac80\uc0c9\ud558\uace0 props schema\ub97c \uc120\uc5b8\ud569\ub2c8\ub2e4.<\/li>\n<li><strong>P1:<\/strong> <code>vue.runtimeCompiler<\/code>\uac00 \ud544\uc694\ud55c\uc9c0 \uc7ac\ud655\uc778\ud558\uace0 \ubd88\ud544\uc694\ud558\uba74 \uba85\uc2dc\uc801\uc73c\ub85c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.<\/li>\n<li><strong>P2:<\/strong> DevTools\uc640 <code>nuxi dev --host<\/code> \uc0ac\uc6a9\uc744 \uac1c\ubc1c \uc815\ucc45\uc73c\ub85c \uc81c\ud55c\ud558\uace0, preview\ub294 production mode\ub9cc \ud5c8\uc6a9\ud569\ub2c8\ub2e4.<\/li>\n<\/ol>\n<h2>\ub9ac\uc2a4\ud06c\uc640 \ud55c\uacc4<\/h2>\n<p>\ubaa8\ub4e0 \uacf5\uc9c0\ub294 \uc601\ud5a5 \uc870\uac74\uc744 \ub461\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4 runtime compiler\uac00 \uaebc\uc838 \uc788\uace0 server islands\ub97c \uc4f0\uc9c0 \uc54a\uc73c\uba74 RCE \uc870\uac74\uc740 \ucda9\uc871\ud558\uc9c0 \uc54a\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud558\uc9c0\ub9cc \uce90\uc2dc\u00b7route rule\u00b7DevTools \ubb38\uc81c\ub294 \ub2e4\ub978 \uad6c\uc131\uc5d0\uc11c\ub3c4 \ud574\ub2f9\ud560 \uc218 \uc788\uc73c\ubbc0\ub85c \ud55c \uac00\uc9c0 \uc870\uac74\ub9cc \ubcf4\uace0 \uc804\uccb4\ub97c \uba74\uc81c\ud558\uc9c0 \ub9c8\uc138\uc694. \uc5c5\uadf8\ub808\uc774\ub4dc \uc911 hydration error, custom module peer dependency \uc624\ub958, route behavior \ubcc0\ud654\uac00 \ub098\ud0c0\ub098\uba74 \uc774\uc804 \ubc30\ud3ec image\ub85c \ub864\ubc31\ud558\uace0 cache\ub97c \ub2e4\uc2dc purge\ud55c \ub4a4, framework \ud328\uce58\uc640 \ubcc4\ub3c4\uc758 rendering \uc2e4\ud5d8\uc744 \ubd84\ub9ac\ud574 \uc6d0\uc778\uc744 \uc881\ud799\ub2c8\ub2e4. Nuxt 4.5\uc758 SSR streaming\uc740 experimental\uc774\ubbc0\ub85c \ubcf4\uc548 \ud328\uce58\uc640 \uac19\uc740 \ubcc0\uacbd \uc138\ud2b8\uc5d0 \ucd94\uac00\ud558\uc9c0 \uc54a\ub294 \ud3b8\uc774 \uc88b\uc2b5\ub2c8\ub2e4.<\/p>\n<h2>FAQ<\/h2>\n<h3>Nuxt 3 \uc571\ub3c4 3.21.10\uc73c\ub85c \uc62c\ub824\uc57c \ud558\ub098\uc694?<\/h3>\n<p>\ub124. \uacf5\uc2dd \ubcf4\uc548 \uacf5\uc9c0\ub294 3.x\uc6a9 3.21.10\ub3c4 \ud568\uaed8 \ubc30\ud3ec\ud588\ub2e4\uace0 \uc548\ub0b4\ud569\ub2c8\ub2e4. \ub2e4\ub9cc Nuxt 3\uc758 \uc9c0\uc6d0 \uc0c1\ud0dc\uc640 \uc7a5\uae30 migration \uacc4\ud68d\uc740 \ubcc4\ub3c4\ub85c \uad00\ub9ac\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<h3>Nuxt\ub97c \uc62c\ub838\ub294\ub370 CDN purge\uae4c\uc9c0 \ud574\uc57c \ud558\ub098\uc694?<\/h3>\n<p>\uc778\uc99d \ub370\uc774\ud130\uac00 \uc788\ub294 <code>cache<\/code>, <code>swr<\/code>, <code>isr<\/code> route\ub97c \uc0ac\uc6a9\ud588\ub2e4\uba74 \ud574\uc57c \ud569\ub2c8\ub2e4. \uacf5\uc2dd \uacf5\uc9c0\ucc98\ub7fc \uc774\ubbf8 \uce90\uc2dc\ub41c <code>_payload.json<\/code>\uc740 \ucf54\ub4dc \uc5c5\ub370\uc774\ud2b8\ub9cc\uc73c\ub85c \uc9c0\uc6cc\uc9c0\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.<\/p>\n<h3>routeRules\uc5d0 middleware\uac00 \uc788\uc73c\uba74 server\/api \uc778\uc99d\uc740 \ud544\uc694 \uc5c6\ub098\uc694?<\/h3>\n<p>\ud544\uc694\ud569\ub2c8\ub2e4. route rule\uc740 \uc720\uc6a9\ud55c \uc815\ucc45 \uacc4\uce35\uc774\uc9c0\ub9cc API\uc758 \ubbfc\uac10\ud55c \uc791\uc5c5\uc740 <code>server\/api<\/code>\uc5d0\uc11c session\uacfc \uad8c\ud55c\uc744 \ub2e4\uc2dc \uac80\uc99d\ud574\uc57c URL\u00b7\ud074\ub77c\uc774\uc5b8\ud2b8 \uacbd\ub85c \ubcc0\ud654\uc5d0 \ub35c \ucde8\uc57d\ud569\ub2c8\ub2e4.<\/p>\n<h2>\ucd9c\ucc98 \ubc0f \ucd94\uac00 \uc77d\uae30<\/h2>\n<ul>\n<li><a href=\"https:\/\/nuxt.com\/blog\/v4-5-security\" target=\"_blank\" rel=\"noopener\">Nuxt \u2014 Security Patch Releases<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/nuxt\/nuxt\/releases\/tag\/v4.5.1\" target=\"_blank\" rel=\"noopener\">nuxt\/nuxt GitHub Release \u2014 v4.5.1 (2026-07-27)<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/nuxt\/nuxt\/security\/advisories\/GHSA-9473-5f9j-94wq\" target=\"_blank\" rel=\"noopener\">Nuxt GitHub Security Advisory \u2014 server island props RCE<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/nuxt\/nuxt\/security\/advisories\/GHSA-hxvh-4h3w-prp9\" target=\"_blank\" rel=\"noopener\">Nuxt GitHub Security Advisory \u2014 route rule authorization bypass<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/nuxt\/nuxt\/security\/advisories\/GHSA-hxcr-hm88-mpq6\" target=\"_blank\" rel=\"noopener\">Nuxt GitHub Security Advisory \u2014 server component DoS<\/a><\/li>\n<li><a href=\"https:\/\/nuxt.com\/blog\/v4-5\" target=\"_blank\" rel=\"noopener\">Nuxt \u2014 Nuxt 4.5 release notes<\/a><\/li>\n<li><a href=\"https:\/\/nuxt.com\/docs\/4.x\/getting-started\/upgrade\" target=\"_blank\" rel=\"noopener\">Nuxt Docs \u2014 Upgrade Guide<\/a><\/li>\n<\/ul>\n<h2>\ub354 \uae4a\uac8c \uc77d\uae30: \uc2e4\uc804 \uac00\uc774\ub4dc<\/h2>\n<p>\uc774 \ub9ac\ud3ec\ud2b8\ub294 \ucd5c\uadfc \ud750\ub984\uc744 \ube60\ub974\uac8c \ud30c\uc545\ud558\uae30 \uc704\ud55c \uc694\uc57d\uc785\ub2c8\ub2e4. \uc2e4\uc81c \ud504\ub85c\uc81d\ud2b8\uc5d0 \uc801\uc6a9\ud560 \ub54c\ub294 \uc544\ub798\uc758 \uae30\uc900 \uae00\uacfc \ud568\uaed8 \ud655\uc778\ud558\uba74 \ub354 \uc548\uc804\ud569\ub2c8\ub2e4.<\/p>\n<ul>\n<li><a href=\"https:\/\/gilnas.synology.me\/wordpress\/113\/\">AI \uc5d0\uc774\uc804\ud2b8\ub780 \ubb34\uc5c7\uc778\uac00?<\/a><\/li>\n<li><a href=\"https:\/\/gilnas.synology.me\/wordpress\/114\/\">\ud504\ub86c\ud504\ud2b8 \uc778\uc81d\uc158 \ubcf4\uc548 \uccb4\ud06c\ub9ac\uc2a4\ud2b8<\/a><\/li>\n<li><a href=\"https:\/\/gilnas.synology.me\/wordpress\/115\/\">AI \ucf54\ub529 \ub3c4\uad6c \uc548\uc804 \uc6cc\ud06c\ud50c\ub85c<\/a><\/li>\n<li><a href=\"https:\/\/gilnas.synology.me\/wordpress\/116\/\">Nuxt SEO \uc124\uc815 \ubc29\ubc95<\/a><\/li>\n<li><a href=\"https:\/\/gilnas.synology.me\/wordpress\/117\/\">Nuxt\uc640 WordPress Headless CMS \uad6c\uc870<\/a><\/li>\n<li><a href=\"https:\/\/gilnas.synology.me\/wordpress\/118\/\">\uac1c\ubc1c\uc790 \ube14\ub85c\uadf8 \uc560\ub4dc\uc13c\uc2a4 \uc2b9\uc778 \uc804\ub7b5<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Nuxt 4.5.1\u00b73.21.10 \ubcf4\uc548 \ud328\uce58 \ub4a4 routeRules, server islands, _payload.json cache, DevTools\ub97c \uac80\uc99d\ud558\ub294 \uc2e4\ubb34 \uccb4\ud06c\ub9ac\uc2a4\ud2b8\uc785\ub2c8\ub2e4.<\/p>\n","protected":false},"author":1,"featured_media":526,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-528","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-nuxt-trend"],"blocksy_meta":[],"_links":{"self":[{"href":"https:\/\/gilnas.synology.me\/wordpress\/wp-json\/wp\/v2\/posts\/528","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gilnas.synology.me\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gilnas.synology.me\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gilnas.synology.me\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gilnas.synology.me\/wordpress\/wp-json\/wp\/v2\/comments?post=528"}],"version-history":[{"count":0,"href":"https:\/\/gilnas.synology.me\/wordpress\/wp-json\/wp\/v2\/posts\/528\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/gilnas.synology.me\/wordpress\/wp-json\/wp\/v2\/media\/526"}],"wp:attachment":[{"href":"https:\/\/gilnas.synology.me\/wordpress\/wp-json\/wp\/v2\/media?parent=528"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gilnas.synology.me\/wordpress\/wp-json\/wp\/v2\/categories?post=528"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gilnas.synology.me\/wordpress\/wp-json\/wp\/v2\/tags?post=528"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}