[{"data":1,"prerenderedAt":933},["ShallowReactive",2],{"blog-nuxt-security-module-hu":3},{"slug":4,"published":5,"minutes":6,"category":7,"tags":8,"keywords":14,"about":25,"sources":34,"cover":71,"og":72,"expertise":73,"locales":74,"lang":77,"title":78,"description":79,"coverAlt":80,"metaTitle":81,"takeaways":82,"faq":88,"toc":104,"blocks":135,"others":662},"nuxt-security-module","2026-10-02",11,"web",[9,10,11,12,13],"Nuxt","Content Security Policy","HTTP security headers","Rate limiting","Nitro",[15,16,17,18,19,20,21,22,23,24],"nuxt security module","nuxt content security policy nonce","nuxt security headers","nitro route rules security","nuxt rate limiter","nuxt cors server routes","csp report-uri nuxt","nuxt csrf protection","secure nuxt app checklist","nuxt csp strict-dynamic breakage",[26,28,31],{"name":10,"url":27},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FContent_Security_Policy",{"name":29,"url":30},"Cross-site scripting","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCross-site_scripting",{"name":32,"url":33},"Cross-origin resource sharing","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCross-origin_resource_sharing",[35,38,41,44,47,50,53,56,59,62,65,68],{"title":36,"url":37},"Nuxt Security README (main branch)","https:\u002F\u002Fgithub.com\u002FBaroshem\u002Fnuxt-security\u002Fblob\u002Fmain\u002FREADME.md",{"title":39,"url":40},"Nuxt Security default configuration (src\u002FdefaultConfig.ts)","https:\u002F\u002Fraw.githubusercontent.com\u002FBaroshem\u002Fnuxt-security\u002Fmain\u002Fsrc\u002FdefaultConfig.ts",{"title":42,"url":43},"Nuxt Security docs: Content Security Policy","https:\u002F\u002Fraw.githubusercontent.com\u002FBaroshem\u002Fnuxt-security\u002Fmain\u002Fdocs\u002Fcontent\u002F2.headers\u002F1.csp.md",{"title":45,"url":46},"Nuxt Security docs: rate limiter","https:\u002F\u002Fraw.githubusercontent.com\u002FBaroshem\u002Fnuxt-security\u002Fmain\u002Fdocs\u002Fcontent\u002F3.middleware\u002F1.rate-limiter.md",{"title":48,"url":49},"Nuxt Security docs: CORS handler","https:\u002F\u002Fraw.githubusercontent.com\u002FBaroshem\u002Fnuxt-security\u002Fmain\u002Fdocs\u002Fcontent\u002F3.middleware\u002F4.cors-handler.md",{"title":51,"url":52},"Nuxt Security docs: CSRF","https:\u002F\u002Fraw.githubusercontent.com\u002FBaroshem\u002Fnuxt-security\u002Fmain\u002Fdocs\u002Fcontent\u002F3.middleware\u002F7.csrf.md",{"title":54,"url":55},"Nuxt Security docs: hooks","https:\u002F\u002Fraw.githubusercontent.com\u002FBaroshem\u002Fnuxt-security\u002Fmain\u002Fdocs\u002Fcontent\u002F5.advanced\u002F4.hooks.md",{"title":57,"url":58},"Nuxt Security docs: security headers","https:\u002F\u002Fraw.githubusercontent.com\u002FBaroshem\u002Fnuxt-security\u002Fmain\u002Fdocs\u002Fcontent\u002F5.advanced\u002F5.security-headers.md",{"title":60,"url":61},"Nuxt Security docs: improving security","https:\u002F\u002Fraw.githubusercontent.com\u002FBaroshem\u002Fnuxt-security\u002Fmain\u002Fdocs\u002Fcontent\u002F5.advanced\u002F7.improve-security.md",{"title":63,"url":64},"Nuxt Security release v2.6.0 (12 May 2026)","https:\u002F\u002Fgithub.com\u002FBaroshem\u002Fnuxt-security\u002Freleases\u002Ftag\u002Fv2.6.0",{"title":66,"url":67},"MDN: HTTP Observatory","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fobservatory",{"title":69,"url":70},"Playwright: Response class","https:\u002F\u002Fplaywright.dev\u002Fdocs\u002Fapi\u002Fclass-response","\u002Fimages\u002Fblog\u002Fnuxt-security-module\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fnuxt-security-module\u002Fog.jpg","vue-nuxt-developer",[75,76,77],"en","de","hu","Nuxt-alkalmazás megerősítése: CSP, fejlécek és korlátok a Nuxt Security-val","A Nuxt Security modul a gyakorlatban: biztonságos alapértékek, a szigorú mód kompromisszumai, nonce-CSP SSR-ben és SSG-ben, útvonalszabályok.","Három lakattal ellátott pajzs véd egy böngészőablakot.","Nuxt Security: CSP, fejlécek és korlátok · Balázs Csorba",[83,84,85,86,87],"A Nuxt Security hasznos alapértelmezett réteg a fejlécekhez és a kérésekhez, de a dokumentált funkciókészlet nem tartalmaz hitelesítést, jogosultságkezelést, SSRF-védelmet és webalkalmazási tűzfalat.","Az alapértékek a szokásos alkalmazást működőképesen tartják. A szigorú mód más irányelv, ezért a töréseket jelentésmódban javítsa, mielőtt kényszerítené.","A nonce-CSP szerveroldali renderelést igényel. A statikus buildek build-időben számolt hashokat használnak egy meta-elemben, ezért minden oldaltípust külön tesztelje.","A beépített sebességkorlátozó alkalmazásszintű lassító. A brute force elleni védelem az infrastruktúrás rétegbe tartozik.","Jelentésmódban vezesse be, a valódi fejléceket végponttól végpontig tesztelje, és a kivételeket útvonalanként adja meg, ne lazítsa az egész oldalt.",[89,92,95,98,101],{"q":90,"a":91},"Védi a Nuxt Security az SSRF ellen?","A dokumentált funkciókészlet nem tartalmaz SSRF-védelmet, a modul hitelesítést vagy jogosultságkezelést sem ad hozzá. A kimenő címeket a saját kódjában ellenőrizze, és mielőtt egy konkrét verzióra vonatkozó állításra támaszkodik, nézze át a kiadási megjegyzéseket.",{"q":93,"a":94},"Elég a Nuxt Security alapértelmezett CSP-je éles környezetben?","Az alapértékeket úgy tervezték, hogy ne törjenek egy szokásos alkalmazást, de ezek kiindulópontok. Tartalékként megtartják az unsafe-inline értéket, és a szkriptekhez https: forrásokat engedélyeznek. Ellenőrizze az irányelvet a kész buildben, javítsa a töréseket, majd váltson szigorú módra vagy szigorúbb, saját irányelvre.",{"q":96,"a":97},"Miért nem működik a nonce-CSP statikus oldalon?","A nonce válaszonként jön létre, a statikus fájl viszont minden látogatónak ugyanaz. A Nuxt Security figyelmen kívül hagyja a nonce opciót a nuxi generate futtatásakor, helyette build-időben számolt hasheket használ, amelyeket meta-elemben szállít.",{"q":99,"a":100},"Megállítja a sebességkorlátozó a szolgáltatásmegtagadásos támadásokat?","Nem. A dokumentáció egyszerűbb alkalmazásokhoz javasolja, a brute force elleni védelemhez pedig infrastruktúrás megoldásokat ajánl. A forgalmi volumen kezelésére tegyen eléje CDN-t, terheléselosztót vagy webalkalmazási tűzfalat, az alkalmazásszintű korlátot pedig tartsa második rétegként.",{"q":102,"a":103},"Hogyan ellenőrizhetem, hogy a fejlécek egy telepítés után is megvannak?","Írjon egy végpontok közötti tesztet, amely egy szerveroldalon renderelt és egy előre renderelt oldal válaszfejléceit olvassa, és meghiúsul, ha a Content-Security-Policy vagy a Strict-Transport-Security fejléc hiányzik.",[105,108,111,114,117,120,123,126,129,132],{"id":106,"title":107},"what-nuxt-security-covers","Mit fed le a Nuxt Security, és mit hagy ki?",{"id":109,"title":110},"defaults-versus-strict-mode","Mit garantálnak az alapértékek, és mit változtat a szigorú mód?",{"id":112,"title":113},"nonce-csp-ssr-ssg-hybrid","Hogyan működik a nonce-CSP SSR, SSG és hibrid alkalmazásokban?",{"id":115,"title":116},"per-route-hardening","Hogyan erősítsen meg egyes útvonalakat?",{"id":118,"title":119},"rate-limits-request-size","Mit védenek valójában a méret- és gyakoriságkorlátok?",{"id":121,"title":122},"cors-csrf-api-routes","Hogyan viselkedik a CORS és a CSRF az API-útvonalakon?",{"id":124,"title":125},"observing-and-testing","Hogyan vezesse be és tesztelje a fejlécrétegét?",{"id":127,"title":128},"when-to-hand-roll","Mikor jobb a kézzel írt Nitro-köztes réteg?",{"id":130,"title":131},"production-checklist","Hogyan néz ki egy éles üzembe helyezési ellenőrzőlista?",{"id":133,"title":134},"sources","Források",[136,145,148,151,159,162,163,191,222,309,316,322,323,342,346,353,355,358,369,370,381,383,405,424,425,436,444,459,460,488,514,515,533,544,546,554,555,562,568,571,572,575,615,623,624],{"type":137,"content":138},"paragraph",[139,140,144],"A ",{"tag":141,"children":142},"strong",[143],"Nuxt Security"," egy modul, amely megerősítő réteget ad a Nuxt-alkalmazáshoz. Biztonsági válaszfejléceket állít be, köztük a Content Security Policy (CSP) irányelvet, kérésméret- és gyakoriságkorlátokat ad hozzá, a bemeneteket ellenőrzi a cross-site scripting ellen, kezeli a CORS-t, és eltávolít néhány keretrendszer-nyomot. 2026 októberétől a legújabb kiadás a 2.6.0, amely 2026. május 12-én jelent meg, a modul pedig a Nuxt 3.x és újabb verziókkal, köztük a 4.x-szel működik. Az alapértékek úgy vannak tervezve, hogy a szokásos alkalmazást biztonságban tartsák anélkül, hogy megtörnék. Ez hasznos, de nem a teljes történet: egyes védelmek attól függnek, hogy az oldal szerveren renderelődik-e vagy statikus fájlként készül el, egyesek harmadik féltől származó widgeteket törnek, a sebességkorlátozó pedig kifejezetten nem összetett éles alkalmazásoknak készült.",{"type":137,"content":146},[147],"Ez a cikk a modult működtetési rétegnek tekinti, nem funkciólistának. Elmagyarázza, mit garantálnak az alapértékek és mit változtat a szigorú mód, hogyan különbözik a nonce-alapú CSP a szerveres renderelés és a statikus generálás között, hogyan írhatók felül a szabályok útvonalanként, miért sebességgátló a beépített sebességkorlátozó, és nem szolgáltatásmegtagadás elleni védelem, valamint mikor jobb a kézzel írt Nitro-köztes réteg. Minden szám a modul dokumentációjából vagy forráskódjából származik, az október 2026-os állapot szerint ellenőrizve.",{"type":149,"level":150,"id":106,"text":107},"heading",2,{"type":137,"content":152},[153,154,158],"A Nuxt Security a HTTP-réteget fedi le: biztonsági válaszfejlécek, köztük a CSP a statikus oldalakhoz, kérésméret- és sebességkorlátok, XSS-ellenőrzés GET és POST kéréseknél, CORS, az X-Powered-By fejléc elrejtése és a konzolnaplózó segédfüggvények eltávolítása. Az engedélyezett HTTP-metódusok, az alap hitelesítés és a CSRF-védelem opcionális. A ",{"tag":155,"href":37,"children":156},"a",[157],"modul README-je"," ezt sorolja fel funkciókészletként, és a Nuxt 3.x-et és az újabbakat, köztük a 4.x-et nevezi meg támogatottként.",{"type":137,"content":160},[161],"A hiányosságok ugyanolyan fontosak, mint a lista. A dokumentált funkciókészlet nem tartalmaz SSRF-védelmet, hitelesítést vagy jogosultságkezelést, és webalkalmazási tűzfalat sem. Ha az alkalmazás a felhasználók által megadott címeket kér le, vagy bejelentkezés mögött privát adatokat szolgál ki, a modul ezt a munkát nem végzi el Ön helyett. Az XSS-validátort a bejövő kérésadatok egyik szűrőjeként kezelje, amely a js-xss könyvtárra épül. A kimenet escape-elése a komponensekben az Ön felelőssége marad.",{"type":149,"level":150,"id":109,"text":110},{"type":137,"content":164},[165,166,170,171,174,175,178,179,182,183,186,187,190],"Az alapértékek olyan irányelvet adnak, amely egy szokásos alkalmazással működik. A szkriptek a saját originből és https: forrásokból jöhetnek, a stílusok használhatnak inline CSS-t, a szkriptirányelv pedig a nonce-t és a ",{"tag":167,"children":168},"code",[169],"'strict-dynamic'"," értéket nevezi meg. A nonce-t értő böngészők figyelmen kívül hagyják az unsafe-inline tartalékot, ha van nonce. A további alapértékek: ",{"tag":167,"children":172},[173],"nonce: true",", ",{"tag":167,"children":176},[177],"sri: true",", éles környezetben ",{"tag":167,"children":180},[181],"credentialless"," Cross-Origin-Embedder-Policy, 15 552 000 másodperces max-age-ű HSTS includeSubdomains-szal, ",{"tag":167,"children":184},[185],"no-referrer"," referrer-policy és ",{"tag":167,"children":188},[189],"SAMEORIGIN"," X-Frame-Options. A sebességkorlátok, a kéréseméret-korlátok és a CORS be vannak kapcsolva, a basic auth és a CSRF ki.",{"type":137,"content":192},[193,194,197,198,201,202,205,206,209,210,213,214,217,218,221],"A szigorú mód más irányelv, nem ugyanazon értékek szigorúbb változata. A ",{"tag":167,"children":195},[196],"strict: true"," a ",{"tag":167,"children":199},[200],"default-src"," értékét ",{"tag":167,"children":203},[204],"'none'","-ra állítja, eltávolítja az ",{"tag":167,"children":207},[208],"unsafe-inline"," értéket a szkriptekből, a stílusokat csak nonce-szal engedi, a keretek és a worker-ek forrását ",{"tag":167,"children":211},[212],"'self'","-re korlátozza, a COEP-t ",{"tag":167,"children":215},[216],"require-corp","-ra állítja, a HSTS-t egy évre emeli preload-dal, az X-Frame-Options értékét ",{"tag":167,"children":219},[220],"DENY","-re változtatja, és alapértelmezés szerint megtagad minden Permissions Policy funkciót. A dokumentáció fokozatos utat ír le: kezdje az alapértékekkel, javítsa a töréseket, majd váltson szigorú módra.",{"type":223,"head":224,"rows":233},"table",[225,227,229,231],[226],"Funkció",[228],"Alapérték",[230],"Útvonalanként",[232],"Az első buktató",[234,243,252,260,268,276,284,293,301],[235,237,239,241],[236],"CSP SSR-hez",[238],"nonce és strict-dynamic",[240],"igen, a security alatt",[242],"statikus buildnél a nonce figyelmen kívül marad",[244,246,248,250],[245],"CSP SSG-hez",[247],"build-időben számolt hashek meta-elemben",[249],"útvonalanként nincs dokumentálva",[251],"az inline kódot hashelni kell",[253,255,257,258],[254],"Sebességkorlátozó",[256],"150 requests per 300,000 ms per IP",[240],[259],"az LRU-állapot minden folyamatban külön él",[261,263,265,266],[262],"Kérésméret",[264],"2,000,000 bytes, 8,000,000 for uploads",[240],[267],"413 a túl nagy kéréseknél",[269,271,273,274],[270],"XSS-validátor",[272],"GET és POST esetén aktív",[240],[275],"400, ha veszélyes kód szerepel",[277,279,281,282],[278],"CORS",[280],"az origin a szerver URL-je",[240],[283],"a useRegExp mintaként kezeli az originöket",[285,287,289,291],[286],"CSRF",[288],"kikapcsolva",[290],"kivétel a csurf: false beállítással",[292],"nuxt-csurf-on keresztül kapcsolható be",[294,296,298,299],[295],"Subresource Integrity",[297],"bekapcsolva, build-időben számolt hashek",[249],[300],"a hoszt utólagos módosítása eltöri a hasheket",[302,304,306,307],[303],"COEP",[305],"credentialless éles környezetben",[240],[308],"a felugró bejelentkezéseket lazítani kell",{"type":310,"variant":311,"title":312,"body":313},"callout","warn","A szigorú mód migráció, nem kapcsoló",[314],[315],"Egy élő alkalmazás szigorú módra kapcsolása eltöri a harmadik féltől származó widgeteket, az inline kezelőket és a képhiba-szkripteket. Először jelentésmódban futtassa az irányelvet, javítsa minden sérülést, és csak utána kényszerítse ki.",{"type":317,"src":318,"alt":319,"wide":320,"caption":321},"image","\u002Fimages\u002Fblog\u002Fnuxt-security-module\u002Fdiagram-10.webp","A skriptirányelv három szintje Három doboz balról jobbra: inline kód engedélyezése, nonce vagy hash megkövetelése, majd strict-dynamic hozzáadása. Minden szint több kódot tör el, és több kontrollt ad.",true,"A skriptirányelv három szintje. Az 1. szint engedi az inline kódot, és a legkevesebbet töri. A 2. szint nonce-t vagy hasht követel, ami érvényteleníti az unsafe-inline értéket, így az inline eseménykezelők és inline stílusok hibázni kezdenek. A 3. szint hozzáadja a strict-dynamic értéket: ekkor csak nonce-os szkriptek futnak, és az általuk betöltött szkriptek megbízhatónak számítanak, ezért az a kód törik el, amely bármely script-elemre számít.",{"type":149,"level":150,"id":112,"text":113},{"type":137,"content":324},[325,326,329,330,333,334,337,338,341],"Szerveres renderelésnél a modul válaszonként nonce-t hoz létre, beleteszi a CSP-fejlécbe, és hozzáadja a renderelt HTML script-, link- és style-elemeihez. Statikus generálásnál ez nem működhet, mert egy fájl minden látogatót kiszolgál. A modul build-időben számolja a hasheket, és az irányelvet ",{"tag":167,"children":327},[328],"\u003Cmeta http-equiv>"," elemben szállítja. A dokumentáció egyértelmű: a ",{"tag":167,"children":331},[332],"nonce"," opció és a ",{"tag":167,"children":335},[336],"'nonce-{{nonce}}'"," helyőrzők figyelmen kívül maradnak, ha SSG-re ",{"tag":167,"children":339},[340],"nuxi generate"," paranccsal épít.",{"type":317,"src":343,"alt":344,"wide":320,"caption":345},"\u002Fimages\u002Fblog\u002Fnuxt-security-module\u002Fdiagram-13.webp","A kérés útja a Nuxt Security-n át Hat doboz balról jobbra: útvonalszabályok, köztes rétegek, a szerveroldali renderelés, a nonce beillesztése, a HTML újraépítése és a válaszra kerülő fejlécek.","A szerveres úton a kérés áthalad az útvonalszabályokon és a köztes rétegeken, az oldal renderelődik, a nonce bekerül a script-, link- és style-elemekbe, a HTML újraépül, majd a fejlécek beállítódnak. A statikus buildek kihagyják a szervert, és a hasheket tartalmazó irányelvet meta-elemben szállítják.",{"type":137,"content":347},[348,349,352],"Az átírás a renderelési folyamatban történik, ezért az alkalmazáskódnak ritkán kell ismernie a nonce-okat. A modul az inline elemeket és a külső erőforrásokat is feldolgozza. Ha a saját kódjának nonce-ra van szüksége, például egy általa létrehozott inline szkripthez, a ",{"tag":167,"children":350},[351],"useNonce()"," visszaadja az értéket a szerveres kontextusból:",{"type":167,"code":354},"\u003Cscript setup lang=\"ts\">\nconst nonce = useNonce() \u002F\u002F set during SSR; empty on a static build\nuseHead({\n  script: [{ children: 'window.dataLayer = window.dataLayer || []', nonce }],\n})\n\u003C\u002Fscript>",{"type":137,"content":356},[357],"A statikus buildben nincs kérés, ezért ott az érték üres, és az előre renderelt oldalon futó inline kódhoz hash kell. A hibrid eset okozza a legtöbb zavart. A hibrid alkalmazás szerveresen renderelt és előre renderelt útvonalakat vegyít, így a két választípus eltérő irányelvet hordozhat, és az egyik útvonal fejlécellenőrzése a másikról semmit sem mond. Mindkét oldaltípust ellenőrizze.",{"type":137,"content":359},[360,361,364,365,368],"Három törés ismétlődik. A harmadik féltől származó kód, amely futás közben hoz létre script-elemeket, gyakran olyan elemeket termel, amelyeket az irányelv nem ismer. A modul GYIK-je szerint a ",{"tag":167,"children":362},[363],"\u003CNuxtImg>"," és a ",{"tag":167,"children":366},[367],"\u003CNuxtPicture>"," inline hibakezelő szkriptjei ütköznek a csak nonce-os irányelvvel SSR-ben. A hosztoló szolgáltatók, amelyek a build után utólag módosítják a csomagot, érvénytelenítik a subresource integrity hasheket.",{"type":149,"level":150,"id":115,"text":116},{"type":137,"content":371},[372,373,376,377,380],"A modult útvonalanként írja felül a ",{"tag":167,"children":374},[375],"routeRules"," alatt, a ",{"tag":167,"children":378},[379],"security"," mezővel. Minden köztes réteg és fejléc itt beállítható, így egy költséges API-útvonalnak szigorúbb sebességkorlátja lehet, mint a marketingoldalaknak, külön szerver nélkül.",{"type":167,"code":382},"\u002F\u002F nuxt.config.ts\nexport default defineNuxtConfig({\n  modules: ['nuxt-security'],\n  security: {\n    strict: true,\n    contentSecurityPolicyReportOnly: true,\n    rateLimiter: { tokensPerInterval: 150, interval: 300000 },\n  },\n  routeRules: {\n    \u002F\u002F illustrative values: a tighter limit for one expensive endpoint\n    '\u002Fapi\u002Fgenerate\u002F**': { security: { rateLimiter: { tokensPerInterval: 30, interval: 60000 } } },\n  },\n})",{"type":137,"content":384},[385,386,388,389,392,393,396,397,400,401,404],"Két részlet szokott megbotlasztani az embereket. Először: a biztonsági fejlécek csak a ",{"tag":167,"children":387},[379]," mezőbe tartoznak. A dokumentáció nem javasolja, hogy a natív ",{"tag":167,"children":390},[391],"routeRules.headers"," opcióval állítsa be őket, és ha mindkettő ugyanazt a fejlécet definiálja, a security mező nyer. Másodszor: egyes értékeknek egyáltalán nem szabad a repóban lakniuk. A ",{"tag":167,"children":394},[395],"nuxt-security:routeRules"," Nitro-hook a szerver újraindításakor fut, és az egész szabályhalmazt módosíthatja, ami jól illik egy titokkezelőből lekért, engedélyezett ",{"tag":167,"children":398},[399],"connect-src"," originök listájához. Build-időbeli párja, a ",{"tag":167,"children":402},[403],"nuxt-security:prerenderedHeaders"," a statikus hostingot fedi le.",{"type":137,"content":406},[407,408,410,411,414,415,417,418,423],"Itt nő a irányelv egy LLM-funkciókat tartalmazó alkalmazásban. A streamelt válaszoknak az originjük kell a ",{"tag":167,"children":409},[399]," alá, és minden szállítói widgetnek kell egy bejegyzés a ",{"tag":167,"children":412},[413],"script-src"," alá. Az útvonalankénti ",{"tag":167,"children":416},[379]," mező minden kivételt ahhoz az útvonalhoz tart, amelyiknek szüksége van rá, ahelyett hogy az egész oldalt lazítaná. Ugyanezt a streamelő beállítást a ",{"tag":419,"to":420,"children":421},"link","\u002Fblog\u002Fnuxt-llm-features-ai-sdk-streaming",[422],"Nuxt LLM streamelésről szóló cikk"," írja le, és pontosan az ilyen végpontoknál szokott becsúszni a túl tág kivétel.",{"type":149,"level":150,"id":118,"text":119},{"type":137,"content":426},[427,428,431,432,435],"Lelassítják azt az egy klienst, amely túl sok kérést vagy túl nagy törzset küld egy futó példánynak. Az alapérték IP-nként 150 kérést enged 300 000 ms-os (öt perces) ablakon belül, LRU-gyorsítótárban követve, a limit feletti kérésekre pedig ",{"tag":167,"children":429},[430],"429 Too Many Requests"," válasz jár. A kérésméret-korlátozó GET, POST és DELETE kéréseknél 2 000 000 bájtot érvényesít, a nagyobbakra ",{"tag":167,"children":433},[434],"413 Payload Too Large"," választ ad; a feltöltési útvonalak 8 000 000 bájtot kapnak.",{"type":137,"content":437},[438,439,443],"A modul dokumentációja megnevezi ennek a megközelítésnek a határát. A beépített sebességkorlátozó „nem alkalmas összetett éles alkalmazásokhoz”, egyszerűbb alkalmazásoknak készült a brute force kezelésére, éles környezetben pedig „az infrastruktúra rétegén működő megoldásokat kell használni, nem az alkalmazás rétegén”. Ezt munkaszabályként értelmezem: a beépített korlátozó sebességgátló, nem szolgáltatásmegtagadás elleni védelem. Egy CDN, terheléselosztó vagy webalkalmazási tűzfal a Node-folyamat előtt látja a forgalmat, és olyan költséggel utasíthatja el, amelyet az alkalmazás soha nem fizet meg. Ez a korlátozó az a vékony alkalmazásszintű védelem, amelyet a ",{"tag":419,"to":440,"children":441},"\u002Fblog\u002Fllm-endpoint-abuse-denial-of-wallet",[442],"denial-of-wallet cikk"," egy drága végpontra ír le.",{"type":137,"content":445},[446,447,450,451,454,455,458],"Ebből két gyakorlati pont következik. Az LRU-alapérték egyetlen folyamaton belül él, ezért több példány esetén, vagy olyan szerver nélküli függvényeknél, amelyek nem osztoznak memórián, minden példány külön számol, és a tényleges korlát megszorzódik. Ez a modell általam olvasott értelmezése, nem idézett állítás, és egy kétpéldányos teszt megerősítheti. Az unstorage-meghajtó megoszott tárolóba helyezheti a számlálókat, például a dokumentáció által bemutatott ",{"tag":167,"children":448},[449],"vercelKv"," meghajtóval. Másodszor: proxy mögött a kliens címe a proxy címe lesz, hacsak nem állítja be az ",{"tag":167,"children":452},[453],"ipHeader"," opciót, például ",{"tag":167,"children":456},[457],"cf-connecting-ip","-re. Csak akkor állítsa be, ha az alkalmazás kizárólag ezen a proxyn keresztül érhető el, különben a kliens maga is küldhet ilyen fejlécet.",{"type":149,"level":150,"id":121,"text":122},{"type":137,"content":461},[462,463,174,466,174,469,174,472,475,476,479,480,483,484,487],"A CORS globálisan be van kapcsolva, és alapértelmezés szerint a saját szerver-URL-jét engedi originként. A CSRF-védelem ki van kapcsolva, amíg be nem kapcsolja; a nuxt-csurf integrációjából származik. A CORS-kezelő a H3 beépített CORS-funkcióira épül. Beállíthatók a ",{"tag":167,"children":464},[465],"methods",{"tag":167,"children":467},[468],"allowHeaders",{"tag":167,"children":470},[471],"exposeHeaders",{"tag":167,"children":473},[474],"credentials"," és ",{"tag":167,"children":477},[478],"maxAge"," opciók, a preflight válasz állapotkódja alapértelmezés szerint 204. A ",{"tag":167,"children":481},[482],"useRegExp"," bekapcsolásakor minden origin-karakterlánc kis- és nagybetű-érzéketlen reguláris kifejezéssé alakul. Ez kényelmes az előnézeti telepítéseknél, és veszélyes, ha egy minta túl laza, ezért ahol lehet, tartsa a listát kifejezettnek. A ",{"tag":155,"href":49,"children":485},[486],"CORS-kezelő dokumentációja"," mutatja a teljes opciólistát.",{"type":137,"content":489},[490,491,494,495,498,499,475,502,505,506,509,510,513],"A CSRF választható. Állítsa be a ",{"tag":167,"children":492},[493],"csrf: true"," értéket, az egyes útvonalakat a külön ",{"tag":167,"children":496},[497],"csurf: false"," útvonalszabállyal mentesítse, a kliensoldalon pedig használja az automatikusan importált ",{"tag":167,"children":500},[501],"useCsrfFetch",{"tag":167,"children":503},[504],"useCsrf()"," összetevőket. A dokumentáció azt is mutatja, hogyan küldhető a token ",{"tag":167,"children":507},[508],"csrf-token"," fejlécben egy tRPC-kliensnek. A basic auth szintén választható. A modul a hitelesítő adatait a ",{"tag":167,"children":511},[512],"runtimeConfig.private.basicAuth"," alá helyezi, így azok nem kerülnek a kliens csomagjába. Ez a megfelelő hely, de így is egy közös jelszóról van szó, ezért nyilvános termék bejelentkezéseként nem használnám.",{"type":149,"level":150,"id":124,"text":125},{"type":137,"content":516},[517,518,521,522,525,526,364,529,532],"Vezessen be egy irányelvet jelentésmódban, olvassa a jelentéseket, és csak utána kényszerítse ki. Állítsa be a ",{"tag":167,"children":519},[520],"contentSecurityPolicyReportOnly: true"," értéket, ekkor a válasz a kényszerítő fejléc helyett a ",{"tag":167,"children":523},[524],"Content-Security-Policy-Report-Only"," fejlécet hordozza. A CSP-opciók elfogadják a ",{"tag":167,"children":527},[528],"report-uri",{"tag":167,"children":530},[531],"report-to"," értéket, globálisan és útvonalanként is. A jelentésmódot a 2.6.0 kiadás vezette be, amely azt is megváltoztatta, hogyan számolódnak a CSP-hashek: most a renderelési hookban kapott végleges HTML-ből. Ezeket a kiadási megjegyzéseket olvassa el, mielőtt egy statikus oldalt frissít.",{"type":137,"content":534},[535,536,539,540,543],"Egy üzemelő oldal egyszeri értékeléséhez a ",{"tag":155,"href":67,"children":537},[538],"MDN HTTP Observatory"," gyorsan ellenőrzi a fejléceket. Azt értékeli, amit lát, de nem mondja meg, működnek-e még az oldalai, ezért a böngészős tesztelést egészíti ki, nem helyettesíti. A visszaesést elkapó ellenőrzés egy végpontok közötti teszt állítása. A ",{"tag":155,"href":70,"children":541},[542],"Playwright Response osztálya"," hozzáfér a válaszfejlécekhez, így a teszt meghiúsulhat, ha egy telepítés eltávolítja az irányelvet:",{"type":167,"code":545},"import { test, expect } from '@playwright\u002Ftest'\n\ntest('the home page sends the security headers', async ({ page }) => {\n  const response = await page.goto('\u002F')\n  const headers = response!.headers()\n  expect(headers['content-security-policy'] ?? headers['content-security-policy-report-only']).toContain(\"script-src 'self'\")\n  expect(headers['strict-transport-security']).toContain('max-age=')\n})",{"type":137,"content":547},[548,549,553],"A vizsgálatot futtassa egy szerveresen renderelt és egy előre renderelt oldalon is, mert eltérő irányelvet adnak. Az a Playwright-beállítás, amelyet már a Playwright MCP-n keresztül használok, minden telepítésnél futtathatja, így a fejlécvisszaesés ugyanott jelenik meg, mint egy törött oldal. Ugyanazt a szokást, a döntés előtti mérést alkalmazom a ",{"tag":419,"to":550,"children":551},"\u002Fblog\u002Fnuxt-core-web-vitals-performance",[552],"Core Web Vitals cikkben"," is, csak itt a mérőszám egy válaszfejléc.",{"type":149,"level":150,"id":127,"text":128},{"type":137,"content":556},[557,558,561],"A modult akkor használja, ha szeretné, hogy a nonce-átírást, a hashelést és a fejlécbeállításokat karbantartsák Önnek. Kézzel írja a ",{"tag":167,"children":559},[560],"server\u002Fmiddleware"," réteget, ha minden válasz felett pontos kontrollra van szüksége, és nincs kedve konvenciókat kerülgetni. A modul olyan dolgokat ad, amelyeket nehéz jól megépíteni. A nonce beillesztése a renderelési folyamatban történik, így eléri a keretrendszer által létrehozott elemeket is. A statikus buildek hasheit a végleges HTML-ből számolja. A fejlécbeállítások erőforrástípusonként eltérnek: a HTML teljes irányelvet kap, más eszközök szűkebb készletet, az útvonalankénti szabályok pedig összefésülődnek a globális konfigurációval. Ezeket a részeket nem írnám át.",{"type":137,"content":563},[564,565,567],"A kézzel írt köztes réteg máshol nyer. Néhány fejléc és egy kis engedélyezőlista a ",{"tag":167,"children":566},[560]," alatt könnyen olvasható, nem igényel modulkonvenciókat és nem ad hozzá függőséget. Ha csak HSTS-re, referrer-policy-ra és keretopciókra van szüksége, ezt a három fejlécet írja meg maga.",{"type":137,"content":569},[570],"A nonce-CSP kézi újraírása a legrosszabb kiindulópont. A nonce-nak el kell érnie minden szkriptet, linket és stílust, amelyet a renderelés kiad, ugyanannak az értéknek meg kell egyeznie a fejlécben, a statikus buildeknek pedig teljesen más mechanizmus kell. A hibák nem egységtesztben jelennek meg, hanem üres oldalként egyetlen böngészőben. Javaslatom: a modult az irányelvre használja, a kivételeket pedig maga írja meg.",{"type":149,"level":150,"id":130,"text":131},{"type":137,"content":573},[574],"Mielőtt egy irányelvet kikényszerítene egy éles alkalmazásban, ebben a sorrendben dolgozném fel ezeket a pontokat:",{"type":576,"ordered":320,"items":577},"list",[578,580,592,594,600,609,611,613],[579],"Futtassa az alapértékeket minden oldaltípuson, és javítsa azt, amit a böngésző konzolja szabálysértésként jelez.",[581,582,585,586,588,589,591],"Kapcsolja be a ",{"tag":167,"children":583},[584],"contentSecurityPolicyReportOnly"," opciót ",{"tag":167,"children":587},[528]," vagy ",{"tag":167,"children":590},[531]," végponttal, és olvassa a jelentéseket egy teljes kiadási cikluson át.",[593],"Ellenőrizze, mely útvonalak szerveresen renderelődnek és melyek előre renderelődnek, és nézze meg az elkészült HTML-ben a nonce-t vagy a hashelt meta-elemet.",[595,596,599],"Harmadik féltől származó szkripteket ",{"tag":167,"children":597},[598],"useScript","-tel (Nuxt 3.11 vagy újabb) töltsön be, ne kézzel szúrjon be tageket.",[601,602,605,606,608],"A külső képhostokat vegye fel az ",{"tag":167,"children":603},[604],"img-src",", minden API-originöt pedig a ",{"tag":167,"children":607},[399]," alá, az LLM-végpontokat is beleértve.",[610],"Ellenőrizze, hogy a hosztoló nem írja-e át a csomagokat a build után, különben az integritási hashek meghiúsulnak.",[612],"A brute force és a forgalmi volumen elleni védelmet a szél rétegbe tegye, a beépített korlátozót pedig második rétegnek tekintse.",[614],"Az eredeti fejléceket végponttól végpontig tesztelő teszttel ellenőrizze egy szerveresen renderelt és egy előre renderelt oldalon.",{"type":137,"content":616},[617,618,622],"A modul jó alapértelmezett réteg, a hátralévő munka pedig ugyanaz, mint korábban: tudni, mely szkripteket töltenek be az oldalai, és mely originöket hívja az alkalmazása. Ha látni szeretné, milyen Nuxt-munka áll e cikk mögött, a ",{"tag":419,"to":619,"children":620},"\u002Fexpertise\u002Fvue-nuxt-developer",[621],"Vue- és Nuxt-projektjeim"," jó kiindulópontot adnak.",{"type":149,"level":150,"id":133,"text":134},{"type":576,"ordered":320,"items":625},[626,629,632,635,638,641,644,647,650,653,656,659],[627],{"tag":155,"href":37,"children":628},[36],[630],{"tag":155,"href":40,"children":631},[39],[633],{"tag":155,"href":43,"children":634},[42],[636],{"tag":155,"href":46,"children":637},[45],[639],{"tag":155,"href":49,"children":640},[48],[642],{"tag":155,"href":52,"children":643},[51],[645],{"tag":155,"href":55,"children":646},[54],[648],{"tag":155,"href":58,"children":649},[57],[651],{"tag":155,"href":61,"children":652},[60],[654],{"tag":155,"href":64,"children":655},[63],[657],{"tag":155,"href":67,"children":658},[66],[660],{"tag":155,"href":70,"children":661},[69],[663,737,793,865],{"slug":664,"published":665,"minutes":666,"category":7,"tags":667,"keywords":672,"about":684,"sources":693,"cover":730,"og":731,"expertise":732,"locales":733,"lang":77,"title":734,"description":735,"coverAlt":736},"schema-org-structured-data-b2b-shop","2026-10-17",10,[668,669,670,671,9],"Schema.org","Structured data","B2B e-commerce","Technical SEO",[673,674,675,676,677,678,679,680,681,682,683],"schema.org b2b shop","product structured data b2b","merchant listing structured data","product snippet vs merchant listing","unitpricespecification referencequantity","productgroup variants structured data","organization schema vatid","b2b prices behind login seo","json-ld nuxt schema org","merchant return policy structured data","mpn gtin structured data",[685,687,690],{"name":668,"url":686},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSchema.org",{"name":688,"url":689},"JSON-LD","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FJSON-LD",{"name":691,"url":692},"Business-to-business","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FBusiness-to-business",[694,697,700,703,706,709,712,715,718,721,724,727],{"title":695,"url":696},"Google Search Central: Introduction to Product structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fproduct",{"title":698,"url":699},"Google Search Central: Merchant listing (Product, Offer) structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fmerchant-listing",{"title":701,"url":702},"Google Search Central: Product snippet structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fproduct-snippet",{"title":704,"url":705},"Google Search Central: Product variant structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fproduct-variants",{"title":707,"url":708},"Google Search Central: Organization structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Forganization",{"title":710,"url":711},"Google Search Central: Merchant return policy structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Freturn-policy",{"title":713,"url":714},"Google Search Central: General structured data guidelines","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fsd-policies",{"title":716,"url":717},"Google Search Central: Generate structured data with JavaScript","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fgenerate-structured-data-with-javascript",{"title":719,"url":720},"Schema.org: Offer","https:\u002F\u002Fschema.org\u002FOffer",{"title":722,"url":723},"Schema.org: UnitPriceSpecification","https:\u002F\u002Fschema.org\u002FUnitPriceSpecification",{"title":725,"url":726},"Unhead: Product schema (defineProduct)","https:\u002F\u002Funhead.unjs.io\u002Fdocs\u002Fschema-org\u002Fapi\u002Fschema\u002Fproduct",{"title":728,"url":729},"Nuxt SEO: Schema.org identity setup","https:\u002F\u002Fnuxtseo.com\u002Fdocs\u002Fschema-org\u002Fguides\u002Fsetup-identity","\u002Fimages\u002Fblog\u002Fschema-org-structured-data-b2b-shop\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fschema-org-structured-data-b2b-shop\u002Fog.jpg","b2b-ecommerce-developer",[75,76,77],"Schema.org strukturált adatok B2B webshopokhoz: bejelentkezés mögötti árak, egységek és változatok","Termék-markup B2B shopokhoz: snippet vagy kereskedői lista, melyik ár, cikkszámok, egységárak, változatok, Organization és SSR Nuxtban.","Terméktéglalap vékony kerettel, alsó kis mezőjét alacsony fal takarja el.",{"slug":738,"published":665,"minutes":739,"category":7,"tags":740,"keywords":745,"about":757,"sources":765,"cover":787,"og":788,"expertise":732,"locales":789,"lang":77,"title":790,"description":791,"coverAlt":792},"ai-assistant-b2b-shop-customer-support",9,[670,741,742,743,744],"AI assistant","Customer support","LLM agents","EU AI Act",[746,747,748,749,750,751,752,753,754,755,756],"ai assistant b2b shop","ai customer support b2b ecommerce","llm chatbot order status","ai agent customer service tools","chatbot liability air canada","klarna ai assistant results","human handoff chatbot design","eu ai act chatbot disclosure","owasp excessive agency","ai support resolution rate","b2b customer portal chatbot",[758,761,764],{"name":759,"url":760},"Customer service","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCustomer_service",{"name":762,"url":763},"Chatbot","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FChatbot",{"name":691,"url":692},[766,769,772,775,778,781,784],{"title":767,"url":768},"Klarna: AI assistant handles two-thirds of customer service chats in its first month (press release, 2024)","https:\u002F\u002Fwww.klarna.com\u002Finternational\u002Fpress\u002Fklarna-ai-assistant-handles-two-thirds-of-customer-service-chats-in-its-first-month\u002F",{"title":770,"url":771},"Entrepreneur: Klarna is hiring customer service agents again, according to its CEO (May 2025)","https:\u002F\u002Fwww.entrepreneur.com\u002Fbusiness-news\u002Fklarna-ceo-reverses-course-by-hiring-more-humans-not-ai\u002F491396",{"title":773,"url":774},"ABA Business Law Today: BC tribunal confirms companies remain liable for information provided by AI chatbot","https:\u002F\u002Fwww.americanbar.org\u002Fgroups\u002Fbusiness_law\u002Fresources\u002Fbusiness-law-today\u002F2024-february\u002Fbc-tribunal-confirms-companies-remain-liable-information-provided-ai-chatbot\u002F",{"title":776,"url":777},"OWASP GenAI Security Project: LLM06:2025 Excessive Agency","https:\u002F\u002Fgenai.owasp.org\u002Fllmrisk\u002Fllm062025-excessive-agency\u002F",{"title":779,"url":780},"OWASP GenAI Security Project: LLM05:2025 Improper Output Handling","https:\u002F\u002Fgenai.owasp.org\u002Fllmrisk\u002Fllm052025-improper-output-handling\u002F",{"title":782,"url":783},"EU AI Act, Article 50: Transparency obligations","https:\u002F\u002Fartificialintelligenceact.eu\u002Farticle\u002F50\u002F",{"title":785,"url":786},"Intercom: Fin pricing and billable outcomes","https:\u002F\u002Ffin.ai\u002Fpricing","\u002Fimages\u002Fblog\u002Fai-assistant-b2b-shop-customer-support\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fai-assistant-b2b-shop-customer-support\u002Fog.jpg",[75,76,77],"AI-asszisztens a B2B webshop ügyfélszolgálatához: eszközök, jogosultságok és átadás embernek","Hogyan építs AI ügyfélszolgálati asszisztenst B2B shophoz: mit automatizálj, eszközök ügyfélkontextusban, átadás embernek, AI Act és mérőszámok.","Magas fal keskeny réssel: nyíl halad át rajta a három négyzetből álló bekerített mezőbe, egy másik lefelé, egy tálca felé mutat.",{"slug":794,"published":665,"minutes":6,"category":7,"tags":795,"keywords":800,"about":812,"sources":822,"cover":859,"og":860,"expertise":73,"locales":861,"lang":77,"title":862,"description":863,"coverAlt":864},"vue-ai-chat-ui-streaming-accessibility",[796,9,797,798,799],"Vue","Accessibility","Streaming","AI chat",[801,802,803,804,805,806,807,808,809,810,811],"vue ai chat ui","nuxt llm streaming","sse vs fetch streaming","aria-live streaming text","accessible chat interface","abort fetch stream vue","dompurify markdown llm","role log chat","reduced motion chat ui","wcag 2.2 chat","screen reader streaming",[813,816,819],{"name":814,"url":815},"Web accessibility","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FWeb_accessibility",{"name":817,"url":818},"Server-sent events","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FServer-sent_events",{"name":820,"url":821},"Vue.js","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FVue.js",[823,826,829,832,835,838,841,844,847,850,853,856],{"title":824,"url":825},"MDN: Using server-sent events","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FServer-sent_events\u002FUsing_server-sent_events",{"title":827,"url":828},"MDN: AbortController","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FAbortController",{"title":830,"url":831},"MDN: ReadableStream","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FReadableStream",{"title":833,"url":834},"MDN: TextDecoderStream","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FTextDecoderStream",{"title":836,"url":837},"MDN: ARIA log role","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAccessibility\u002FARIA\u002FReference\u002FRoles\u002Flog_role",{"title":839,"url":840},"W3C: Understanding SC 4.1.3 Status Messages","https:\u002F\u002Fwww.w3.org\u002FWAI\u002FWCAG22\u002FUnderstanding\u002Fstatus-messages.html",{"title":842,"url":843},"W3C WAI: What's new in WCAG 2.2","https:\u002F\u002Fwww.w3.org\u002FWAI\u002Fstandards-guidelines\u002Fwcag\u002Fnew-in-22\u002F",{"title":845,"url":846},"MDN: prefers-reduced-motion","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FCSS\u002F@media\u002Fprefers-reduced-motion",{"title":848,"url":849},"DOMPurify README","https:\u002F\u002Fgithub.com\u002Fcure53\u002FDOMPurify",{"title":851,"url":852},"markdown-it README","https:\u002F\u002Fgithub.com\u002Fmarkdown-it\u002Fmarkdown-it",{"title":854,"url":855},"AI SDK docs: useChat","https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Fai-sdk-ui\u002Fchatbot",{"title":857,"url":858},"Vue docs: nextTick","https:\u002F\u002Fvuejs.org\u002Fapi\u002Fgeneral.html#nexttick","\u002Fimages\u002Fblog\u002Fvue-ai-chat-ui-streaming-accessibility\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fvue-ai-chat-ui-streaming-accessibility\u002Fog.jpg",[75,76,77],"AI-csevegő UI Vue-ban és Nuxtban: akadálymentes streaming","AI-csevegő Vue-ban vagy Nuxtban: fetch-stream, megszakítás és újrapróbálás, biztonságos markdown, aria-live bejelentések, billentyűzet és reduced motion.","Üzenetkártya villogó kurzorral, pontozott vonal hullámokká nyílik, mellette pipa.",{"slug":866,"published":665,"minutes":739,"category":7,"tags":867,"keywords":872,"about":884,"sources":894,"cover":927,"og":928,"expertise":73,"locales":929,"lang":77,"title":930,"description":931,"coverAlt":932},"llm-translation-pipeline-i18n",[868,869,870,796,871],"Translation","i18n","LLM","Localization",[873,874,875,876,877,878,879,880,881,882,883],"llm translation pipeline","icu messageformat placeholders","vue i18n llm translation","translation memory llm","glossary enforcement translation","german informal sie du","hungarian translation quality llm","structured output json translation","machine translation post-editing","locale file validation","cldr plural categories",[885,888,891],{"name":886,"url":887},"Internationalization and localization","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FInternationalization_and_localization",{"name":889,"url":890},"ICU MessageFormat","https:\u002F\u002Funicode-org.github.io\u002Ficu\u002Fuserguide\u002Fformat_parse\u002Fmessages\u002F",{"name":892,"url":893},"Vue I18n","https:\u002F\u002Fvue-i18n.intlify.dev\u002F",[895,897,900,903,906,909,912,915,918,921,924],{"title":896,"url":890},"Unicode ICU User Guide: Formatting Messages",{"title":898,"url":899},"Vue I18n: Message Format Syntax","https:\u002F\u002Fvue-i18n.intlify.dev\u002Fguide\u002Fessentials\u002Fsyntax",{"title":901,"url":902},"Nuxt i18n: Getting started","https:\u002F\u002Fi18n.nuxtjs.org\u002Fdocs\u002Fgetting-started",{"title":904,"url":905},"Unicode CLDR: Plural rules","https:\u002F\u002Fcldr.unicode.org\u002Findex\u002Fcldr-spec\u002Fplural-rules",{"title":907,"url":908},"OpenAI: Structured outputs","https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fguides\u002Fstructured-outputs",{"title":910,"url":911},"DeepL API: Glossaries","https:\u002F\u002Fdevelopers.deepl.com\u002Fdocs\u002Fapi-reference\u002Fglossaries",{"title":913,"url":914},"W3C: Localization vs. internationalization","https:\u002F\u002Fwww.w3.org\u002FInternational\u002Fquestions\u002Fqa-i18n",{"title":916,"url":917},"GNU gettext manual","https:\u002F\u002Fwww.gnu.org\u002Fsoftware\u002Fgettext\u002Fmanual\u002Fgettext.html",{"title":919,"url":920},"RFC 5646: Tags for Identifying Languages","https:\u002F\u002Fwww.rfc-editor.org\u002Frfc\u002Frfc5646",{"title":922,"url":923},"Rat für deutsche Rechtschreibung","https:\u002F\u002Fwww.rechtschreibrat.com\u002F",{"title":925,"url":926},"Microsoft Writing Style Guide","https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fstyle-guide\u002Fwelcome\u002F","\u002Fimages\u002Fblog\u002Fllm-translation-pipeline-i18n\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fllm-translation-pipeline-i18n\u002Fog.jpg",[75,76,77],"LLM-fordítási pipeline i18n-hez: glosszárium, helyőrzők és review","Termék- és weboldalszövegek fordítása LLM-mel úgy, hogy a helyőrzők, a többes szám és a hangnem épen maradjon: glosszárium, ICU üzenetek, QA-ellenőrzések.","Három forráskártya, egy lefordított kártya glosszárium-szalaggal, majd ellenőrzött tábla.",1792337025729]