// ─── Nav ───────────────────────────────────────────────────────────────────── const Nav = ({ t, lang, setLang, page, setPage }) => { const [mobileOpen, setMobileOpen] = React.useState(false); React.useEffect(()=>{ document.body.classList.toggle('nav-open', mobileOpen); document.body.style.overflow = mobileOpen ? 'hidden' : ''; return ()=>{ document.body.classList.remove('nav-open'); document.body.style.overflow=''; }; },[mobileOpen]); const isKo = lang === 'ko'; // 최상위 솔루션 메뉴 — 이메일 보안은 하위 제품을 가진 그룹 const solMenu = [ { key:'system', label: isKo?'시스템 보안':'System Security', children:[ { key:'system', label: isKo?'시스템 보안 전체보기':'System Security Overview', sub: isKo?'서버·계정·권한·취약점':'Server · Account · Vulnerability' }, { key:'cce', label:'SolidStep CCE', sub: isKo?'IT 인프라 취약점(CCE) 진단':'Infrastructure (CCE) Assessment', dot:'#0891B2' }, { key:'cve', label:'SolidStep CVE', sub: isKo?'알려진 취약점(CVE) 진단':'Known Vulnerability (CVE) Assessment', dot:'#DC2626' }, ] }, { key:'email', label: isKo?'이메일 보안':'Email Security', children:[ { key:'email', label: isKo?'이메일 보안 전체보기':'Email Security Overview', sub: isKo?'수신·발신·보존 라인업':'Inbound · Outbound · Archiving' }, { key:'spamout', label:'SpamOut', sub: isKo?'수신메일 · 안티 스팸':'Inbound · Anti-Spam', dot:'#2563EB' }, { key:'checkout', label:'CheckOut', sub: isKo?'발신메일 · 유출방지':'Outbound · DLP', dot:'#10B981' }, { key:'arch5', label:'Arch5', sub: isKo?'메일 아카이빙 · 원본보존':'Archiving · Preservation', dot:'#F59E0B' }, ] }, { key:'network', label: isKo?'네트워크 보안':'Network Security', children:[ { key:'network', label: isKo?'네트워크 보안 전체보기':'Network Security Overview', sub: isKo?'내부망·침입탐지·트래픽':'Segmentation · IDS · Traffic' }, { key:'sniper', label:'SNIPER ONE-d', sub: isKo?'디도스(DDoS) 대응':'Anti-DDoS', dot:'#F97316' }, { key:'netwitness', label:'NetWitness NDR', sub: isKo?'네트워크 위협 탐지·대응':'Network detection & response', dot:'#DC2626' }, { key:'genian', label:'Genian NAC', sub: isKo?'네트워크 접근제어(NAC)':'Network Access Control', dot:'#0EA5E9' }, ] }, { key:'ai', label: isKo?'AI 보안':'AI Security', children:[ { key:'ai', label: isKo?'AI 보안 전체보기':'AI Security Overview', sub: isKo?'AI 기반 탐지·분석':'AI-based detection & analysis' }, { key:'mailinsight', label:'Mail Insight', sub: isKo?'AI/RAG 메일 지식DB':'AI/RAG Email Knowledge DB', dot:'#06B6D4' }, ] }, { key:'endpoint', label: isKo?'엔드포인트 보안':'Endpoint Security', children:[ { key:'edr', label:'Genian Insights E', sub: isKo?'EDR · 행위 기반 탐지':'EDR · Behavior detection', dot:'#EF4444' }, { key:'eset', label:'ESET PROTECT Enterprise', sub: isKo?'엔드포인트 · XDR 통합':'Endpoint · XDR unified', dot:'#0EA5E9' }, { key:'mdr', label:'Genian MDR', sub: isKo?'24/7 보안 관제':'24/7 managed detection', dot:'#0EA5E9' }, ] }, { key:'data', label: isKo?'데이터 보안':'Data Security', children:[ { key:'dbsafer', label:'DBSAFER DB', sub: isKo?'DB 접근제어 · SQL 감사':'DB access control · SQL audit', dot:'#7C3AED' }, ] }, { key:'privacy', label: isKo?'개인정보 보호':'Privacy Protection', children:[ { key:'privacy', label: isKo?'개인정보 보호 전체보기':'Privacy Overview', sub: isKo?'수집·동의·암호화·파기':'Collection · consent · disposal' }, { key:'catchsecu', label:'CatchSecu', sub: isKo?'개인정보 관리 자동화':'Privacy management automation', dot:'#6D44E0' }, ] }, ]; const mobileFlat = [ ['system', isKo?'시스템 보안':'System Security'], ['cce', '· SolidStep CCE'],['cve', '· SolidStep CVE'], ['email', isKo?'이메일 보안':'Email Security'], ['spamout', '· SpamOut'],['checkout', '· CheckOut'],['arch5', '· Arch5'], ['network', isKo?'네트워크 보안':'Network Security'], ['sniper', '· SNIPER ONE-d'], ['netwitness', '· NetWitness NDR'], ['genian', '· Genian NAC'], ['ai', isKo?'AI 보안':'AI Security'], ['mailinsight', '· Mail Insight'], ['endpoint', isKo?'엔드포인트 보안':'Endpoint Security'], ['edr', '· Genian Insights E (EDR)'], ['eset', '· ESET PROTECT Enterprise'], ['mdr', '· Genian MDR'], ['data', isKo?'데이터 보안':'Data Security'], ['dbsafer', '· DBSAFER DB'], ['privacy', isKo?'개인정보 보호':'Privacy Protection'], ['catchsecu', '· CatchSecu'], ]; return ( ); }; // ─── Hero visual — 방어 계층 다이어그램 (정적 구조 + 느린 스캔) ────────────────── const HeroLayers = ({ lang }) => { const isKo = lang === 'ko'; const rings = isKo ? [['네트워크 보안', 148], ['이메일 보안', 120], ['엔드포인트 보안', 92], ['데이터 · 개인정보', 64]] : [['Network', 148], ['Email', 120], ['Endpoint', 92], ['Data · Privacy', 64]]; return ( ); }; // ─── Hero ───────────────────────────────────────────────────────────────────── const Hero = ({ t, lang, setPage, openQuote, openDemo }) => (
{t.hero.badge}

{t.hero.title1}
{t.hero.title2}

