[{"data":1,"prerenderedAt":320},["ShallowReactive",2],{"blog-archive":3},[4,13,21,26,33,39,45,50,56,62,67,72,78,86,93,98,105,112,119,126,135,141,147,155,163,169,176,182,187,193,199,205,212,218,223,229,234,242,250,258,264,270,276,283,289,294,301,307,313],{"path":5,"title":6,"meta":7},"\u002Fko\u002Fweb-security-sql-injection-xss-csrf","웹 보안 기본 3대 공격: SQL Injection, XSS, CSRF 원리와 방어법",{"date":8,"field":9,"tags":10},"2026.10.09","backend",[11,12],"web-security","nodejs",{"path":14,"title":15,"meta":16},"\u002Fko\u002Fapi-error-response-format","API 에러 응답 형식 설계하기: 제각각인 에러 응답을 RFC 9457 Problem Details로 통일하는 법",{"date":17,"field":9,"tags":18},"2026.10.08",[19,20],"api","http",{"path":22,"title":23,"meta":24},"\u002Fko\u002Fcors-guide","CORS 에러 완전 정리: 왜 막히는지부터 preflight, credentials까지 올바르게 해결하기",{"date":17,"field":9,"tags":25},[20,11,12],{"path":27,"title":28,"meta":29},"\u002Fko\u002Fcss-has-selector","CSS :has() 선택자 실전 가이드: 자바스크립트 없이 부모를 선택하는 법",{"date":17,"field":30,"tags":31},"frontend",[32],"css",{"path":34,"title":35,"meta":36},"\u002Fko\u002Fhtml-features-without-javascript","자바스크립트 없이 HTML만으로 되는 것들: 아직도 div로 다 만들고 있다면",{"date":17,"field":30,"tags":37},[38],"html",{"path":40,"title":41,"meta":42},"\u002Fko\u002Fhttp-cache-control-guide","HTTP 캐시 제대로 쓰기: Cache-Control, ETag, no-cache와 no-store의 차이",{"date":17,"field":9,"tags":43},[20,44],"vercel",{"path":46,"title":47,"meta":48},"\u002Fko\u002Fhttp-status-codes-guide","HTTP 상태 코드 올바르게 쓰기: 400 vs 422, 401 vs 403, 200 vs 201 vs 204 헷갈릴 때 보는 정리",{"date":17,"field":9,"tags":49},[20,19],{"path":51,"title":52,"meta":53},"\u002Fko\u002Fjavascript-async-error-handling","자바스크립트 비동기 에러 올바르게 처리하기: try\u002Fcatch가 못 잡는 경우부터 Promise.all vs allSettled까지",{"date":17,"field":30,"tags":54},[55],"javascript",{"path":57,"title":58,"meta":59},"\u002Fko\u002Fjavascript-event-loop","자바스크립트 이벤트 루프 완전 정복: 마이크로태스크와 매크로태스크의 실행 순서",{"date":17,"field":60,"tags":61},"concepts",[55,12],{"path":63,"title":64,"meta":65},"\u002Fko\u002Fjavascript-higher-order-functions","자바스크립트 고차 함수 완전 정복: map, filter, reduce부터 직접 만드는 once, memoize까지",{"date":17,"field":30,"tags":66},[55],{"path":68,"title":69,"meta":70},"\u002Fko\u002Fjavascript-nullish-coalescing-optional-chaining","자바스크립트 ?? vs || 완벽 정리: null, undefined, 0, 빈 문자열을 올바르게 처리하는 법",{"date":17,"field":30,"tags":71},[55],{"path":73,"title":74,"meta":75},"\u002Fko\u002Fjwt-vs-session-auth","JWT vs 세션 인증 비교: 무엇을 써야 할까? 저장 위치, 로그아웃, 보안까지 정리",{"date":17,"field":9,"tags":76},[77,11],"auth",{"path":79,"title":80,"meta":81},"\u002Fko\u002Fnitro-wildcard-redirect-url-migration","글 주소 프리픽스를 통째로 바꿔야 할 때: Nitro wildcard 리다이렉트로 안전하게 옮기기",{"date":17,"field":82,"tags":83},"blog",[84,85],"nuxt","seo",{"path":87,"title":88,"meta":89},"\u002Fko\u002Fnodejs-graceful-shutdown","Node.js 서버 안전하게 종료하기 (Graceful Shutdown): 배포할 때마다 요청이 끊기는 이유",{"date":17,"field":9,"tags":90},[12,91,92],"docker","pm2",{"path":94,"title":95,"meta":96},"\u002Fko\u002Fsemantic-html-common-mistakes","의미 있는 HTML 쓰기: 대부분이 하는 시맨틱 HTML 실수 7가지",{"date":17,"field":30,"tags":97},[38],{"path":99,"title":100,"meta":101},"\u002Fko\u002Fnuxt-content-vercel-empty-query-sqlite","배포만 하면 블로그 글이 하나도 안 보이던 버그: Nuxt Content와 Vercel의 \u002Ftmp 문제",{"date":102,"field":82,"tags":103},"2026.10.07",[104,44],"nuxt-content",{"path":106,"title":107,"meta":108},"\u002Fko\u002Fdikw-pyramid","DIKW 피라미드 정리: 데이터가 지혜가 되기까지",{"date":109,"field":60,"tags":110},"2026.09.18",[111],"data",{"path":113,"title":114,"meta":115},"\u002Fko\u002Fadsense-ads-txt-and-seo-indexing-bug","애드센스 ads.txt 경고를 받고 파헤치다가 찾은 진짜 색인 버그",{"date":116,"field":82,"tags":117},"2026.09.17",[85,118,104],"adsense",{"path":120,"title":121,"meta":122},"\u002Fko\u002Fminio-guide","MinIO 완벽 가이드: 설치부터 Node.js 연동까지",{"date":123,"field":9,"tags":124},"2025.11.23",[125,12],"minio",{"path":127,"title":128,"meta":129},"\u002Fko\u002Fhow-to-mount-storage","라즈베리파이4에 저장장치 마운트 시키기",{"date":130,"field":131,"tags":132},"2025.07.11","infra",[133,134],"raspberry-pi","linux",{"path":136,"title":137,"meta":138},"\u002Fko\u002Fcsv-parser-cleaning","복잡한 CSV 데이터를 안전하게 파싱하는 방법",{"date":139,"field":30,"tags":140},"2025.06.19",[55],{"path":142,"title":143,"meta":144},"\u002Fko\u002Fnuxt-runtimeconfig-appconfig","Nuxt 설정 runtimeConfig vs app.config 완전 정복",{"date":145,"field":30,"tags":146},"2025.06.16",[84],{"path":148,"title":149,"meta":150},"\u002Fko\u002Fvue-query-ref-value-trap-nuxt3","Vue Query에서 데이터가 안 보이는 이유? Nuxt 3와 Ref 구조의 함정",{"date":151,"field":30,"tags":152},"2025.06.08",[84,153,154],"vue","tanstack-query",{"path":156,"title":157,"meta":158},"\u002Fko\u002Fdeclarative-vs-procedural-programming","선언적 프로그래밍 vs 절차형 프로그래밍",{"date":159,"field":60,"tags":160},"2025.05.24",[161,153,162],"paradigm","react",{"path":164,"title":165,"meta":166},"\u002Fko\u002Ftanstack-query-guide","TanStack Query란 무엇인가?",{"date":167,"field":30,"tags":168},"2025.04.15",[162,154],{"path":170,"title":171,"meta":172},"\u002Fko\u002Fvite-plugin-style-inject","리엑티 컴포넌트를 패키지 빌드 시 CSS 같이 적용시키기",{"date":173,"field":30,"tags":174},"2025.04.06",[175,162],"vite",{"path":177,"title":178,"meta":179},"\u002Fko\u002Fcss-login-form","로그인",{"date":180,"field":30,"tags":181},"2025.03.29",[38,32],{"path":183,"title":184,"meta":185},"\u002Fko\u002Fnuxt-colormode","Nuxt3 다크모드 적용하기",{"date":180,"field":30,"tags":186},[84],{"path":188,"title":189,"meta":190},"\u002Fko\u002Fnuxt3-pinia-guide","nuxt3 Pinia 적용하기",{"date":180,"field":30,"tags":191},[84,192],"pinia",{"path":194,"title":195,"meta":196},"\u002Fko\u002Fhtml2","미치광이 카드 컴포넌트",{"date":197,"field":30,"tags":198},"2025.03.28",[38,32],{"path":200,"title":201,"meta":202},"\u002Fko\u002Fdebounce-guide","debounce와 throttle이란??",{"date":203,"field":30,"tags":204},"2025.03.26",[55],{"path":206,"title":207,"meta":208},"\u002Fko\u002Fhttps-guide","Let's Encrypt를 이용해서 HTTPS 적용하기",{"date":209,"field":131,"tags":210},"2025.03.11",[211],"https",{"path":213,"title":214,"meta":215},"\u002Fko\u002Fdocker-auto-build-run","로컬에서 커밋 시 도커 빌드 후 컨테이너 시작하기",{"date":216,"field":131,"tags":217},"2025.03.10",[91],{"path":219,"title":220,"meta":221},"\u002Fko\u002Fpm2-guide","프로세스 매니저 PM2",{"date":216,"field":131,"tags":222},[92,12],{"path":224,"title":225,"meta":226},"\u002Fko\u002Fjs-data-01","JavaScript 데이터01",{"date":227,"field":30,"tags":228},"2025.03.08",[55],{"path":230,"title":231,"meta":232},"\u002Fko\u002Fjs-data-02","JavaScript 데이터02",{"date":227,"field":30,"tags":233},[55],{"path":235,"title":236,"meta":237},"\u002Fko\u002Fnuxt3-unit-test","Nuxt 프로젝트에 유닛 테스트 코드 추가하기",{"date":238,"image":239,"field":30,"tags":240},"2025.03.07","unit-test.jpg",[84,241],"vitest",{"path":243,"title":244,"meta":245},"\u002Fko\u002Fmarkdown-guid","마크다운 문법",{"date":246,"image":247,"field":82,"tags":248},"2025.03.02","markdown.webp",[249],"markdown",{"path":251,"title":252,"meta":253},"\u002Fko\u002Fdisplaying-commits-with-github-actions","깃허브 액션으로 커밋 로그를 블로그에 띄우기: Nuxt와 Vercel 활용법",{"date":254,"image":255,"field":131,"tags":256},"2025.02.28","github-commits.jpg",[257,44,84],"github-actions",{"path":259,"title":260,"meta":261},"\u002Fko\u002Fuse-context","리엑트 상태관리 useContext()",{"date":262,"field":30,"tags":263},"2025.02.03",[162],{"path":265,"title":266,"meta":267},"\u002Fko\u002Fnode-simple-server","Node.js 간단한 서버 만들기",{"date":268,"field":9,"tags":269},"2025.01.30",[12],{"path":271,"title":272,"meta":273},"\u002Fko\u002Freact-createportal","React createPortal 완벽 가이드",{"date":274,"field":30,"tags":275},"2025.01.27",[162],{"path":277,"title":278,"meta":279},"\u002Fko\u002Fcss-layouts","CSS Flexbox 완전 정복 가이드",{"date":280,"image":281,"field":30,"tags":282},"2025.01.25","css.jpg",[32],{"path":284,"title":285,"meta":286},"\u002Fko\u002Fhtml","HTML이란 무엇인가",{"date":280,"image":287,"field":30,"tags":288},"html.jpg",[38],{"path":290,"title":291,"meta":292},"\u002Fko\u002Fvue-component-guide","Vue의 \u003Ccomponent :is \u002F> 완벽 정리: 동적 렌더링의 모든 것",{"date":280,"field":30,"tags":293},[153],{"path":295,"title":296,"meta":297},"\u002Fko\u002Fnuxt-useasyncdata-cache-error","useAsyncData 캐싱 문제와 Key 동적 설정으로 해결하기",{"date":298,"field":30,"tags":299,"image":300},"2025.01.24",[84],"cache.jpg",{"path":302,"title":303,"meta":304},"\u002Fko\u002Fnuxt-vercel-sql-error","Nuxt 3에서 Vercel 배포 시 발생한 md 파일 로딩 문제 해결기",{"date":298,"image":305,"field":30,"tags":306},"ssg.jpg",[84,104,44],{"path":308,"title":309,"meta":310},"\u002Fko\u002Frouting","Routing",{"date":311,"field":30,"tags":312},"2025.01.22",[84],{"path":314,"title":315,"meta":316},"\u002Fko\u002Fdesign-guide","Design-Guide",{"date":317,"field":30,"tags":318},"2025.01.19",[319],"design-system",1791864389360]