From 97c0289b1d8a1321cd1658881b825815c7f1d80a Mon Sep 17 00:00:00 2001 From: DoHeonLim Date: Mon, 6 Jul 2026 21:14:38 +0900 Subject: [PATCH] =?UTF-8?q?=F0=9F=93=84=20Legal=20:=20=EC=9D=B4=EC=9A=A9?= =?UTF-8?q?=EC=95=BD=EA=B4=80=EA=B3=BC=20=EA=B0=9C=EC=9D=B8=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EC=B2=98=EB=A6=AC=EB=B0=A9=EC=B9=A8=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [๐Ÿ“„ Legal] - ์ด์šฉ์•ฝ๊ด€๊ณผ ๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ๋ฐฉ์นจ ๊ณต๊ฐœ ํŽ˜์ด์ง€ ์ถ”๊ฐ€ - ์‚ฌ์šฉ์ž๊ฐ€ ์„ ํƒํ•œ ํ™œ๋™/๊ฑฐ๋ž˜ ์ง€์—ญ ์ •๋ณด ์ฒ˜๋ฆฌ ๊ธฐ์ค€ ๋ช…์‹œ - ์™ธ๋ถ€ ์„œ๋น„์Šค ์ฒ˜๋ฆฌ ์œ„ํƒ๊ณผ ๋ฌธ์˜์ฒ˜ ์•ˆ๋‚ด ์ถ”๊ฐ€ [๐Ÿ”— Navigation] - ๋กœ๊ทธ์ธ ์ „ ๋ฉ”์ธ๊ณผ ์ธ์ฆ ํ™”๋ฉด ํ•˜๋‹จ์— ์•ฝ๊ด€/๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ๋ฐฉ์นจ ๋งํฌ ์ถ”๊ฐ€ - ํ”„๋กœํ•„ ์„ค์ • ๋ฉ”๋‰ด์— ์•ฝ๊ด€/๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ๋ฐฉ์นจ ์ง„์ž…์  ์ถ”๊ฐ€ - ๋ฌธ์„œ ์ƒ๋‹จ์— ๋ช…์‹œ์ ์ธ ๋’ค๋กœ๊ฐ€๊ธฐ ๋ฒ„ํŠผ ์ ์šฉ [๐Ÿ›ก๏ธ Middleware] - /terms, /privacy ๊ฒฝ๋กœ๋ฅผ ๋น„๋กœ๊ทธ์ธ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๊ณต๊ฐœ ๊ฒฝ๋กœ๋กœ ํ—ˆ์šฉ [โœ… Verification] - git diff --check - npx tsc --noEmit - npm run lint --- app/(public)/privacy/page.tsx | 134 +++++++++++++++++ app/(public)/terms/page.tsx | 135 ++++++++++++++++++ features/auth/components/AccountBox.tsx | 3 + features/auth/components/AuthPageShell.tsx | 4 + features/legal/components/LegalLinks.tsx | 63 ++++++++ .../components/profile/ProfileSettingMenu.tsx | 26 ++++ middleware.ts | 3 + 7 files changed, 368 insertions(+) create mode 100644 app/(public)/privacy/page.tsx create mode 100644 app/(public)/terms/page.tsx create mode 100644 features/legal/components/LegalLinks.tsx diff --git a/app/(public)/privacy/page.tsx b/app/(public)/privacy/page.tsx new file mode 100644 index 00000000..5ceca1e9 --- /dev/null +++ b/app/(public)/privacy/page.tsx @@ -0,0 +1,134 @@ +/** + * File Name : app/(public)/privacy/page.tsx + * Description : BoardPort ๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ๋ฐฉ์นจ ํŽ˜์ด์ง€ + * Author : ์ž„๋„ํ—Œ + * + * History + * Date Author Status Description + * 2026.07.06 ์ž„๋„ํ—Œ Created ๊ณต๊ฐœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ๋ฐฉ์นจ ํŽ˜์ด์ง€ ์ถ”๊ฐ€ + */ +import type { Metadata } from "next"; +import Link from "next/link"; +import BackButton from "@/components/global/BackButton"; + +export const metadata: Metadata = { + title: "๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ๋ฐฉ์นจ", + description: "BoardPort ๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ๋ฐฉ์นจ์ž…๋‹ˆ๋‹ค.", +}; + +const sections = [ + { + title: "1. ์ˆ˜์ง‘ํ•˜๋Š” ๊ฐœ์ธ์ •๋ณด", + body: [ + "BoardPort๋Š” ํšŒ์› ๊ฐ€์ž…, ๋กœ๊ทธ์ธ, ํ”„๋กœํ•„ ์„ค์ •, ๊ฑฐ๋ž˜/์ปค๋ฎค๋‹ˆํ‹ฐ ๊ธฐ๋Šฅ ์ œ๊ณต์„ ์œ„ํ•ด ์ด๋ฉ”์ผ, ํœด๋Œ€ํฐ ๋ฒˆํ˜ธ, ๋‹‰๋„ค์ž„, ํ”„๋กœํ•„ ์ด๋ฏธ์ง€, ์„ ํƒํ•œ ํ™œ๋™ ์ง€์—ญ ๋ฐ ๊ฑฐ๋ž˜ ์ง€์—ญ ์ •๋ณด๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.", + "์ƒํ’ˆ, ๊ฒŒ์‹œ๊ธ€, ๋Œ“๊ธ€, ์ฑ„ํŒ…, ๋ฐฉ์†ก/VOD, ์ด๋ฏธ์ง€, ์˜์ƒ, ์‹ ๊ณ , ๋ฆฌ๋ทฐ ๋“ฑ ์ด์šฉ์ž๊ฐ€ ์„œ๋น„์Šค์— ๋“ฑ๋กํ•˜๊ฑฐ๋‚˜ ์ฃผ๊ณ ๋ฐ›์€ ์ฝ˜ํ…์ธ ์™€ ํ™œ๋™ ๊ธฐ๋ก์ด ์ €์žฅ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.", + "์„œ๋น„์Šค ์•ˆ์ •์„ฑ, ๋ณด์•ˆ, ๋ถ€์ • ์ด์šฉ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด IP ์ฃผ์†Œ, ์ ‘์† ๋กœ๊ทธ, ๊ธฐ๊ธฐ/๋ธŒ๋ผ์šฐ์ € ์ •๋ณด, ์ฟ ํ‚ค, ์•Œ๋ฆผ ๊ตฌ๋… ์ •๋ณด, rate limit ๊ธฐ๋ก์ด ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.", + ], + }, + { + title: "2. ๊ฐœ์ธ์ •๋ณด ์ด์šฉ ๋ชฉ์ ", + body: [ + "๊ณ„์ • ์ƒ์„ฑ๊ณผ ๋กœ๊ทธ์ธ, ๋ณธ์ธ ํ™•์ธ, SMS/์ด๋ฉ”์ผ ์ธ์ฆ, ํ”„๋กœํ•„ ๊ด€๋ฆฌ ๋“ฑ ํšŒ์› ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ๊ฐœ์ธ์ •๋ณด๋ฅผ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค.", + "์ƒํ’ˆ ๊ฑฐ๋ž˜, ์ฑ„ํŒ… ์•ฝ์†, ๊ฒŒ์‹œ๊ธ€, ๋ฐฉ์†ก/VOD, ์•Œ๋ฆผ, ์‹ ๊ณ  ์ฒ˜๋ฆฌ, ๊ด€๋ฆฌ์ž ์šด์˜ ๋“ฑ ์„œ๋น„์Šค ๊ธฐ๋Šฅ ์ œ๊ณต์„ ์œ„ํ•ด ๊ฐœ์ธ์ •๋ณด๋ฅผ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค.", + "์„œ๋น„์Šค ๋ณด์•ˆ, ์ŠคํŒธ ๋ฐ ์ž๋™ํ™” ์š”์ฒญ ๋ฐฉ์ง€, ์žฅ์•  ๋Œ€์‘, ์ด์šฉ ์ œํ•œ ๋ฐ ์šด์˜ ์ •์ฑ… ์ง‘ํ–‰์„ ์œ„ํ•ด ์ ‘์† ๊ธฐ๋ก๊ณผ ์š”์ฒญ ์ •๋ณด๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.", + ], + }, + { + title: "3. ์ง€์—ญ ์ •๋ณด ์ฒ˜๋ฆฌ", + body: [ + "BoardPort๋Š” ํ˜„์žฌ ์œ„์น˜๋ฅผ ์ž๋™์œผ๋กœ ์ถ”์ ํ•˜๋Š” ์œ„์น˜๊ธฐ๋ฐ˜์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.", + "์ด์šฉ์ž๊ฐ€ ์ง์ ‘ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ์ž…๋ ฅํ•œ ํ™œ๋™ ์ง€์—ญ๊ณผ ๊ฑฐ๋ž˜ ์ง€์—ญ์€ ์ƒํ’ˆ ๋ชฉ๋ก, ๊ฒŒ์‹œ๊ธ€ ํ”ผ๋“œ, ์•Œ๋ฆผ, ์ง๊ฑฐ๋ž˜ ์•ฝ์† ๋“ฑ ์ง€์—ญ ๊ธฐ๋ฐ˜ ํ™”๋ฉด์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.", + ], + }, + { + title: "4. ์™ธ๋ถ€ ์„œ๋น„์Šค์™€ ์ฒ˜๋ฆฌ ์œ„ํƒ", + body: [ + "์„œ๋น„์Šค ์šด์˜์„ ์œ„ํ•ด Vercel, Supabase/PostgreSQL, Cloudflare Images/Stream, CoolSMS, Resend, ๋ธŒ๋ผ์šฐ์ €/์šด์˜์ฒด์ œ์˜ Web Push ์ธํ”„๋ผ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.", + "์ด๋ฏธ์ง€์™€ ์˜์ƒ ์—…๋กœ๋“œ, ๋ผ์ด๋ธŒ/VOD ์ฒ˜๋ฆฌ, SMS ์ธ์ฆ, ์ด๋ฉ”์ผ ์ธ์ฆ, ์•Œ๋ฆผ ์ „์†ก, ์„œ๋น„์Šค ๋ฐฐํฌ์™€ ๋ฐ์ดํ„ฐ ์ €์žฅ ๊ณผ์ •์—์„œ ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ์ •๋ณด๊ฐ€ ๊ฐ ์™ธ๋ถ€ ์„œ๋น„์Šค๋กœ ์ „๋‹ฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.", + "์™ธ๋ถ€ ์„œ๋น„์Šค๋Š” ๊ฐ์ž์˜ ๋ณด์•ˆ ๋ฐ ๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ ๊ธฐ์ค€์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.", + ], + }, + { + title: "5. ๋ณด์œ  ๋ฐ ํŒŒ๊ธฐ", + body: [ + "๊ฐœ์ธ์ •๋ณด๋Š” ์„œ๋น„์Šค ์ œ๊ณต๊ณผ ์šด์˜ ๋ชฉ์ ์ด ๋‹ฌ์„ฑ๋  ๋•Œ๊นŒ์ง€ ๋ณด๊ด€ํ•˜๋ฉฐ, ํšŒ์› ํƒˆํ‡ด ๋˜๋Š” ์‚ญ์ œ ์š”์ฒญ ์‹œ ๊ด€๋ จ ๋ฒ•๋ น๊ณผ ์šด์˜์ƒ ํ•„์š”ํ•œ ๋ฒ”์œ„๋ฅผ ์ œ์™ธํ•˜๊ณ  ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ๋น„์‹๋ณ„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.", + "์‹ ๊ณ , ์ œ์žฌ, ๊ฐ์‚ฌ ๋กœ๊ทธ, ๋ณด์•ˆ ๊ธฐ๋ก ๋“ฑ ๋ถ„์Ÿ ๋Œ€์‘๊ณผ ์„œ๋น„์Šค ์•ˆ์ „์„ ์œ„ํ•ด ํ•„์š”ํ•œ ์ •๋ณด๋Š” ์ผ์ • ๊ธฐ๊ฐ„ ๋ณด๊ด€๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.", + "SMS ์ธ์ฆ๋ฒˆํ˜ธ, ๋น„๋ฐ€๋ฒˆํ˜ธ ์žฌ์„ค์ • ํ† ํฐ ๋“ฑ ์ผํšŒ์„ฑ ์ธ์ฆ ์ •๋ณด๋Š” ์ •ํ•ด์ง„ ์œ ํšจ ๊ธฐ๊ฐ„์ด ์ง€๋‚˜๋ฉด ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ์„œ๋น„์Šค ์š”์ฒญ ์‹œ ์ง€์—ฐ ์ •๋ฆฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.", + ], + }, + { + title: "6. ์ด์šฉ์ž์˜ ๊ถŒ๋ฆฌ", + body: [ + "์ด์šฉ์ž๋Š” ์ž์‹ ์˜ ๊ฐœ์ธ์ •๋ณด์— ๋Œ€ํ•ด ์—ด๋žŒ, ์ •์ •, ์‚ญ์ œ, ํƒˆํ‡ด๋ฅผ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.", + "์„œ๋น„์Šค ํ™”๋ฉด์—์„œ ์ง์ ‘ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋Š” ์ •๋ณด๋‚˜ ์ถ”๊ฐ€ ์š”์ฒญ์€ ์šด์˜์ž ๋ฌธ์˜๋ฅผ ํ†ตํ•ด ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.", + "๋ฒ•๋ น์ƒ ๋ณด๊ด€์ด ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ๋ถ€์ • ์ด์šฉ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ํ•„์š”ํ•œ ์ •๋ณด๋Š” ์š”์ฒญ ์ฆ‰์‹œ ์‚ญ์ œ๊ฐ€ ์ œํ•œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.", + ], + }, + { + title: "7. ์ฟ ํ‚ค, ๋กœ๊ทธ, ์•Œ๋ฆผ", + body: [ + "์„œ๋น„์Šค๋Š” ๋กœ๊ทธ์ธ ์„ธ์…˜ ์œ ์ง€, ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ๊ฐœ์„ , ๋ณด์•ˆ ํ™•์ธ์„ ์œ„ํ•ด ์ฟ ํ‚ค์™€ ๋ธŒ๋ผ์šฐ์ € ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.", + "Web Push ์•Œ๋ฆผ์„ ์„ ํƒํ•œ ๊ฒฝ์šฐ ๋ธŒ๋ผ์šฐ์ € ๋˜๋Š” ๊ธฐ๊ธฐ์—์„œ ๋ฐœ๊ธ‰ํ•œ ํ‘ธ์‹œ ๊ตฌ๋… ์ •๋ณด๊ฐ€ ์ €์žฅ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด์šฉ์ž๋Š” ๋ธŒ๋ผ์šฐ์ € ๋˜๋Š” ์„œ๋น„์Šค ์„ค์ •์—์„œ ์•Œ๋ฆผ์„ ํ•ด์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.", + ], + }, + { + title: "8. ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ ๋ฌธ์˜", + body: [ + "๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ์™€ ๊ด€๋ จํ•œ ๋ฌธ์˜๋Š” ์„œ๋น„์Šค ์šด์˜์ž ์ด๋ฉ”์ผ๋กœ ์ ‘์ˆ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.", + "๋ฌธ์˜์ฒ˜: ldh2233@gmail.com", + ], + }, + { + title: "9. ๋ฐฉ์นจ ๋ณ€๊ฒฝ", + body: [ + "๋ณธ ๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ๋ฐฉ์นจ์€ ์„œ๋น„์Šค ๊ธฐ๋Šฅ, ์šด์˜ ํ™˜๊ฒฝ, ๋ฒ•๋ น ๋ณ€๊ฒฝ์— ๋”ฐ๋ผ ์ˆ˜์ •๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.", + "์ค‘์š”ํ•œ ๋ณ€๊ฒฝ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์„œ๋น„์Šค ํ™”๋ฉด ๋˜๋Š” ๊ณต์ง€์‚ฌํ•ญ์„ ํ†ตํ•ด ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค.", + ], + }, +]; + +export default function PrivacyPage() { + return ( +
+
+
+ +
+

+ ๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ๋ฐฉ์นจ +

+

+ ์‹œํ–‰์ผ: 2026๋…„ 7์›” 6์ผ +

+
+
+ +
+ {sections.map((section) => ( +
+

+ {section.title} +

+
+ {section.body.map((paragraph) => ( +

{paragraph}

+ ))} +
+
+ ))} +
+ +
+ ์„œ๋น„์Šค ์ด์šฉ ์กฐ๊ฑด์€{" "} + + ์ด์šฉ์•ฝ๊ด€ + + ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +
+
+
+ ); +} diff --git a/app/(public)/terms/page.tsx b/app/(public)/terms/page.tsx new file mode 100644 index 00000000..28631b34 --- /dev/null +++ b/app/(public)/terms/page.tsx @@ -0,0 +1,135 @@ +/** + * File Name : app/(public)/terms/page.tsx + * Description : BoardPort ์„œ๋น„์Šค ์ด์šฉ์•ฝ๊ด€ ํŽ˜์ด์ง€ + * Author : ์ž„๋„ํ—Œ + * + * History + * Date Author Status Description + * 2026.07.06 ์ž„๋„ํ—Œ Created ๊ณต๊ฐœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์„œ๋น„์Šค ์ด์šฉ์•ฝ๊ด€ ํŽ˜์ด์ง€ ์ถ”๊ฐ€ + */ +import type { Metadata } from "next"; +import Link from "next/link"; +import BackButton from "@/components/global/BackButton"; + +export const metadata: Metadata = { + title: "์ด์šฉ์•ฝ๊ด€", + description: "BoardPort ์„œ๋น„์Šค ์ด์šฉ์•ฝ๊ด€์ž…๋‹ˆ๋‹ค.", +}; + +const sections = [ + { + title: "1. ๋ชฉ์ ", + body: [ + "๋ณธ ์•ฝ๊ด€์€ BoardPort๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ณด๋“œ๊ฒŒ์ž„ ๊ฑฐ๋ž˜, ์ปค๋ฎค๋‹ˆํ‹ฐ, ์ฑ„ํŒ…, ๋ฐฉ์†ก/VOD, ์•Œ๋ฆผ ๋ฐ ๊ด€๋ จ ์„œ๋น„์Šค์˜ ์ด์šฉ ์กฐ๊ฑด๊ณผ ์ ˆ์ฐจ, ์ด์šฉ์ž์™€ ์„œ๋น„์Šค์˜ ๊ถŒ๋ฆฌ์™€ ์˜๋ฌด๋ฅผ ์ •ํ•ฉ๋‹ˆ๋‹ค.", + "BoardPort๋Š” ์šด์˜ ๊ณผ์ •์—์„œ ์„œ๋น„์Šค ๋ฒ”์œ„์™€ ์ •์ฑ…์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ค‘์š”ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์„œ๋น„์Šค ํ™”๋ฉด ๋˜๋Š” ๊ณต์ง€์‚ฌํ•ญ์„ ํ†ตํ•ด ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค.", + ], + }, + { + title: "2. ๊ณ„์ •๊ณผ ์ด์šฉ ์ž๊ฒฉ", + body: [ + "์ด์šฉ์ž๋Š” ์ด๋ฉ”์ผ, ํœด๋Œ€ํฐ ๋ฒˆํ˜ธ, ์†Œ์…œ ๋กœ๊ทธ์ธ ๋“ฑ ์„œ๋น„์Šค๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ณ„์ •์„ ๋งŒ๋“ค๊ฑฐ๋‚˜ ๋กœ๊ทธ์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.", + "์ด์šฉ์ž๋Š” ๊ฐ€์ž… ๋ฐ ์„œ๋น„์Šค ์ด์šฉ ๊ณผ์ •์—์„œ ์ •ํ™•ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•˜๋ฉฐ, ํƒ€์ธ์˜ ๊ณ„์ • ๋˜๋Š” ์ธ์ฆ ์ˆ˜๋‹จ์„ ๋ฌด๋‹จ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.", + "์„œ๋น„์Šค๋Š” ๋ณด์•ˆ, ์ŠคํŒธ ๋ฐฉ์ง€, ์šด์˜ ์ •์ฑ… ์œ„๋ฐ˜ ๋Œ€์‘์„ ์œ„ํ•ด ๊ณ„์ • ์ƒ์„ฑ, ๋กœ๊ทธ์ธ, SMS ์ธ์ฆ ๋“ฑ ์ผ๋ถ€ ์š”์ฒญ์„ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.", + ], + }, + { + title: "3. ๊ฒŒ์‹œ๋ฌผ๊ณผ ๊ฑฐ๋ž˜ ํ™œ๋™", + body: [ + "์ด์šฉ์ž๋Š” ์ƒํ’ˆ, ๊ฒŒ์‹œ๊ธ€, ๋Œ“๊ธ€, ์ฑ„ํŒ…, ๋ฐฉ์†ก, ์ด๋ฏธ์ง€, ์˜์ƒ ๋“ฑ ์ž์‹ ์ด ๋“ฑ๋กํ•œ ์ฝ˜ํ…์ธ ์™€ ๊ฑฐ๋ž˜ ํ™œ๋™์— ๋Œ€ํ•œ ์ฑ…์ž„์„ ์ง‘๋‹ˆ๋‹ค.", + "BoardPort๋Š” ์ด์šฉ์ž ๊ฐ„ ๊ฑฐ๋ž˜์˜ ์ค‘๊ฐœ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•˜๋ฉฐ, ๊ฐœ๋ณ„ ๊ฑฐ๋ž˜์˜ ๋‹น์‚ฌ์ž๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.", + "ํ—ˆ์œ„ ์ •๋ณด, ํƒ€์ธ์˜ ๊ถŒ๋ฆฌ ์นจํ•ด, ๋ถˆ๋ฒ• ๋ฌผํ’ˆ ๊ฑฐ๋ž˜, ์š•์„ค ๋˜๋Š” ๊ดด๋กญํž˜, ์„œ๋น„์Šค ์šด์˜์„ ๋ฐฉํ•ดํ•˜๋Š” ํ–‰์œ„๋Š” ์ œํ•œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.", + ], + }, + { + title: "4. ์ฑ„ํŒ…๊ณผ ์•ฝ์†", + body: [ + "์ด์šฉ์ž๋Š” ์ƒํ’ˆ ๊ฑฐ๋ž˜๋ฅผ ์œ„ํ•ด ์ฑ„ํŒ…๊ณผ ์•ฝ์† ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.", + "์•ฝ์† ์ˆ˜๋ฝ, ์ทจ์†Œ, ๊ฑฐ์ ˆ ๋“ฑ ๊ฑฐ๋ž˜ ์ƒํƒœ์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ํ–‰์œ„๋Š” ์„œ๋น„์Šค ํ™”๋ฉด์— ํ‘œ์‹œ๋˜๋Š” ์ƒํƒœ์™€ ์•Œ๋ฆผ์— ๋ฐ˜์˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.", + "์ด์šฉ์ž๋Š” ์‹ค์ œ ๊ฑฐ๋ž˜ ๊ณผ์ •์—์„œ ์ƒ๋Œ€๋ฐฉ๊ณผ ์ถฉ๋ถ„ํžˆ ํ™•์ธํ•˜๊ณ , ์•ˆ์ „ํ•œ ์žฅ์†Œ์™€ ๋ฐฉ์‹์œผ๋กœ ๊ฑฐ๋ž˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.", + ], + }, + { + title: "5. ์‹ ๊ณ , ์ œ์žฌ, ์ฝ˜ํ…์ธ  ์กฐ์น˜", + body: [ + "์ด์šฉ์ž๋Š” ๋ถ€์ ์ ˆํ•œ ์ƒํ’ˆ, ๊ฒŒ์‹œ๊ธ€, ๋ฐฉ์†ก, ํ”„๋กœํ•„, ์‚ฌ์šฉ์ž ํ–‰์œ„๋ฅผ ์‹ ๊ณ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.", + "์„œ๋น„์Šค๋Š” ์‹ ๊ณ  ๋‚ด์šฉ, ์šด์˜ ์ •์ฑ… ์œ„๋ฐ˜ ์—ฌ๋ถ€, ์„œ๋น„์Šค ์•ˆ์ •์„ฑ ๋“ฑ์„ ๊ฒ€ํ† ํ•ด ์ฝ˜ํ…์ธ  ์ˆจ๊น€, ์‚ญ์ œ, ๊ณ„์ • ์ œํ•œ, ์ •์ง€ ๋“ฑ์˜ ์กฐ์น˜๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.", + "๋ช…๋ฐฑํ•œ ์œ„๋ฐ˜ ๋˜๋Š” ๊ธด๊ธ‰ํ•œ ํ”ผํ•ด ๋ฐฉ์ง€๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์‚ฌ์ „ ์•ˆ๋‚ด ์—†์ด ์ž„์‹œ ์กฐ์น˜๊ฐ€ ์ด๋ฃจ์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.", + ], + }, + { + title: "6. ์„œ๋น„์Šค ๋ณ€๊ฒฝ๊ณผ ์ค‘๋‹จ", + body: [ + "์„œ๋น„์Šค๋Š” ๊ธฐ๋Šฅ ๊ฐœ์„ , ๋ณด์•ˆ ์กฐ์น˜, ์žฅ์•  ๋Œ€์‘, ์™ธ๋ถ€ ์„œ๋น„์Šค ์—ฐ๋™ ์ƒํƒœ ๋“ฑ์— ๋”ฐ๋ผ ์ผ๋ถ€ ๊ธฐ๋Šฅ์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์ค‘๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.", + "Cloudflare, Supabase, Vercel, SMS/์ด๋ฉ”์ผ ๋ฐœ์†ก ์„œ๋น„์Šค ๋“ฑ ์™ธ๋ถ€ ์„œ๋น„์Šค ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ผ๋ถ€ ๊ธฐ๋Šฅ ์ด์šฉ์ด ์ œํ•œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.", + ], + }, + { + title: "7. ๋ฉด์ฑ…", + body: [ + "BoardPort๋Š” ์ด์šฉ์ž ๊ฐ„ ๊ฑฐ๋ž˜, ๊ฒŒ์‹œ๋ฌผ, ์ฑ„ํŒ… ๋‚ด์šฉ, ์™ธ๋ถ€ ๋งํฌ ๋˜๋Š” ์ด์šฉ์ž๊ฐ€ ๋“ฑ๋กํ•œ ์ฝ˜ํ…์ธ ์˜ ์ •ํ™•์„ฑ๊ณผ ์‹ ๋ขฐ์„ฑ์„ ๋ณด์ฆํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.", + "์ด์šฉ์ž์˜ ๊ท€์ฑ… ์‚ฌ์œ , ์™ธ๋ถ€ ์„œ๋น„์Šค ์žฅ์• , ์ฒœ์žฌ์ง€๋ณ€ ๋˜๋Š” ์ด์— ์ค€ํ•˜๋Š” ์‚ฌ์œ ๋กœ ๋ฐœ์ƒํ•œ ์†ํ•ด์— ๋Œ€ํ•ด์„œ๋Š” ์ฑ…์ž„์ด ์ œํ•œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.", + ], + }, + { + title: "8. ์•ฝ๊ด€ ๋ณ€๊ฒฝ", + body: [ + "์„œ๋น„์Šค๋Š” ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋ณธ ์•ฝ๊ด€์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ค‘์š”ํ•œ ๋ณ€๊ฒฝ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์„œ๋น„์Šค ํ™”๋ฉด ๋˜๋Š” ๊ณต์ง€์‚ฌํ•ญ์„ ํ†ตํ•ด ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค.", + "๋ณ€๊ฒฝ๋œ ์•ฝ๊ด€์€ ๋ณ„๋„ ์‹œํ–‰์ผ์„ ์ •ํ•˜์ง€ ์•Š๋Š” ํ•œ ๊ฒŒ์‹œ๋œ ๋‚ ๋ถ€ํ„ฐ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.", + ], + }, + { + title: "9. ๋ฌธ์˜", + body: [ + "์„œ๋น„์Šค ์ด์šฉ, ์•ฝ๊ด€, ์šด์˜ ์ •์ฑ…๊ณผ ๊ด€๋ จํ•œ ๋ฌธ์˜๋Š” ์šด์˜์ž ์ด๋ฉ”์ผ๋กœ ์ ‘์ˆ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.", + "๋ฌธ์˜์ฒ˜: ldh2233@gmail.com", + ], + }, +]; + +export default function TermsPage() { + return ( +
+
+
+ +
+

์ด์šฉ์•ฝ๊ด€

+

+ ์‹œํ–‰์ผ: 2026๋…„ 7์›” 6์ผ +

+
+
+ +
+ {sections.map((section) => ( +
+

+ {section.title} +

+
+ {section.body.map((paragraph) => ( +

{paragraph}

+ ))} +
+
+ ))} +
+ +
+ ๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ ๊ธฐ์ค€์€{" "} + + ๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ๋ฐฉ์นจ + + ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +
+
+
+ ); +} diff --git a/features/auth/components/AccountBox.tsx b/features/auth/components/AccountBox.tsx index d453fdec..e5f1a9d9 100644 --- a/features/auth/components/AccountBox.tsx +++ b/features/auth/components/AccountBox.tsx @@ -17,11 +17,13 @@ * 2026.04.12 ์ž„๋„ํ—Œ Modified ๋กœ๊ทธ์ธ ์ „ ๋ฉ”์ธ CTA ์นด๋“œ์˜ ํ‘œ๋ฉด๊ฐ๊ณผ ๋Œ€๋น„๋ฅผ ์ •๋ฆฌํ•ด ์ „ํ™˜์„ฑ๊ณผ ํŒ๋…์„ฑ์„ ๋ณด๊ฐ• * 2026.04.13 ์ž„๋„ํ—Œ Modified ํšŒ์›๊ฐ€์ž… ๋ฒ„ํŠผ ํ…Œ๋‘๋ฆฌ ํ†ค์„ ์นด๋“œ ์ฃผ๋ณ€ ์ƒ‰๊ฐ์— ๋งž๊ฒŒ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์กฐ์ • * 2026.04.20 ์ž„๋„ํ—Œ Modified ๋กœ๊ทธ์ธ ์ „ ๋ฉ”์ธ CTA ์ „์šฉ ๋น„์ฃผ์–ผ ๊ทœ์น™์„ CSS Module๋กœ ์ •๋ฆฌํ•ด className ๋ณต์žก๋„๋ฅผ ๋‚ฎ์ถค + * 2026.07.06 ์ž„๋„ํ—Œ Modified ๋กœ๊ทธ์ธ ์ „ ๋ฉ”์ธ CTA ํ•˜๋‹จ์— ์•ฝ๊ด€/๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ๋ฐฉ์นจ ๋งํฌ ์ถ”๊ฐ€ */ import Link from "next/link"; import { ArrowRightIcon } from "@heroicons/react/24/solid"; import mainPageStyles from "@/features/auth/components/mainPage.module.css"; +import LegalLinks from "@/features/legal/components/LegalLinks"; export default function AccountBox() { return ( @@ -42,6 +44,7 @@ export default function AccountBox() { ์ƒˆ๋กœ์šด ์„ ์›์œผ๋กœ ๋“ฑ๋ก + ); } diff --git a/features/auth/components/AuthPageShell.tsx b/features/auth/components/AuthPageShell.tsx index c3af736f..176ef7b9 100644 --- a/features/auth/components/AuthPageShell.tsx +++ b/features/auth/components/AuthPageShell.tsx @@ -6,9 +6,11 @@ * History * Date Author Status Description * 2026.04.13 ์ž„๋„ํ—Œ Created ๋กœ๊ทธ์ธ/ํšŒ์›๊ฐ€์ž…/SMS/๋น„๋ฐ€๋ฒˆํ˜ธ ์žฌ์„ค์ • ๊ณ„์—ด ํŽ˜์ด์ง€์˜ ๊ณตํ†ต ํ—ค๋”์™€ ๋ณธ๋ฌธ ํญ์„ ์žฌ์‚ฌ์šฉํ•˜๋Š” ์…ธ ์ถ”๊ฐ€ + * 2026.07.06 ์ž„๋„ํ—Œ Modified ์ธ์ฆ ํ™”๋ฉด ํ•˜๋‹จ์— ์ด์šฉ์•ฝ๊ด€/๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ๋ฐฉ์นจ ๋งํฌ ์ถ”๊ฐ€ */ import type { ReactNode } from "react"; import Logo from "@/components/ui/Logo"; +import LegalLinks from "@/features/legal/components/LegalLinks"; import { cn } from "@/lib/utils"; interface AuthPageShellProps { @@ -47,6 +49,8 @@ export default function AuthPageShell({
{children}
+ + ); } diff --git a/features/legal/components/LegalLinks.tsx b/features/legal/components/LegalLinks.tsx new file mode 100644 index 00000000..64340893 --- /dev/null +++ b/features/legal/components/LegalLinks.tsx @@ -0,0 +1,63 @@ +/** + * File Name : features/legal/components/LegalLinks.tsx + * Description : ์•ฝ๊ด€/๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ๋ฐฉ์นจ ๋งํฌ ๋ฌถ์Œ + * Author : ์ž„๋„ํ—Œ + * + * History + * Date Author Status Description + * 2026.07.06 ์ž„๋„ํ—Œ Created ๊ณต๊ฐœ/์ธ์ฆ ํ™”๋ฉด์—์„œ ์žฌ์‚ฌ์šฉํ•  ์ •์ฑ… ๋งํฌ ๋ฌถ์Œ ์ถ”๊ฐ€ + */ +import Link from "next/link"; +import { cn } from "@/lib/utils"; + +interface LegalLinksProps { + className?: string; + compact?: boolean; + inverse?: boolean; +} + +/** + * ์„œ๋น„์Šค ์ •์ฑ… ๋ฌธ์„œ๋กœ ์ด๋™ํ•˜๋Š” ๊ณตํ†ต ๋งํฌ ๋ฌถ์Œ + * - ๊ณต๊ฐœ ๋ฉ”์ธ, ์ธ์ฆ ํ™”๋ฉด, ์„ค์ • ๋ฉ”๋‰ด ๋“ฑ์—์„œ ๋™์ผํ•œ ๋งํฌ ์ˆœ์„œ๋ฅผ ์œ ์ง€ + * - ์ž‘์€ ๋ณด์กฐ ๋งํฌ๋กœ ๋…ธ์ถœํ•ด ํ•ต์‹ฌ CTA ํ๋ฆ„์„ ๋ฐฉํ•ดํ•˜์ง€ ์•Š๋„๋ก ๊ตฌ์„ฑ + */ +export default function LegalLinks({ + className, + compact, + inverse, +}: LegalLinksProps) { + const linkClassName = cn( + "focus-ring-soft rounded-md px-1 py-0.5 font-medium transition-colors hover:underline", + inverse ? "hover:text-white" : "hover:text-primary", + compact && "px-0.5" + ); + + return ( + + ); +} diff --git a/features/user/components/profile/ProfileSettingMenu.tsx b/features/user/components/profile/ProfileSettingMenu.tsx index 5a659d67..16e2f45a 100644 --- a/features/user/components/profile/ProfileSettingMenu.tsx +++ b/features/user/components/profile/ProfileSettingMenu.tsx @@ -23,6 +23,7 @@ * 2026.03.14 ์ž„๋„ํ—Œ Modified ํšŒ์› ํƒˆํ‡ด๋ฅผ ๋“œ๋กญ๋‹ค์šด ๋ฐ– ๋…๋ฆฝ ์œ„ํ—˜ ์•ก์…˜์œผ๋กœ ๋ถ„๋ฆฌํ•ด ์„ค์ • ๋ฉ”๋‰ด ํ˜ผ์žฌ๋ฅผ ์™„ํ™” * 2026.03.18 ์ž„๋„ํ—Œ Modified ์„ค์ • ๋ฉ”๋‰ด ํ˜„์žฌ ๊ฒฝ๋กœ๋„ ๋‚ด๋ถ€ ๊ฒฝ๋กœ ๊ธฐ์ค€์œผ๋กœ ์ •๊ทœํ™”ํ•ด nested returnTo ์˜ˆ์™ธ๋ฅผ ์™„ํ™” * 2026.06.21 ์ž„๋„ํ—Œ Modified ์„ค์ • ๋ฉ”๋‰ด ํ•ญ๋ชฉ์„ ์•„์ด์ฝ˜+ํ…์ŠคํŠธ ๋ฌธ๋ฒ•์œผ๋กœ ํ†ต์ผ + * 2026.07.06 ์ž„๋„ํ—Œ Modified ์„ค์ • ๋ฉ”๋‰ด์— ์ด์šฉ์•ฝ๊ด€/๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ๋ฐฉ์นจ ๋งํฌ ์ถ”๊ฐ€ */ "use client"; @@ -33,10 +34,12 @@ import { CheckBadgeIcon, Cog6ToothIcon, ComputerDesktopIcon, + DocumentTextIcon, EnvelopeIcon, ExclamationTriangleIcon, KeyIcon, PencilSquareIcon, + ShieldCheckIcon, UserMinusIcon, } from "@heroicons/react/24/outline"; import { sanitizeCallbackUrl } from "@/features/auth/utils/redirect"; @@ -254,6 +257,29 @@ export default function ProfileSettingMenu({ ์ฐจ๋‹จํ•œ ์„ ์› ๊ด€๋ฆฌ +
+ + setOpen(false)} + > + + ์ด์šฉ์•ฝ๊ด€ + + + setOpen(false)} + > + + ๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ๋ฐฉ์นจ +
)} diff --git a/middleware.ts b/middleware.ts index c616f8b5..02b8bb76 100644 --- a/middleware.ts +++ b/middleware.ts @@ -13,6 +13,7 @@ * 2026.04.12 ์ž„๋„ํ—Œ Modified robots.txtยทsitemap.xml ๋ฉ”ํƒ€ ๋ผ์šฐํŠธ๋ฅผ ์ธ์ฆ ๋ฏธ๋“ค์›จ์–ด ์˜ˆ์™ธ๋กœ ์ฒ˜๋ฆฌ * 2026.05.15 ์ž„๋„ํ—Œ Modified ๋น„๊ด€๋ฆฌ์ž admin ์ ‘๊ทผ ์‹œ ํ™ˆ ๋Œ€์‹  403 ์•ˆ๋‚ด๋กœ ์ด๋™ํ•˜๋„๋ก ๋ถ„๊ธฐ * 2026.05.15 ์ž„๋„ํ—Œ Modified ๊ณต์œ  ๋ฏธ๋ฆฌ๋ณด๊ธฐ ํฌ๋กค๋Ÿฌ์™€ OG ์ด๋ฏธ์ง€ ๋ผ์šฐํŠธ๋Š” ์ธ์ฆ ๊ฐ€๋“œ ์˜ˆ์™ธ๋กœ ์ฒ˜๋ฆฌ + * 2026.07.06 ์ž„๋„ํ—Œ Modified ์ด์šฉ์•ฝ๊ด€/๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ๋ฐฉ์นจ ๊ณต๊ฐœ ๊ฒฝ๋กœ๋ฅผ ์ธ์ฆ ๊ฐ€๋“œ ์˜ˆ์™ธ๋กœ ์ถ”๊ฐ€ */ import { NextRequest, NextResponse } from "next/server"; @@ -32,6 +33,8 @@ interface IRoutes { const alwaysAccessibleUrls: IRoutes = { "/offline": true, "/403": true, + "/terms": true, + "/privacy": true, "/manifest.webmanifest": true, "/robots.txt": true, "/sitemap.xml": true,