{t.hero.sub}

{t.hero.stat1}
{t.hero.stat1l}
{t.hero.stat2}
{t.hero.stat2l}
{t.hero.stat3}
{t.hero.stat3l}
); // ─── Values ─────────────────────────────────────────────────────────────────── const Values = ({ t }) => (
WHY 3ES SOFT

{t.values.sub}

{t.values.items.map((v,i)=>(
{v.t}
{v.d}
))}
); // ─── Solutions ──────────────────────────────────────────────────────────────── const Solutions = ({ t, setPage }) => (
SOLUTIONS

{t.solutions.title}

{t.solutions.sub}

{t.solutions.items.map((s,i)=>(
setPage('sol_'+s.key)} style={s.partner?{position:'relative'}:undefined}> {s.partner && (
NEW PARTNER
)}
{solIcons[s.key]}
{s.title}
{s.eng}
{s.desc}
{s.tags.map(tag=>{tag})}
{t.ui.learnMore}
))}
); // ─── Ops ────────────────────────────────────────────────────────────────────── const Ops = ({ t }) => (
{t.ops.badge}

{t.ops.title}

{t.ops.sub}

{t.ops.steps.map((s,i)=>(
{s.n}
{s.t}
{s.d}
))}
); // ─── Partners ───────────────────────────────────────────────────────────────── const Partners = ({ t }) => (
PARTNER ECOSYSTEM

{t.partners.title}

{t.partners.sub}

{t.partners.items.map((p,i)=>
{p}
)}
); // ─── News Section (대시보드화) ──────────────────────────────────────────────── const NewsSection = ({ t, lang, setPage }) => { const isKo = lang === 'ko'; const items = (typeof window.latestNews === 'function' ? window.latestNews(3) : []); if (!items.length) return null; const open = (id) => setPage && setPage(id ? 'article_'+id : 'news'); return (
SECURITY & AI INSIGHTS

{isKo?'보안 · AI 인사이트':(lang==='ja'?'セキュリティ・AIインサイト':'Security & AI Insights')}

{isKo?'보안 동향과 AI 기술 변화를 현장 관점에서 짧게 정리합니다.':'Short, field-level notes on security trends and AI.'}

{items.map((n,i)=>(
open(n.id)}>
{n.cat} {(n.pub||n.date||'').replace(/-/g,'.')}
{n.title}
{n.summary||n.desc}
))}
); }; // ─── References Section ─────────────────────────────────────────────────────── const ReferencesSection = ({ t, lang }) => { const isKo = lang === 'ko'; return (
REFERENCES

{isKo?'주요 고객사':'Key Clients'}

{isKo?'다양한 산업군의 대기업·공공기관이 삼에스소프트와 함께합니다.':'Leading enterprises and public institutions across industries trust 3ES Soft.'}

{t.references.map((r,i)=>(
{r.name}
{r.industry}
{r.solution}
{r.size} {isKo?'명':'users'}
{r.result}
))}
); }; // ─── Custom Section ─────────────────────────────────────────────────────────── const CustomSection = ({ t, lang }) => { const [form, setForm] = React.useState({}); const [sent, setSent] = React.useState(false); const isKo = lang === 'ko'; const detailFields = isKo ? [ { k:'company', label:'회사명', ph:'㈜예시', half:true }, { k:'name', label:'담당자', ph:'홍길동', half:true }, { k:'phone', label:'연락처', ph:'010-0000-0000', half:true }, { k:'email', label:'이메일', ph:'you@company.com', half:true }, { k:'field', label:'개발 분야', ph:'예: 메일 연동, 로그 분석, 정책 자동화', half:false }, { k:'env', label:'현재 환경 / 연동 대상', ph:'예: 그룹웨어, AD, 기존 보안장비 등', half:false }, { k:'detail', label:'요구사항 상세', ph:'원하시는 기능과 목적을 자유롭게 적어주세요. 내용에 맞춰 개발 가능 여부와 방향을 회신드립니다.', area:true }, ] : [ { k:'company', label:'Company', ph:'Acme Inc.', half:true }, { k:'name', label:'Contact', ph:'John Doe', half:true }, { k:'phone', label:'Phone', ph:'+82-10-0000-0000', half:true }, { k:'email', label:'Email', ph:'you@company.com', half:true }, { k:'field', label:'Development Area', ph:'e.g. mail integration, log analysis', half:false }, { k:'env', label:'Current Environment', ph:'e.g. groupware, AD, existing appliances', half:false }, { k:'detail', label:'Requirements', ph:'Describe the features and goals. We reply with feasibility and approach.', area:true }, ]; const steps = isKo ? [['📝','요구사항 접수','원하는 기능·환경·목적을 남겨주세요.'],['🔎','분석·검토','담당 엔지니어가 실현 가능성과 범위를 검토합니다.'],['🤝','제안·회신','개발 방향, 일정, 예상 비용을 회신드립니다.']] : [['📝','Submit','Tell us the features, environment, and goals.'],['🔎','Review','Our engineers assess feasibility and scope.'],['🤝','Proposal','We reply with approach, timeline, and estimate.']]; const handleSubmit = async () => { const msg = `🔧 맞춤 솔루션 개발 문의\n${detailFields.map(f=>f.label+': '+(form[f.k]||'-')).join('\n')}`; await sendTelegram(msg); setSent(true); }; return (
CUSTOM DEVELOPMENT

{t.custom.title}

{t.custom.sub}

{/* How it works */}
{steps.map(([ic,ti,de],i)=>(
STEP {i+1}
{ti}
{de}
))}
{sent ? (
{isKo?'요구사항이 접수되었습니다. 담당 엔지니어가 검토 후 개발 가능 여부와 방향을 회신드립니다.':(lang==='ja'?'ご要望を受け付けました。担当エンジニアが検討のうえご返信します。':'Received. Our engineer will review and reply with feasibility and approach.')}
):(
{detailFields.filter(f=>f.half).map(f=>(
setForm({...form,[f.k]:e.target.value})}/>
))}
{detailFields.filter(f=>!f.half).map(f=>(
{f.area ? : setForm({...form,[f.k]:e.target.value})}/>}
))}
{isKo?'접수 후 영업일 기준 1~2일 내 담당자가 회신드립니다.':(lang==='ja'?'受付後1〜2営業日以内にご返信します。':'We reply within 1–2 business days.')}
)}
); }; // ─── Contact Section ────────────────────────────────────────────────────────── const ContactSection = ({ t, lang, setPage = ()=>{}, bare = false }) => { const [form, setForm] = React.useState({}); const [sent, setSent] = React.useState(false); const [sending, setSending] = React.useState(false); const [kind, setKind] = React.useState('sales'); const [ticket, setTicket] = React.useState(''); const inFlight = React.useRef(false); // 동기 연속 클릭 차단 (state는 stale) const [errs, setErrs] = React.useState({}); const up = (k,v)=>{ setForm(f=>({...f,[k]:v})); if (errs[k]) setErrs(e=>{const n={...e};delete n[k];return n;}); }; const isKo = lang === 'ko'; // 필수 입력 규칙 — 이 항목이 비면 접수되지 않는다 const rules = [ { k:'company', type:'text' }, { k:'name', type:'text' }, { k:'phone', type:'phone' }, { k:'email', type:'email' }, { k:'message', type:'text' }, { k:'_agree', type:'agree' }, ]; const kinds = { sales: { label:isKo?'솔루션·영업 문의':(lang==='ja'?'ソリューション・営業':'Sales / Solutions'), to:'sales@3es.co.kr', desc:isKo?'제품 도입, 견적, 보안 컨설팅 문의':(lang==='ja'?'製品導入・見積もり・セキュリティ相談':'Product, quote, and security consulting'), icon:'💼' }, tech: { label:isKo?'기술·장애 지원':(lang==='ja'?'技術・障害サポート':'Technical / Incident'), to:'tech@3es.co.kr', desc:isKo?'장애 접수, 운영 지원, 긴급 대응':(lang==='ja'?'障害受付・運用サポート・緊急対応':'Incidents, operations, emergencies'), icon:'🛠️' }, }; const handleSubmit = async () => { if (inFlight.current || sent) return; // 중복 제출 방지 (ref = 즉시 반영) const v = window.validateForm(form, rules, lang); if (!v.ok) { setErrs(v.errors); const first = document.querySelector('.contact-form .err'); if (first) { first.focus({preventScroll:true}); } return; } inFlight.current = true; setSending(true); const k = kinds[kind]; const r = await submitLead({ type: k.label, // '솔루션·영업 문의' | '기술·장애 지원' product: (form.solutionText && form.solutionText.trim()) || form.product || '-', company: form.company || '', name: form.name || '', phone: form.phone || '', email: form.email || '', message: form.message || '', extra: { routeTo: k.to }, consent: form._agree === true, policyVersion: (window.PRIVACY_VERSION || 'v1.0'), }); setSending(false); inFlight.current = false; if (!r.ok) { setErrs({ _submit: isKo ? '접수 과정에서 오류가 발생했습니다. sales@3es.co.kr 또는 대표전화 031-212-3390 으로 연락 주세요.' : 'Submission failed. Please email sales@3es.co.kr or call +82-31-212-3390.' }); return; } setTicket(r.ticket); setSent(true); }; return (
{!bare && (
CONTACT

{isKo?'지금 필요한 보안부터 함께 설계하겠습니다':(lang==='ja'?'今必要なところから一緒に設計します':"Let's start with what you need now")}

{isKo?'제품 선택이 어렵거나 현재 보안 환경을 점검하고 싶다면 삼에스소프트 보안 전문가에게 문의하세요.':'If choosing is hard or you want your current setup reviewed, talk to a 3ES specialist.'}

)}
{isKo?'문의 채널':(lang==='ja'?'お問い合わせ窓口':'Contact Channels')}
{Object.entries(kinds).map(([key,k])=>( ))}
{[['📞', isKo?'대표전화 · 평일 09:00–18:00':(lang==='ja'?'代表電話 · 平日 09:00–18:00':'Phone · Weekdays 09:00–18:00'),'031-212-3390'],['🚨', isKo?'주말·공휴일 긴급':(lang==='ja'?'休日・時間外 緊急':'After-hours emergency'),'010-3576-9186'],['📍', isKo?'주소':(lang==='ja'?'住所':'Address'),isKo?'경기 수원시 영통구 창룡대로256번길 91 에이스광교타워 2차 909호':(lang==='ja'?'京畿道水原市霊通区蒼龍大路256番ギル91 エースクァンギョタワー2次909号':'Ace Gwanggyo Tower II #909, Suwon')]].map(([icon,tag,text],i)=>(
{tag&&{tag}}{text}
))}
{sent?(
{isKo?'문의가 접수되었습니다. 빠르게 연락드리겠습니다.':(lang==='ja'?'お問い合わせを受け付けました。速やかにご連絡いたします。':'Your message has been sent. We\'ll get back to you shortly.')}
{isKo?`📮 ${kinds[kind].to} 담당자에게 전달되었습니다.`:(lang==='ja'?`📮 ${kinds[kind].to} 宛に送信されました。`:`📮 Routed to ${kinds[kind].to}.`)}
{ticket &&
{isKo?'문의번호':'Ticket'}: {ticket}
}
):( <>
{isKo?' 표시는 필수 입력 항목입니다.':(lang==='ja'?' は必須項目です。':' Required fields.')}
up('company',e.target.value)}/>
up('name',e.target.value)}/>
up('phone',e.target.value)}/>
up('email',e.target.value)}/>
{kind==='sales' && (
up('solutionText',e.target.value)}/>
)}
up('_agree',v)} onOpenPolicy={()=>setPage('privacy')} purpose={isKo?(kind==='tech'?'기술·장애 지원 문의의 접수·처리 및 결과 회신':'제품 도입 상담, 견적 요청, 보안 컨설팅 문의의 접수·처리 및 결과 회신'):undefined}/> {errs._submit && (
{errs._submit}
)} )}
); }; // ─── Footer ─────────────────────────────────────────────────────────────────── const Footer = ({ t, setPage, lang }) => { const isKo = lang === 'ko'; return ( ); }; // ─── Solution Hero Visual — 카테고리별 애니메이션 모티프 ──────────────────────── const SolHeroVisual = ({ solKey, color }) => { const c = color || '#06B6D4'; const motif = (()=>{ if (['email','spamout','checkout','mailinsight'].includes(solKey)) return 'email'; if (['network','nac','netwitness'].includes(solKey)) return 'network'; if (['data','dbsafer','arch5'].includes(solKey)) return 'data'; if (['privacy','catchsecu'].includes(solKey)) return 'privacy'; if (solKey==='ai') return 'ai'; if (['mdr'].includes(solKey)) return 'radar'; return 'shield'; // system, edr, eset, endpoint, solidstep 등 })(); const ring = ; const ring2 = ; const core = { email: , network: {[[105,95],[240,100],[95,205],[238,200],[170,72]].map(([x,y],i)=>())}, data: , privacy: {[112,130,148].map((y,i)=>())}, ai: AI{[[130,130],[130,170],[210,130],[210,170],[150,110],[190,110],[150,190],[190,190]].map(([x,y],i)=>{const dx=x===130?-26:x===210?26:0;const dy=y===110?-26:y===190?26:0;return ;})}, radar: , shield: , }[motif]; return ( ); }; // ─── Solution Detail Page ───────────────────────────────────────────────────── const SolutionDetailPage = ({ t, solKey, setPage, openQuote, openDemo, lang }) => { useScrollReveal(); const isKo = lang === 'ko'; const solData = { system:{ whys:[ {t:isKo?'랜섬웨어 급증':'Ransomware Surge',d:isKo?'2026년 기업 대상 랜섬웨어 공격이 전년 대비 280% 증가했습니다.':'Ransomware attacks on enterprises increased 280% YoY in 2026.'}, {t:isKo?'내부자 위협':'Insider Threats',d:isKo?'전체 보안 사고의 34%는 내부 직원의 실수나 악의적 행위로 발생합니다.':'34% of security incidents are caused by insider threats or errors.'}, {t:isKo?'규정 준수 강화':'Compliance Requirements',d:isKo?'개인정보보호법, ISMS-P 등 규정 미준수 시 막대한 과징금이 부과됩니다.':'Non-compliance with PIPA and ISMS-P results in heavy fines.'}, ], features:[ {icon:'🖥️',t:isKo?'엔드포인트 탐지·대응':'EDR',d:isKo?'AI 기반 이상 행위 탐지 및 격리':'AI-based anomaly detection and isolation'}, {icon:'🔐',t:isKo?'접근 제어':'Access Control',d:isKo?'최소 권한 원칙 기반 접근 정책':'Least privilege access policy management'}, {icon:'🔍',t:isKo?'취약점 분석':'Vulnerability Scan',d:isKo?'정기 스캔 및 패치 자동화':'Periodic scanning and patch automation'}, {icon:'📱',t:'MDM',d:isKo?'기업 모바일 기기 중앙 통제':'Centralized corporate device management'}, ], faqs:[ {q:isKo?'도입 기간은 얼마나 걸리나요?':'How long does deployment take?',a:isKo?'규모에 따라 다르지만, 일반적으로 2~4주 내에 구축 완료됩니다.':'Typically 2–4 weeks depending on scale.'}, {q:isKo?'기존 시스템과 호환되나요?':'Compatible with existing systems?',a:isKo?'대부분의 OS 및 인프라 환경과 호환됩니다. 사전 호환성 검토를 진행합니다.':'Compatible with most OS environments. Pre-deployment compatibility review is conducted.'}, {q:isKo?'클라우드 환경에도 적용 가능한가요?':'Does it work in cloud environments?',a:isKo?'AWS, Azure, GCP 등 주요 클라우드 환경을 모두 지원합니다.':'Supports AWS, Azure, GCP, and other major cloud platforms.'}, ], }, email:{ whys:[ {t:isKo?'이메일 = 최다 침투 경로':'Email = #1 Attack Vector',d:isKo?'전체 사이버 공격의 91%가 이메일로 시작됩니다.':'91% of all cyberattacks begin with email.'}, {t:isKo?'BEC 공격 피해 급증':'BEC Attack Losses Surge',d:isKo?'업무 이메일 침해(BEC)로 인한 피해액이 연간 수조 원에 달합니다.':'Business Email Compromise losses reach trillions of won annually.'}, {t:isKo?'정교해지는 피싱':'Sophisticated Phishing',d:isKo?'AI를 활용한 스피어 피싱으로 기존 필터를 우회하는 공격이 증가 중입니다.':'AI-powered spear phishing increasingly bypasses traditional filters.'}, ], features:[ {icon:'🛑',t:isKo?'APT/스피어피싱 차단':'APT/Spear Phishing Block',d:isKo?'AI 엔진으로 알려지지 않은 위협도 차단':'AI engine blocks unknown threats'}, {icon:'🔒',t:isKo?'이메일 암호화':'Email Encryption',d:isKo?'S/MIME, PGP 기반 전송 구간 암호화':'S/MIME and PGP based transport encryption'}, {icon:'📤',t:'DLP',d:isKo?'민감 정보 외부 전송 자동 차단':'Automatic blocking of sensitive data exfiltration'}, {icon:'✉️',t:isKo?'악성 첨부파일 분석':'Attachment Analysis',d:isKo?'샌드박스 기반 첨부파일 동적 분석':'Sandbox-based dynamic attachment analysis'}, ], faqs:[ {q:isKo?'기존 이메일 서버와 연동되나요?':'Integrates with existing mail servers?',a:isKo?'Exchange, Gmail, Office 365 등 대부분의 메일 서버와 연동됩니다.':'Integrates with Exchange, Gmail, Office 365, and most mail servers.'}, {q:isKo?'정상 메일이 차단되지 않나요?':'Will legitimate emails be blocked?',a:isKo?'머신러닝 기반 정밀 분류로 오탐률을 최소화합니다.':'ML-based precision classification minimizes false positives.'}, ], }, network:{ whys:[ {t:isKo?'내부망 침해 증가':'Internal Network Breaches Rise',d:isKo?'한번 침투한 공격자가 횡이동으로 전체 망을 장악하는 사례가 급증합니다.':'Once inside, attackers use lateral movement to compromise entire networks.'}, {t:isKo?'원격 근무 환경 확대':'Remote Work Expansion',d:isKo?'재택/하이브리드 근무 확대로 기업 네트워크 경계가 무너지고 있습니다.':'Remote/hybrid work has dissolved traditional network perimeters.'}, {t:isKo?'OT/IT 융합 위협':'OT/IT Convergence Threats',d:isKo?'제조업·의료 분야의 OT 시스템이 IT와 연결되며 새로운 공격 표면이 생겼습니다.':'OT systems connected to IT create new attack surfaces.'}, ], features:[ {icon:'🌐',t:'ZTNA',d:isKo?'Zero Trust 네트워크 접근 제어':'Zero Trust Network Access control'}, {icon:'🔎',t:'IDS/IPS',d:isKo?'실시간 침입 탐지 및 차단':'Real-time intrusion detection and prevention'}, {icon:'🏢',t:'NAC',d:isKo?'비인가 단말 접속 차단':'Block unauthorized device connections'}, {icon:'📊',t:isKo?'트래픽 분석':'Traffic Analysis',d:isKo?'AI 기반 이상 트래픽 탐지':'AI-based anomalous traffic detection'}, ], faqs:[ {q:isKo?'Zero Trust 도입이 어렵지 않나요?':'Isn\'t Zero Trust hard to implement?',a:isKo?'삼에스소프트는 단계별 Zero Trust 전환 로드맵을 제공합니다.':'3ES Soft provides a phased Zero Trust transition roadmap.'}, ], }, ai:{ whys:[ {t:isKo?'AI 위협 탐지 한계':'Rule-Based Detection Limits',d:isKo?'기존 규칙 기반 탐지는 알려지지 않은 신종 공격에 무력합니다.':'Traditional rule-based detection is powerless against novel attacks.'}, {t:isKo?'보안 인력 부족':'Security Talent Shortage',d:isKo?'국내 보안 전문 인력 부족 상황에서 AI 자동화가 필수입니다.':'With a shortage of security professionals, AI automation is essential.'}, {t:isKo?'위협 복잡도 증가':'Increasing Threat Complexity',d:isKo?'APT, AI 피싱, 제로데이 등 복잡한 위협에 AI만이 실시간 대응 가능합니다.':'Only AI can respond in real-time to APTs, AI phishing, and zero-days.'}, ], features:[ {icon:'🤖',t:isKo?'AI 이상 탐지':'AI Anomaly Detection',d:isKo?'행동 기반 ML로 미지의 위협 탐지':'Behavior-based ML detects unknown threats'}, {icon:'⚡',t:isKo?'자동 위협 대응':'Automated Response',d:isKo?'공격 탐지 즉시 자동 격리·차단':'Instant automatic isolation on detection'}, {icon:'📈',t:'AI SIEM',d:isKo?'모든 로그를 AI로 통합 분석':'AI-powered unified log analysis'}, {icon:'🔮',t:isKo?'위협 인텔리전스':'Threat Intelligence',d:isKo?'글로벌 위협 정보 실시간 연동':'Real-time global threat intelligence'}, ], faqs:[ {q:isKo?'AI 보안은 오탐이 많지 않나요?':'Does AI security have high false positives?',a:isKo?'지속 학습으로 오탐률을 5% 이하로 유지합니다.':'Continuous learning keeps false positives below 5%.'}, {q:isKo?'데이터 학습에 우리 데이터가 사용되나요?':'Is our data used for AI training?',a:isKo?'고객 데이터는 외부 학습에 절대 사용하지 않습니다. 온프레미스 배포로 데이터 주권을 보장합니다.':'Customer data is never used for external training. On-premise deployment guarantees data sovereignty.'}, ], }, privacy:{ whys:[ {t:isKo?'국외 데이터 이전 위험':'Cross-Border Data Risk',d:isKo?'구글폼 데이터는 해외 서버에 저장됩니다. 개인정보보호법 위반 시 매출의 3% 과징금.':'Google Forms store data on overseas servers. PIPA violations result in fines up to 3% of revenue.'}, {t:isKo?'동의서 미비':'Insufficient Consent Docs',d:isKo?'수기 동의서·엑셀 관리는 법적 효력이 불충분합니다. 감사 시 즉각 문제가 됩니다.':'Handwritten consent forms and Excel management lack legal validity.'}, {t:isKo?'파기 의무 이행 불가':'Cannot Execute Data Disposal',d:isKo?'보유기간 초과 후 수동 파기는 사실상 불가능합니다. 미파기 시 과태료 3,000만원.':'Manual disposal after retention periods is practically impossible. Non-disposal fines reach ₩30M.'}, ], features:[ {icon:'📝',t:isKo?'동의서 자동 생성':'Auto Consent Forms',d:isKo?'법적 요건을 충족하는 동의서를 클릭 몇 번으로 즉시 생성':'Generate legally compliant consent forms in a few clicks'}, {icon:'🔐',t:isKo?'AES-256 암호화':'AES-256 Encryption',d:isKo?'모든 개인정보를 국내 서버에 암호화 저장':'All personal data encrypted and stored on domestic servers'}, {icon:'⏰',t:isKo?'보유기간 자동 파기':'Auto Data Disposal',d:isKo?'보유기간 도래 시 자동 파기 및 이력 보관':'Automatic disposal and archival when retention period ends'}, {icon:'📊',t:isKo?'실시간 모니터링':'Real-time Monitoring',d:isKo?'수집 현황·파기 예정·동의 이력 대시보드':'Dashboard for collection status, disposal schedule, and consent history'}, ], faqs:[ {q:isKo?'구글폼 데이터 마이그레이션이 가능한가요?':'Can existing Google Forms data be migrated?',a:isKo?'네, 기존 구글폼·네이버폼 데이터를 안전하게 이관해드립니다.':'Yes, we safely migrate your existing Google Forms and Naver Forms data.'}, {q:isKo?'공공기관도 도입 가능한가요?':'Is it available for public institutions?',a:isKo?'네, 행안부 개인정보보호 지침 완전 준수. 공공기관 납품 실적 보유.':'Yes, full MOIS compliance with proven public institution track record.'}, {q:isKo?'법령 개정 시 자동 대응되나요?':'Does it auto-update for regulation changes?',a:isKo?'네, 개인정보보호법 개정 시 자동 업데이트됩니다.':'Yes, it automatically updates when PIPA is amended.'}, ], }, edr:{ whys:[ {t:isKo?'엔드포인트가 최전선':'Endpoints Are the Front Line',d:isKo?'랜섬웨어·악성코드 공격의 대부분은 사용자 PC와 서버 등 엔드포인트에서 시작됩니다.':'Most ransomware and malware attacks begin at endpoints such as user PCs and servers.'}, {t:isKo?'알려지지 않은 위협':'Unknown Threats',d:isKo?'백신만으로는 탐지되지 않는 신종·변종 위협에 대한 행위 기반 탐지가 필요합니다.':'Behavior-based detection is needed for novel and variant threats that antivirus alone misses.'}, {t:isKo?'사고 대응 가시성 부족':'Limited Incident Visibility',d:isKo?'침해 발생 시 경로 추적과 원인 분석이 어려워 확산을 막기 어렵습니다.':'Without trace and root-cause visibility, containing a breach is difficult.'}, ], features:[ {icon:'🖥️',t:isKo?'엔드포인트 위협 탐지':'Endpoint Detection',d:isKo?'프로세스·파일·네트워크 행위를 실시간 모니터링합니다.':'Real-time monitoring of process, file, and network behavior.'}, {icon:'⚡',t:isKo?'자동 대응':'Automated Response',d:isKo?'위협 탐지 시 격리·차단·롤백을 수행합니다.':'Isolate, block, and roll back on detection.'}, {icon:'🔍',t:isKo?'사고 추적':'Incident Tracing',d:isKo?'공격 경로와 영향 범위를 타임라인으로 분석합니다.':'Analyze attack paths and impact on a timeline.'}, {icon:'📊',t:isKo?'위협 인텔리전스':'Threat Intelligence',d:isKo?'위협 정보 연동으로 탐지 정확도를 높입니다.':'Improves detection accuracy via threat intelligence.'}, ], faqs:[ {q:isKo?'기존 백신과 함께 사용할 수 있나요?':'Can it run alongside existing antivirus?',a:isKo?'네, 백신과 병행하여 행위 기반 탐지·대응 레이어로 동작합니다.':'Yes, it operates as a behavior-based detection layer alongside antivirus.'}, {q:isKo?'도입 후 운영 지원은 어떻게 되나요?':'What about post-deployment support?',a:isKo?'제조사와 삼에스소프트가 협력하여 정책 설계·운영·사고 대응을 지속 지원합니다.':'The manufacturer and 3ES Soft collaborate on policy design, operations, and incident response.'}, ], }, mdr:{ whys:[ {t:isKo?'보안 인력 부족':'Security Staffing Gap',d:isKo?'24/7 위협 모니터링과 대응을 자체 인력만으로 운영하기 어렵습니다.':'Running 24/7 threat monitoring and response with in-house staff alone is hard.'}, {t:isKo?'탐지만으로는 부족':'Detection Alone Isn\'t Enough',d:isKo?'경보가 쌓여도 분석·대응이 늦으면 피해로 이어집니다.':'Alerts pile up; slow analysis and response lead to damage.'}, {t:isKo?'전문 분석 필요':'Expert Analysis Needed',d:isKo?'정탐·오탐 판별과 대응 판단에는 전문 분석 역량이 필요합니다.':'Distinguishing true/false positives and deciding response requires expertise.'}, ], features:[ {icon:'🛰️',t:isKo?'24/7 보안 관제':'24/7 Monitoring',d:isKo?'전문 분석가가 상시 위협을 모니터링합니다.':'Analysts monitor threats around the clock.'}, {icon:'🧭',t:isKo?'위협 헌팅':'Threat Hunting',d:isKo?'잠재 위협을 선제적으로 탐색합니다.':'Proactively hunts for latent threats.'}, {icon:'🚨',t:isKo?'사고 대응':'Incident Response',d:isKo?'탐지부터 대응·복구까지 전 과정을 지원합니다.':'Supports the full detect–respond–recover cycle.'}, {icon:'📑',t:isKo?'정기 리포트':'Regular Reporting',d:isKo?'보안 현황과 개선 권고를 정기 보고합니다.':'Periodic reports on posture and recommendations.'}, ], faqs:[ {q:isKo?'자체 보안팀이 없어도 되나요?':'Do we need our own security team?',a:isKo?'네, 전문 관제팀이 모니터링·대응을 대행하므로 소규모 조직도 운영할 수 있습니다.':'No — a managed team handles monitoring and response, suitable even for small teams.'}, {q:isKo?'EDR과 함께 운영할 수 있나요?':'Can it run with EDR?',a:isKo?'네, EDR 등 보안 솔루션과 연계해 관제 효과를 높입니다.':'Yes, it integrates with EDR and other tools to strengthen managed detection.'}, ], }, }; const sol = t.solutions.items.find(s=>s.key===solKey); const data = solData[solKey]; const [openFaq, setOpenFaq] = React.useState(null); if (!sol||!data) return null; return (
setPage('home')}> {isKo?'홈으로':'Back to Home'}
{solIcons[solKey]} {sol.eng}

{sol.title}

{sol.desc}

{/* 왜 필요한가 */}

{isKo?'이 솔루션이 필요한 이유':'Why This Solution'}

{data.whys.map((w,i)=>(
0{i+1}
{w.t}
{w.d}
))}
{/* 가격 가이드 */}

{isKo?'가격 가이드':'Pricing Guide'}

💰 {isKo?`${sol.title} 가격 범위`:`${sol.title} Price Range`}
SaaS
{sol.price.saas}
{sol.price.per} · {isKo?'클라우드 호스팅':'Cloud hosted'}
{isKo?'온프레미스':'On-Premise'}
{sol.price.onprem}
{sol.price.per} · {isKo?'자체 서버 구축':'Self-hosted'}
🎯 {sol.price.saving}

{isKo?'주요 기능':'Key Features'}

{data.features.map((f,i)=>(
{f.t}
{f.d}
))}
{/* FAQ */}

FAQ

{data.faqs.map((f,i)=>(
setOpenFaq(openFaq===i?null:i)}> {f.q} {openFaq===i?'▲':'▼'}
{openFaq===i&&
{f.a}
}
))}
{/* 도입 시나리오 (해당 솔루션) */} {/* 조달 등재 정보 */} {window.hasG2B && window.hasG2B(solKey) && (
)}
{isKo?'도입 문의':'Get Started'}

{isKo?`${sol.title} 도입을 검토 중이신가요?`:`Considering ${sol.title}?`}

{isKo?'보안 전문가가 무료로 환경을 분석하고 최적의 솔루션을 제안합니다.':'Our security experts will analyze your environment and propose the optimal solution for free.'}

); }; const AdminPage = ({ t, lang, setPage }) => { const [tab, setTab] = React.useState('dashboard'); const isKo = lang === 'ko'; // ⚠️ 비밀번호를 프론트에 두지 않습니다. 서버 인증(세션) 도입 전까지 화면 자체를 차단합니다. const adminEnabled = !!(window.SITE_CONFIG && window.SITE_CONFIG.SHOW_ADMIN); const [authed, setAuthed] = React.useState(false); const [pw, setPw] = React.useState(''); const [pwErr, setPwErr] = React.useState(false); const [inquiries, setInquiries] = React.useState(() => LS.get('3es_inquiries', [ {id:1,company:'삼성전자',name:'김민수',date:'2026.05.04',type:'이메일 보안',status:'new',message:'이메일 보안 솔루션 도입 검토 중입니다.'}, {id:2,company:'LG화학',name:'이지현',date:'2026.05.03',type:'시스템 보안',status:'pending',message:'EDR 솔루션 견적 요청드립니다.'}, {id:3,company:'현대모비스',name:'박준혁',date:'2026.05.02',type:'AI 보안',status:'done',message:'AI SIEM 구축 문의드립니다.'}, ])); const [newsItems, setNewsItems] = React.useState(() => LS.get('3es_news', [])); const [newNews, setNewNews] = React.useState({title:'',cat:'보안 뉴스',desc:''}); const [newSol, setNewSol] = React.useState({title:'',desc:'',tags:''}); const [solutions, setSolutions] = React.useState(() => LS.get('3es_solutions', [])); const [uploadResult, setUploadResult] = React.useState(''); const [uploading, setUploading] = React.useState(false); const [draft, setDraft] = React.useState(null); const [imgPrompt, setImgPrompt] = React.useState(''); const [genPages, setGenPages] = React.useState(() => LS.get('3es_gen_pages', [])); const fileInputRef = React.useRef(null); const statusMap = { ai: {label:isKo?'AI 상담':'AI chat', cls:'ai'}, new: {label:isKo?'상담 접수':'Received', cls:'new'}, kakao: {label:isKo?'카카오톡 전환':'KakaoTalk',cls:'kakao'}, pending: {label:isKo?'담당자 확인':'In review', cls:'pending'}, done: {label:isKo?'상담 완료':'Closed', cls:'done'}, }; const updateStatus = (id, status) => { const updated = inquiries.map(q => q.id===id ? {...q,status} : q); setInquiries(updated); LS.set('3es_inquiries', updated); }; const addNews = () => { if (!newNews.title) return; const item = {...newNews, id:Date.now(), date:new Date().toLocaleDateString('ko-KR').replace(/\. /g,'.').replace('.',''), hot:false}; const updated = [item, ...newsItems]; setNewsItems(updated); LS.set('3es_news', updated); setNewNews({title:'',cat:'보안 뉴스',desc:''}); }; const deleteNews = (id) => { const updated = newsItems.filter(n=>n.id!==id); setNewsItems(updated); LS.set('3es_news', updated); }; const addSolution = () => { if (!newSol.title) return; const item = {...newSol, id:Date.now(), tags:newSol.tags.split(',').map(t=>t.trim())}; const updated = [item, ...solutions]; setSolutions(updated); LS.set('3es_solutions', updated); setNewSol({title:'',desc:'',tags:''}); }; const handleFileUpload = async (e) => { const file = e.target.files[0]; if (!file) return; setUploading(true); setUploadResult(''); setDraft(null); try { const raw = await window.claude.complete({ messages:[{role:'user', content:`제안서 파일명: "${file.name}"\n\n이 파일명과 보안 업계 맥락을 근거로, B2B 보안 솔루션 상세 페이지 초안을 JSON으로만 출력하세요. 설명 문장이나 코드펜스 없이 순수 JSON만 반환합니다.\n\n{\n "product":"제품명",\n "tagline":"한 줄 정의(20자 내외)",\n "category":"email|system|network|endpoint|data|privacy|ai 중 하나",\n "accent":"#RRGGBB",\n "summary":["3줄 요약1","2","3"],\n "problems":[{"t":"문제 제목","d":"설명 1~2문장"}],\n "features":[{"t":"기능명","d":"설명 1문장"}],\n "benefits":[{"t":"효과 제목","d":"설명 1문장"}],\n "faqs":[{"q":"질문","a":"답변"}],\n "imagePrompt":"제품 히어로 비주얼용 이미지 생성 프롬프트(영문)"\n}\n\n규칙: problems 3개, features 4~6개, benefits 3~4개, faqs 4개. 과장 표현("100% 차단","완전 방어") 금지. 근거 없는 수치·인증번호 금지. 한국어로 작성.`}] }); let json = null; try { json = JSON.parse(raw.replace(/^[\s\S]*?\{/, '{').replace(/\}[^}]*$/, '}')); } catch {} if (json && json.product) { setDraft({ ...json, file:file.name, id:Date.now() }); setImgPrompt(json.imagePrompt || ''); } const reply = (json && json.product) ? '' : await window.claude.complete({ messages:[{role:'user', content:`You are a security product documentation expert. The user uploaded a file named "${file.name}". Based on the filename and context, generate a professional product description for a B2B IT security company website. Include: 1) Product overview (2-3 sentences), 2) Key features (4 bullet points), 3) Target audience, 4) Expected benefits. Keep it concise and professional. Respond in Korean if the filename looks Korean, otherwise in English.`}] }); setUploadResult(reply); } catch { setUploadResult(isKo?'AI 요약 생성 실패. 다시 시도해 주세요.':'AI summary generation failed. Please try again.'); } setUploading(false); }; const publishDraft = () => { if (!draft) return; const page = { ...draft, imagePrompt:imgPrompt, createdAt:new Date().toISOString(), status:'draft' }; const updated = [page, ...genPages]; setGenPages(updated); LS.set('3es_gen_pages', updated); const sol = { id:page.id, title:page.product, desc:page.tagline, tags:(page.features||[]).slice(0,3).map(f=>f.t), color:page.accent, category:page.category, generated:true }; const su = [sol, ...solutions]; setSolutions(su); LS.set('3es_solutions', su); setDraft(null); setUploadResult(''); setImgPrompt(''); setTab('pages'); }; const removePage = (id) => { const u = genPages.filter(x=>x.id!==id); setGenPages(u); LS.set('3es_gen_pages', u); const s = solutions.filter(x=>x.id!==id); setSolutions(s); LS.set('3es_solutions', s); }; const navItems = [ {key:'dashboard',label:isKo?'대시보드':'Dashboard',icon:'📊'}, {key:'inquiries',label:isKo?'문의 관리':'Inquiries',icon:'📬'}, {key:'solutions',label:isKo?'솔루션 관리':'Solutions',icon:'🛡️'}, {key:'news',label:isKo?'뉴스 관리':'News',icon:'📰'}, {key:'upload',label:isKo?'파일 업로드':'File Upload',icon:'📎'}, {key:'pages',label:isKo?'생성 페이지':'Generated Pages',icon:'✨'}, {key:'settings',label:isKo?'알림 설정':'Notifications',icon:'⚙️'}, ]; if (!adminEnabled) { return (
{isKo?'관리자 화면은 현재 사용할 수 없습니다':'The admin console is currently unavailable'}

{isKo?'서버 인증 적용 전까지 접근이 차단되어 있습니다. 문의 내역은 담당자 메일로 전달됩니다.' :'Access is disabled until server-side authentication is in place. Inquiries are delivered by email.'}

); } if (!authed) { const tryLogin = () => { setPwErr(true); }; return (
🔐

관리자 로그인

3ES Soft 관리자 전용 페이지입니다.

{setPw(e.target.value);setPwErr(false);}} onKeyDown={e=>e.key==='Enter'&&tryLogin()} placeholder="관리자 비밀번호" style={{width:'100%',padding:'12px 14px',background:'#F8FAFC',border:`1px solid ${pwErr?'#EF4444':'#E2E8F0'}`,borderRadius:8,fontSize:14,fontFamily:'inherit',outline:'none',color:'#1E293B',marginBottom:pwErr?6:16}}/> {pwErr &&
비밀번호가 올바르지 않습니다.
}
); } return (
ADMIN
{navItems.map(item=>(
setTab(item.key)}> {item.label}
))}
setPage('home')} style={{fontSize:13}}> ←{isKo?'사이트로 이동':'Back to Site'}
{navItems.find(n=>n.key===tab)?.label}
{new Date().toLocaleDateString(isKo?'ko-KR':'en-US')}
A
{/* DASHBOARD */} {tab==='dashboard'&&( <>
{[ {num:inquiries.length,label:isKo?'총 문의':'Total Inquiries',change:'+12%'}, {num:inquiries.filter(q=>['ai','new','kakao'].includes(q.status)).length,label:isKo?'미처리 문의':'Open inquiries',change:'↑'}, {num:solutions.length+4,label:isKo?'등록 솔루션':'Solutions',change:'+1'}, {num:newsItems.length+6,label:isKo?'뉴스 기사':'News Articles',change:'+3'}, ].map((s,i)=>(
{s.num}
{s.label}
{s.change}
))}

{isKo?'최근 문의':'Recent Inquiries'}

{inquiries.slice(0,5).map(r=>( ))}
#{isKo?'회사':'Company'}{isKo?'담당자':'Contact'}{isKo?'유형':'Type'}{isKo?'날짜':'Date'}{isKo?'상태':'Status'}
{r.id}{r.company}{r.name}{r.type}{r.date} {statusMap[r.status]?.label}
)} {/* INQUIRIES */} {tab==='inquiries'&&( <>

{isKo?'전체 문의 목록':'All Inquiries'}

{inquiries.map(r=>( ))}
#{isKo?'회사':'Company'}{isKo?'담당자':'Contact'}{isKo?'유형':'Type'}{isKo?'문의 내용':'Message'}{isKo?'상태':'Status'}{isKo?'처리':'Action'}
{r.id} {r.company} {r.name} {r.type} {r.message} {statusMap[r.status]?.label}
)} {/* SOLUTIONS */} {tab==='solutions'&&( <>
➕ {isKo?'새 솔루션 등록':'Add New Solution'}
setNewSol({...newSol,title:e.target.value})} placeholder={isKo?'예: 클라우드 보안':'e.g. Cloud Security'}/>
setNewSol({...newSol,tags:e.target.value})} placeholder="WAF, DDoS, CDN"/>
{solutions.length>0&&( {solutions.map(s=>( ))}
ID{isKo?'이름':'Name'}{isKo?'설명':'Description'}{isKo?'태그':'Tags'}
{s.id} {s.title} {s.desc} {Array.isArray(s.tags)?s.tags.join(', '):s.tags}
)} )} {/* NEWS */} {tab==='news'&&( <>
✏️ {isKo?'새 뉴스 작성':'Write New Article'}
setNewNews({...newNews,title:e.target.value})} placeholder={isKo?'뉴스 제목':'Article title'}/>
{newsItems.length>0&&( {newsItems.map(n=>( ))}
{isKo?'제목':'Title'}{isKo?'카테고리':'Category'}{isKo?'날짜':'Date'}{isKo?'삭제':'Delete'}
{n.title} {n.cat} {n.date}
)} )} {/* FILE UPLOAD */} {tab==='upload'&&(
📎 {isKo?'PPT/PDF 업로드 → AI 자동 요약':'PPT/PDF Upload → AI Auto Summary'}
fileInputRef.current?.click()}>
📁
{isKo?'PDF, PPT, DOCX 파일을 클릭하여 업로드':'Click to upload PDF, PPT, or DOCX'}
Max 10MB
{uploading&&(
⏳
{isKo?'AI가 문서를 분석하고 있습니다...':'AI is analyzing the document...'}
)} {draft&&(
✨
{draft.product}
{draft.tagline} · {draft.category}
{isKo?'초안':'DRAFT'}
{[[isKo?'3줄 요약':'Summary',draft.summary],[isKo?'문제':'Problems',(draft.problems||[]).map(x=>x.t)],[isKo?'기능':'Features',(draft.features||[]).map(x=>x.t)],[isKo?'효과':'Benefits',(draft.benefits||[]).map(x=>x.t)]].map(([label,list],i)=>(
{label} · {(list||[]).length}
{(list||[]).map((x,xi)=>(
·{x}
))}
))}