[{"data":1,"prerenderedAt":3463},["ShallowReactive",2],{"doc:\u002Fmembership":3},{"id":4,"title":5,"body":6,"description":3390,"extension":3456,"meta":3457,"navigation":3458,"path":3459,"seo":3460,"stem":3461,"__hash__":3462},"docs\u002FMEMBERSHIP.md","회원·인증 통합 인덱스",{"type":7,"value":8,"toc":3389},"minimark",[9,13,60,63,73,81,236,244,487,497,501,622,626,771,775,819,821,825,830,838,935,942,946,1032,1036,1066,1069,1085,1089,1094,1100,1130,1137,1163,1165,1173,1262,1272,1274,1281,1288,1566,1573,1660,1666,1672,1735,1738,1742,1769,1777,1862,1869,1873,1904,1911,1956,1958,1962,1966,2099,2103,2134,2138,2170,2173,2177,2243,2250,2254,2298,2300,2304,2318,2324,2338,2342,2361,2365,2438,2453,2457,2467,2471,2477,2481,2487,2491,2538,2549,2553,2603,2610,2614,2625,2627,2631,2787,2789,2793,3154,3156,3160,3164,3220,3224,3270,3274,3320,3324,3348,3352],[10,11,5],"h1",{"id":12},"회원인증-통합-인덱스",[14,15,16,54],"blockquote",{},[17,18,19,23,24,27,28,33,34,38,39,43,44,48,49,53],"p",{},[20,21,22],"strong",{},"목적",": 회원가입·로그인·계정관리·인증·승인 게이트의 ",[20,25,26],{},"모든 페이지·API·DB 테이블·정책","을 한 곳에서 조망.\n가입 절차 단계별 상세는 ",[29,30,32],"a",{"href":31},".\u002Fpages\u002FSIGNUP",".\u002Fpages\u002FSIGNUP.md",", 계약 관리 페이지는 ",[29,35,37],{"href":36},".\u002Fpages\u002FCONTRACT",".\u002Fpages\u002FCONTRACT.md",",\nNICE 본인확인 인프라는 ",[29,40,42],{"href":41},".\u002FNICE_AUTH",".\u002FNICE_AUTH.md",", 일자별 작업 이력은\n",[29,45,47],{"href":46},".\u002Fhistory\u002Fhistory.20260601",".\u002Fhistory\u002Fhistory.20260601.md"," §4·§5 \u002F ",[29,50,52],{"href":51},".\u002Fhistory\u002Fhistory.20260602",".\u002Fhistory\u002Fhistory.20260602.md"," §4~§16 참조.",[17,55,56,59],{},[20,57,58],{},"마지막 현행화",": 2026-06-02 (§11~§16 반영 — 계약·서류 R2 라우트, reviewing 상태 추가, 계약 서명 본인인증, NICE\u002FNHN 운영 상태)",[61,62],"hr",{},[64,65,67,68,72],"h2",{"id":66},"_1-사용자단-페이지-malgn-noti","1. 사용자단 페이지 (",[69,70,71],"code",{},"malgn-noti",")",[74,75,77,78,72],"h3",{"id":76},"_11-가입로그인재설정-인증-게이트-metaauth-false","1.1 가입·로그인·재설정 (인증 게이트 — ",[69,79,80],{},"meta.auth: false",[82,83,84,102],"table",{},[85,86,87],"thead",{},[88,89,90,94,97,99],"tr",{},[91,92,93],"th",{},"라우트",[91,95,96],{},"파일",[91,98,22],{},[91,100,101],{},"백엔드 연동",[103,104,105,135,156,175,194,213],"tbody",{},[88,106,107,113,119,122],{},[108,109,110],"td",{},[69,111,112],{},"\u002Fsignup",[108,114,115],{},[29,116,118],{"href":117},"..\u002Fapp\u002Fpages\u002Fsignup.vue","signup.vue",[108,120,121],{},"5단계 마법사. Step 3 이메일 OTP · Step 4 NICE 본인확인 · Step 5 가입 + 자동 로그인 + 유형 분기",[108,123,124,125,128,129,128,132],{},"✅ ",[69,126,127],{},"\u002Fauth\u002Femail-code\u002F*"," · ",[69,130,131],{},"\u002Fauth\u002Fnice\u002F*",[69,133,134],{},"\u002Fauth\u002Fsignup",[88,136,137,142,148,151],{},[108,138,139],{},[69,140,141],{},"\u002Flogin",[108,143,144],{},[29,145,147],{"href":146},"..\u002Fapp\u002Fpages\u002Flogin\u002Findex.vue","login\u002Findex.vue",[108,149,150],{},"이메일\u002F아이디 + 비밀번호 (회사 자동 매칭)",[108,152,124,153],{},[69,154,155],{},"POST \u002Fauth\u002Flogin-by-email",[88,157,158,163,169,172],{},[108,159,160],{},[69,161,162],{},"\u002Flogin\u002Fsecurity",[108,164,165],{},[29,166,168],{"href":167},"..\u002Fapp\u002Fpages\u002Flogin\u002Fsecurity.vue","login\u002Fsecurity.vue",[108,170,171],{},"보안로그인 추가 인증(OTP\u002F이메일)",[108,173,174],{},"⚪ 백엔드 미구현",[88,176,177,182,188,191],{},[108,178,179],{},[69,180,181],{},"\u002Freset-password",[108,183,184],{},[29,185,187],{"href":186},"..\u002Fapp\u002Fpages\u002Freset-password\u002Findex.vue","reset-password\u002Findex.vue",[108,189,190],{},"비밀번호 재설정 요청",[108,192,193],{},"⚪ OTP 인프라 재활용 가능",[88,195,196,201,207,210],{},[108,197,198],{},[69,199,200],{},"\u002Freset-password\u002Fnew",[108,202,203],{},[29,204,206],{"href":205},"..\u002Fapp\u002Fpages\u002Freset-password\u002Fnew.vue","reset-password\u002Fnew.vue",[108,208,209],{},"새 비밀번호 입력",[108,211,212],{},"⚪",[88,214,215,220,226,229],{},[108,216,217],{},[69,218,219],{},"\u002Finvite",[108,221,222],{},[29,223,225],{"href":224},"..\u002Fapp\u002Fpages\u002Finvite.vue","invite.vue",[108,227,228],{},"초대 메일 링크 → 멀티계정 등록",[108,230,231,232,235],{},"⚪ ",[69,233,234],{},"TB_MANAGER_INVITE"," 라우트 미구현",[74,237,239,240,243],{"id":238},"_12-계정-관리-account-인증-필요","1.2 계정 관리 (",[69,241,242],{},"\u002Faccount\u002F*",", 인증 필요)",[82,245,246,258],{},[85,247,248],{},[88,249,250,252,254,256],{},[91,251,93],{},[91,253,96],{},[91,255,22],{},[91,257,101],{},[103,259,260,288,317,339,360,381,403,421,442,466],{},[88,261,262,267,273,276],{},[108,263,264],{},[69,265,266],{},"\u002Faccount\u002Fsettings",[108,268,269],{},[29,270,272],{"href":271},"..\u002Fapp\u002Fpages\u002Faccount\u002Fsettings.vue","settings.vue",[108,274,275],{},"회원 정보 변경 (이름·휴대폰·회사 전화·결제 이메일·광고 수신)",[108,277,124,278,128,281,128,284,287],{},[69,279,280],{},"GET \u002Fme",[69,282,283],{},"PATCH \u002Fme",[69,285,286],{},"PATCH \u002Fme\u002Fcompany",". 이메일·휴대폰 변경 다이얼로그는 OTP 미연결(후속)",[88,289,290,295,301,311],{},[108,291,292],{},[69,293,294],{},"\u002Faccount\u002Fcontract",[108,296,297],{},[29,298,300],{"href":299},"..\u002Fapp\u002Fpages\u002Faccount\u002Fcontract.vue","contract.vue",[108,302,303,304,307,308],{},"계약서·전자서명·",[20,305,306],{},"사업자등록증 제출\u002F재제출"," (미승인 사용자 메인 진입점). 상세는 ",[29,309,310],{"href":36},"pages\u002FCONTRACT.md",[108,312,124,313,316],{},[69,314,315],{},"\u002Fcontracts\u002F*"," 5 라우트 + R2 업로드 + 휴대폰 본인인증 서명 — 운영자 승인 화면만 미구현",[88,318,319,324,330,333],{},[108,320,321],{},[69,322,323],{},"\u002Faccount\u002Fpassword",[108,325,326],{},[29,327,329],{"href":328},"..\u002Fapp\u002Fpages\u002Faccount\u002Fpassword.vue","password.vue",[108,331,332],{},"비밀번호 변경",[108,334,231,335,338],{},[69,336,337],{},"POST \u002Fauth\u002Fpassword"," 미구현",[88,340,341,346,352,355],{},[108,342,343],{},[69,344,345],{},"\u002Faccount\u002Fsecurity",[108,347,348],{},[29,349,351],{"href":350},"..\u002Fapp\u002Fpages\u002Faccount\u002Fsecurity.vue","security.vue",[108,353,354],{},"보안로그인 토글 (2FA: OTP\u002F이메일)",[108,356,231,357,338],{},[69,358,359],{},"PATCH \u002Fme\u002Fsecurity",[88,361,362,367,373,376],{},[108,363,364],{},[69,365,366],{},"\u002Faccount\u002Fmulti",[108,368,369],{},[29,370,372],{"href":371},"..\u002Fapp\u002Fpages\u002Faccount\u002Fmulti.vue","multi.vue",[108,374,375],{},"서비스 담당자 초대 (사업자만)",[108,377,231,378,338],{},[69,379,380],{},"\u002Fmanager-invites",[88,382,383,388,394,397],{},[108,384,385],{},[69,386,387],{},"\u002Faccount\u002Fcards",[108,389,390],{},[29,391,393],{"href":392},"..\u002Fapp\u002Fpages\u002Faccount\u002Fcards.vue","cards.vue",[108,395,396],{},"결제 카드 관리",[108,398,231,399,402],{},[69,400,401],{},"\u002Fpayment-methods"," 부분",[88,404,405,410,416,419],{},[108,406,407],{},[69,408,409],{},"\u002Faccount\u002Fbilling",[108,411,412],{},[29,413,415],{"href":414},"..\u002Fapp\u002Fpages\u002Faccount\u002Fbilling.vue","billing.vue",[108,417,418],{},"결제 이력",[108,420,212],{},[88,422,423,428,434,437],{},[108,424,425],{},[69,426,427],{},"\u002Faccount\u002Fcredit",[108,429,430],{},[29,431,433],{"href":432},"..\u002Fapp\u002Fpages\u002Faccount\u002Fcredit.vue","credit.vue",[108,435,436],{},"크레딧 내역·영수증",[108,438,231,439,402],{},[69,440,441],{},"\u002Fcredit-ledger",[88,443,444,452,458,461],{},[108,445,446,128,449],{},[69,447,448],{},"\u002Faccount\u002Finquiries",[69,450,451],{},"\u002Fdetail",[108,453,454],{},[29,455,457],{"href":456},"..\u002Fapp\u002Fpages\u002Faccount\u002Finquiries\u002F","inquiries\u002F",[108,459,460],{},"나의 문의 목록·상세",[108,462,231,463,402],{},[69,464,465],{},"\u002Finquiries",[88,467,468,476,482,485],{},[108,469,470,128,473],{},[69,471,472],{},"\u002Faccount\u002Finquiry",[69,474,475],{},"\u002Fcomplete",[108,477,478],{},[29,479,481],{"href":480},"..\u002Fapp\u002Fpages\u002Faccount\u002Finquiry\u002F","inquiry\u002F",[108,483,484],{},"문의 작성·완료",[108,486,212],{},[17,488,489,490,496],{},"공통 셸: ",[29,491,493],{"href":492},"..\u002Fapp\u002Fcomponents\u002FAppMyPageShell.vue",[69,494,495],{},"AppMyPageShell"," — 좌측 메뉴 + 본문 슬롯.",[74,498,500],{"id":499},"_13-회원인증-관련-공용-컴포넌트","1.3 회원·인증 관련 공용 컴포넌트",[82,502,503,513],{},[85,504,505],{},[88,506,507,510],{},[91,508,509],{},"컴포넌트",[91,511,512],{},"용도",[103,514,515,529,540,551,562,573,588,599],{},[88,516,517,523],{},[108,518,519],{},[29,520,522],{"href":521},"..\u002Fapp\u002Fcomponents\u002FAppApprovalBanner.vue","AppApprovalBanner",[108,524,525,528],{},[20,526,527],{},"사업자등록증 심사 상태 글로벌 띠"," — layout 최상단, pending\u002Freviewing=warning · rejected=danger+사유. CTA(pending=\"등록\"·reviewing=\"진행 상태 보기\"·rejected=\"다시 제출하기\")",[88,530,531,537],{},[108,532,533],{},[29,534,536],{"href":535},"..\u002Fapp\u002Fcomponents\u002FAppSignupTermsDialog.vue","AppSignupTermsDialog",[108,538,539],{},"약관 동의 모달",[88,541,542,548],{},[108,543,544],{},[29,545,547],{"href":546},"..\u002Fapp\u002Fcomponents\u002FAppMemberInfoPanel.vue","AppMemberInfoPanel",[108,549,550],{},"회원 정보 표시·편집 패널 — 승인 배너 + isLocked 입력 disabled",[88,552,553,559],{},[108,554,555],{},[29,556,558],{"href":557},"..\u002Fapp\u002Fcomponents\u002FAppEmailChangeDialog.vue","AppEmailChangeDialog",[108,560,561],{},"이메일 변경 + OTP (실 API 미연결)",[88,563,564,570],{},[108,565,566],{},[29,567,569],{"href":568},"..\u002Fapp\u002Fcomponents\u002FAppPhoneVerifyDialog.vue","AppPhoneVerifyDialog",[108,571,572],{},"휴대폰 본인 인증 (실 API 미연결)",[88,574,575,585],{},[108,576,577,128,581],{},[29,578,580],{"href":579},"..\u002Fapp\u002Fcomponents\u002FAppCardListPanel.vue","AppCardListPanel",[29,582,584],{"href":583},"..\u002Fapp\u002Fcomponents\u002FAppCardAddDialog.vue","AppCardAddDialog",[108,586,587],{},"결제 카드",[88,589,590,596],{},[108,591,592],{},[29,593,595],{"href":594},"..\u002Fapp\u002Fcomponents\u002FAppManagerInviteDialog.vue","AppManagerInviteDialog",[108,597,598],{},"서비스 담당자 초대",[88,600,601,615],{},[108,602,603,128,607,128,611],{},[29,604,606],{"href":605},"..\u002Fapp\u002Fcomponents\u002FAppContractPanel.vue","AppContractPanel",[29,608,610],{"href":609},"..\u002Fapp\u002Fcomponents\u002FAppContractSignDialog.vue","AppContractSignDialog",[29,612,614],{"href":613},"..\u002Fapp\u002Fcomponents\u002FAppContractViewDialog.vue","AppContractViewDialog",[108,616,617,618,621],{},"계약 관리 — 사업자등록증 제출 + 전자서명. ",[20,619,620],{},"실 API 연동 완료"," (§11~§15). 서명 다이얼로그에 휴대폰 본인인증 sub-step 포함",[74,623,625],{"id":624},"_14-인프라-인증-글루","1.4 인프라 (인증 글루)",[82,627,628,637],{},[85,629,630],{},[88,631,632,634],{},[91,633,96],{},[91,635,636],{},"역할",[103,638,639,664,698,709,726,741,761],{},[88,640,641,647],{},[108,642,643],{},[29,644,646],{"href":645},"..\u002Fapp\u002Fcomposables\u002FuseApi.ts","composables\u002FuseApi.ts",[108,648,649,652,653,656,657,660,661,663],{},[69,650,651],{},"$fetch"," 래퍼 + ",[69,654,655],{},"auth-token"," 쿠키 + Bearer 자동 주입 + 401 처리 (",[69,658,659],{},"\u002Fauth\u002F*"," 호출은 호출자 처리, 그 외 만료 시 ",[69,662,141],{}," 리다이렉트)",[88,665,666,672],{},[108,667,668],{},[29,669,671],{"href":670},"..\u002Fapp\u002Fstores\u002Fauth.ts","stores\u002Fauth.ts",[108,673,674,675,678,679,678,682,678,685,678,688,678,691,678,694,697],{},"Pinia: ",[69,676,677],{},"signup","\u002F",[69,680,681],{},"login",[69,683,684],{},"loginByEmail",[69,686,687],{},"fetchMe",[69,689,690],{},"updateMe",[69,692,693],{},"updateCompany",[69,695,696],{},"logout"," 액션 + AuthUser\u002FAuthCompany 풀 타입",[88,699,700,706],{},[108,701,702],{},[29,703,705],{"href":704},"..\u002Fapp\u002Fmiddleware\u002Fauth.global.ts","middleware\u002Fauth.global.ts",[108,707,708],{},"토큰 쿠키 가드 (SSR 안전)",[88,710,711,717],{},[108,712,713],{},[29,714,716],{"href":715},"..\u002Fapp\u002Fmiddleware\u002Fapproval.global.ts","middleware\u002Fapproval.global.ts",[108,718,719,722,723,725],{},[20,720,721],{},"사업자등록증 승인 게이트"," — 미승인이면 차단 페이지 접근 시 ",[69,724,294],{},"로 리다이렉트",[88,727,728,734],{},[108,729,730],{},[29,731,733],{"href":732},"..\u002Fapp\u002Fplugins\u002Fauth.client.ts","plugins\u002Fauth.client.ts",[108,735,736,737,740],{},"클라이언트 부트스트랩 — 토큰 쿠키 있으면 ",[69,738,739],{},"\u002Fme","로 스토어 hydrate",[88,742,743,749],{},[108,744,745],{},[29,746,748],{"href":747},"..\u002Fapp\u002Flayouts\u002Fdefault.vue","layouts\u002Fdefault.vue",[108,750,751,753,754,757,758],{},[69,752,522],{}," → ",[69,755,756],{},"AppGnb"," → main → ",[69,759,760],{},"AppFooter",[88,762,763,768],{},[108,764,765,767],{},[69,766,655],{}," 쿠키",[108,769,770],{},"JWT 7일·SameSite=Lax·secure-in-prod (HttpOnly 아님 — 후속에서 백엔드 Set-Cookie로 강화)",[74,772,774],{"id":773},"_15-시스템-페이지-인증-관련-안내","1.5 시스템 페이지 (인증 관련 안내)",[82,776,777,788],{},[85,778,779],{},[88,780,781,783,785],{},[91,782,93],{},[91,784,96],{},[91,786,787],{},"비고",[103,789,790,806],{},[88,791,792,797,803],{},[108,793,794],{},[69,795,796],{},"\u002Ftemplete\u002Femail\u002Freset-password",[108,798,799],{},[29,800,802],{"href":801},"..\u002Fapp\u002Fpages\u002Ftemplete\u002Femail\u002Freset-password.vue","reset-password.vue",[108,804,805],{},"이메일 인증 메일 템플릿(미연동)",[88,807,808,813,816],{},[108,809,810],{},[69,811,812],{},"\u002Ftemplete\u002Femail\u002Fverify",[108,814,815],{},"(시안에 있으나 미작성)",[108,817,818],{},"가입 인증 메일 템플릿",[61,820],{},[64,822,824],{"id":823},"_2-사업자등록증-심사-승인-게이트-new-2026-06-02","2. 사업자등록증 심사 승인 게이트 (NEW — 2026-06-02)",[14,826,827],{},[17,828,829],{},"정책: 법인사업자(corp) \u002F 개인사업자(sole)는 가입 후 사업자등록증 심사 승인을 받아야\n서비스 이용 및 가입 정보 수정 가능. 개인(personal)은 즉시 사용 가능.",[74,831,833,834,837],{"id":832},"_21-승인-상태-approval_state-4단계-712","2.1 승인 상태 (",[69,835,836],{},"approval_state",") — 4단계 (§7·§12)",[82,839,840,856],{},[85,841,842],{},[88,843,844,847,850,853],{},[91,845,846],{},"상태",[91,848,849],{},"의미",[91,851,852],{},"진입 트리거",[91,854,855],{},"가능한 동작",[103,857,858,874,892,908],{},[88,859,860,865,868,871],{},[108,861,862],{},[69,863,864],{},"pending",[108,866,867],{},"사업자가 가입 직후 — 사업자등록증 미제출",[108,869,870],{},"corp\u002Fsole signup",[108,872,873],{},"조회·계약 관리·1:1 문의만",[88,875,876,881,884,890],{},[108,877,878],{},[69,879,880],{},"reviewing",[108,882,883],{},"사업자등록증 제출 후 — 운영자 심사 대기",[108,885,886,889],{},[69,887,888],{},"POST \u002Fcontracts\u002Ffiles"," kind=biz 시 자동(§12)",[108,891,873],{},[88,893,894,899,902,905],{},[108,895,896],{},[69,897,898],{},"approved",[108,900,901],{},"운영자가 승인 또는 개인 가입자",[108,903,904],{},"운영자(BackOffice, 미구현) \u002F personal signup",[108,906,907],{},"모든 서비스",[88,909,910,915,922,925],{},[108,911,912],{},[69,913,914],{},"rejected",[108,916,917,918,921],{},"운영자가 반려 (",[69,919,920],{},"rejected_reason"," 함께)",[108,923,924],{},"운영자(BackOffice, 미구현)",[108,926,927,928,934],{},"조회·계약 관리(재제출)·1:1 문의만. ",[20,929,930,931,933],{},"재첨부 시 자동 ",[69,932,880],{},"으로 전이"," (§12)",[17,936,937,938,941],{},"상세 분기는 ",[29,939,940],{"href":36},".\u002Fpages\u002FCONTRACT.md §3.1·§6.2·§7.3",".",[74,943,945],{"id":944},"_22-미승인-사용자-ux-흐름","2.2 미승인 사용자 UX 흐름",[947,948,949,962,976,985,1003,1017,1026],"ol",{},[950,951,952,955,956,958,959],"li",{},[20,953,954],{},"가입 완료"," → Step 5 → 사업자: ",[69,957,294],{}," \u002F 개인: ",[69,960,961],{},"\u002Fhome",[950,963,964,753,967,753,969,972,973,975],{},[20,965,966],{},"로그인",[69,968,687],{},[69,970,971],{},"approval_state !== 'approved'"," → 어떤 경로로 가도 미들웨어가 ",[69,974,294],{},"로 자동 이동",[950,977,978,981,982,984],{},[20,979,980],{},"글로벌 띠"," (모든 페이지 상단) — ",[69,983,522],{}," 3분기 안내 + CTA",[950,986,987,990,991,993,994,993,997,1000,1001,725],{},[20,988,989],{},"다른 페이지 시도"," (",[69,992,961],{},"·",[69,995,996],{},"\u002Fsend\u002F*",[69,998,999],{},"\u002Fcontacts"," 등) → 즉시 ",[69,1002,294],{},[950,1004,1005,1008,1009,1012,1013,1016],{},[20,1006,1007],{},"사업자등록증 업로드"," → 백엔드가 자동 ",[69,1010,1011],{},"pending → reviewing"," 전이 + ",[69,1014,1015],{},"auth.fetchMe()","로 store 갱신 → 글로벌 띠·페이지 배너 즉시 \"심사 중\"으로 전환 (§12)",[950,1018,1019,1022,1023,1025],{},[20,1020,1021],{},"승인 완료"," → 모든 페이지 정상 접근 + ",[69,1024,961],{}," 진입 가능",[950,1027,1028,1031],{},[20,1029,1030],{},"§11 배포 이전 가입자 \u002F §12 배포 이전 첨부자"," — GET 시점 lazy backfill로 자동 복구 (§13)",[74,1033,1035],{"id":1034},"_23-백엔드-가드","2.3 백엔드 가드",[17,1037,1038,1041,1042,1045,1046,993,1049,993,1052,1055,1056,1062,1063,1065],{},[69,1039,1040],{},"src\u002Fmiddleware\u002Fapproval.ts"," — ",[69,1043,1044],{},"requireApproved()"," 미들웨어를 18 라우트(",[69,1047,1048],{},"send",[69,1050,1051],{},"contacts",[69,1053,1054],{},"sender-phones"," 등)에 일괄 적용. ",[20,1057,1058,1061],{},[69,1059,1060],{},"mutate-only"," 모드 — POST\u002FPATCH\u002FPUT\u002FDELETE만 차단",", GET 조회는 허용. ",[69,1064,739],{},"의 PATCH도 §7에서 인라인으로 차단.",[17,1067,1068],{},"예외:",[1070,1071,1072,1077],"ul",{},[950,1073,1074,1076],{},[69,1075,465],{}," — 승인 관련 문의 가능해야 함 → 미적용",[950,1078,1079,128,1082,1084],{},[69,1080,1081],{},"\u002Fdispatch-history",[69,1083,441],{}," — GET 전용이라 자동 통과",[74,1086,1088],{"id":1087},"_24-프런트-가드","2.4 프런트 가드",[17,1090,1091,1093],{},[69,1092,716],{}," — 허용 경로 외 접근 시 자동 리다이렉트:",[17,1095,1096,1099],{},[20,1097,1098],{},"허용",":",[1070,1101,1102,1107,1119,1125],{},[950,1103,1104,1106],{},[69,1105,242],{}," (계약·회원 정보·문의)",[950,1108,1109,128,1112,128,1115,1118],{},[69,1110,1111],{},"\u002Fhelp",[69,1113,1114],{},"\u002Fguide",[69,1116,1117],{},"\u002Fwbs"," (정적 문서)",[950,1120,1121,1124],{},[69,1122,1123],{},"\u002Finquiry"," (1:1 문의)",[950,1126,1127,1129],{},[69,1128,80],{}," (로그인·가입 등)",[17,1131,1132,1099],{},[20,1133,1134,1135],{},"차단 → ",[69,1136,294],{},[1070,1138,1139],{},[950,1140,1141,128,1143,128,1145,128,1148,128,1151,128,1154,128,1157,128,1160],{},[69,1142,961],{},[69,1144,996],{},[69,1146,1147],{},"\u002Fhistory\u002F*",[69,1149,1150],{},"\u002Fcontacts\u002F*",[69,1152,1153],{},"\u002Fsender\u002F*",[69,1155,1156],{},"\u002Fmanage\u002F*",[69,1158,1159],{},"\u002Fcampaign*",[69,1161,1162],{},"\u002Fcharge*",[61,1164],{},[64,1166,1168,1169,1172],{"id":1167},"_3-운영자단-페이지-malgn-noti-admin-기획-md만-존재","3. 운영자단 페이지 (",[69,1170,1171],{},"malgn-noti-admin",", 기획 MD만 존재)",[82,1174,1175,1187],{},[85,1176,1177],{},[88,1178,1179,1182,1185],{},[91,1180,1181],{},"기획 MD",[91,1183,1184],{},"라우트(예정)",[91,1186,636],{},[103,1188,1189,1212,1230,1246],{},[88,1190,1191,1197,1205],{},[108,1192,1193],{},[29,1194,1196],{"href":1195},"..\u002F..\u002Fmalgn-noti-admin\u002Fdoc\u002Fpages\u002Fmember\u002Fcompany","member\u002Fcompany.md",[108,1198,1199,128,1202],{},[69,1200,1201],{},"\u002Fadmin\u002Fmember\u002Fcompany",[69,1203,1204],{},"\u002F[id]",[108,1206,1207,1208,1211],{},"고객사 목록·",[20,1209,1210],{},"승인\u002F반려","·한도·차단",[88,1213,1214,1220,1227],{},[108,1215,1216],{},[29,1217,1219],{"href":1218},"..\u002F..\u002Fmalgn-noti-admin\u002Fdoc\u002Fpages\u002Fmember\u002Faccount","member\u002Faccount.md",[108,1221,1222,128,1225],{},[69,1223,1224],{},"\u002Fadmin\u002Fmember\u002Faccount",[69,1226,1204],{},[108,1228,1229],{},"개별 사용자 계정·OTP 진단·임시 비번·2FA 초기화",[88,1231,1232,1238,1243],{},[108,1233,1234],{},[29,1235,1237],{"href":1236},"..\u002F..\u002Fmalgn-noti-admin\u002Fdoc\u002Fpages\u002Fmember\u002Faudit","member\u002Faudit.md",[108,1239,1240],{},[69,1241,1242],{},"\u002Fadmin\u002Fmember\u002Faudit",[108,1244,1245],{},"감사 로그",[88,1247,1248,1254,1259],{},[108,1249,1250],{},[29,1251,1253],{"href":1252},"..\u002F..\u002Fmalgn-noti-admin\u002Fdoc\u002Fpages\u002Fmember\u002Fblock","member\u002Fblock.md",[108,1255,1256],{},[69,1257,1258],{},"\u002Fadmin\u002Fmember\u002Fblock",[108,1260,1261],{},"강제 차단·복구",[17,1263,1264,1265,1268,1269,941],{},"→ ",[20,1266,1267],{},"운영자단 화면은 모두 미개발","(셸 + 기획만). 사업자 승인은 현재 라이브 DB 직접 UPDATE로만 처리 가능. ",[20,1270,1271],{},"승인 화면은 P0 1순위",[61,1273],{},[64,1275,1277,1278,72],{"id":1276},"_4-api-엔드포인트-malgn-noti-api","4. API 엔드포인트 (",[69,1279,1280],{},"malgn-noti-api",[74,1282,1284,1285,72],{"id":1283},"_41-인증-srcroutesauthts","4.1 인증 (",[69,1286,1287],{},"src\u002Froutes\u002Fauth.ts",[82,1289,1290,1304],{},[85,1291,1292],{},[88,1293,1294,1296,1299,1302],{},[91,1295,93],{},[91,1297,1298],{},"요청",[91,1300,1301],{},"응답",[91,1303,846],{},[103,1305,1306,1331,1351,1369,1389,1408,1431,1449,1468,1486,1503,1519,1535,1551],{},[88,1307,1308,1313,1318,1328],{},[108,1309,1310],{},[69,1311,1312],{},"POST \u002Fauth\u002Fsignup",[108,1314,1315],{},[69,1316,1317],{},"{companyName, companyType?, loginid, password, name?, email?, phone?, niceSession?}",[108,1319,1320,1323,1324,1327],{},[69,1321,1322],{},"201 {data:{user, company, token}}",". companyType='corp'\u002F'sole'면 ",[69,1325,1326],{},"approval_state='pending'"," 자동, 그 외 'approved'",[108,1329,1330],{},"✅",[88,1332,1333,1338,1343,1349],{},[108,1334,1335],{},[69,1336,1337],{},"POST \u002Fauth\u002Flogin",[108,1339,1340],{},[69,1341,1342],{},"{companyId, loginid, password}",[108,1344,1345,1348],{},[69,1346,1347],{},"200 {data:{user, company, token}}"," (legacy — 사용 안 함)",[108,1350,1330],{},[88,1352,1353,1357,1362,1367],{},[108,1354,1355],{},[69,1356,155],{},[108,1358,1359],{},[69,1360,1361],{},"{email, password}",[108,1363,1364,1366],{},[69,1365,1347],{}," — loginid 전역 UNIQUE 기반 단일 매치",[108,1368,1330],{},[88,1370,1371,1376,1381,1386],{},[108,1372,1373],{},[69,1374,1375],{},"POST \u002Fauth\u002Femail-code\u002Fsend",[108,1377,1378],{},[69,1379,1380],{},"{email, purpose:'signup'\u002F'reset_password'\u002F'change_email'}",[108,1382,1383],{},[69,1384,1385],{},"200 {data:{sent, expiresAt, mockCode?}}",[108,1387,1388],{},"✅ (NHN 자격증명 등록 전까지 mock fallback)",[88,1390,1391,1396,1401,1406],{},[108,1392,1393],{},[69,1394,1395],{},"POST \u002Fauth\u002Femail-code\u002Fverify",[108,1397,1398],{},[69,1399,1400],{},"{email, purpose, code}",[108,1402,1403],{},[69,1404,1405],{},"200 {data:{verified}}",[108,1407,1330],{},[88,1409,1410,1415,1420,1424],{},[108,1411,1412],{},[69,1413,1414],{},"POST \u002Fauth\u002Fphone-code\u002Fsend",[108,1416,1417],{},[69,1418,1419],{},"{phone, purpose:'signup'\u002F'reset_password'\u002F'change_phone'\u002F'contract_sign'}",[108,1421,1422],{},[69,1423,1385],{},[108,1425,1426,1427,1430],{},"✅ (자체 SMS OTP — NICE와 별개. §15에서 ",[69,1428,1429],{},"contract_sign"," 추가)",[88,1432,1433,1438,1443,1447],{},[108,1434,1435],{},[69,1436,1437],{},"POST \u002Fauth\u002Fphone-code\u002Fverify",[108,1439,1440],{},[69,1441,1442],{},"{phone, purpose, code}",[108,1444,1445],{},[69,1446,1405],{},[108,1448,1330],{},[88,1450,1451,1456,1461,1466],{},[108,1452,1453],{},[69,1454,1455],{},"POST \u002Fauth\u002Fnice\u002Finit",[108,1457,1458],{},[69,1459,1460],{},"{purpose:'signup'\u002F'change_phone'}",[108,1462,1463],{},[69,1464,1465],{},"200 {data:{sessionId, authUrl, mockMode}}",[108,1467,1330],{},[88,1469,1470,1475,1481,1484],{},[108,1471,1472],{},[69,1473,1474],{},"POST \u002Fauth\u002Fnice\u002Fcallback",[108,1476,1477,1478],{},"NICE form ",[69,1479,1480],{},"web_transaction_id",[108,1482,1483],{},"HTML (자동 팝업 닫기)",[108,1485,1330],{},[88,1487,1488,1493,1496,1501],{},[108,1489,1490],{},[69,1491,1492],{},"GET \u002Fauth\u002Fnice\u002Fstatus?session=…",[108,1494,1495],{},"—",[108,1497,1498],{},[69,1499,1500],{},"200 {data:{state, name?, birthdate?, ...}}",[108,1502,1330],{},[88,1504,1505,1509,1514,1517],{},[108,1506,1507],{},[69,1508,337],{},[108,1510,1511],{},[69,1512,1513],{},"{currentPassword, newPassword}",[108,1515,1516],{},"TBD",[108,1518,212],{},[88,1520,1521,1526,1531,1533],{},[108,1522,1523],{},[69,1524,1525],{},"POST \u002Fauth\u002Fpassword\u002Freset",[108,1527,1528],{},[69,1529,1530],{},"{email, code, newPassword}",[108,1532,1516],{},[108,1534,212],{},[88,1536,1537,1542,1547,1549],{},[108,1538,1539],{},[69,1540,1541],{},"POST \u002Fauth\u002Fagree-terms",[108,1543,1544],{},[69,1545,1546],{},"{terms:[{id, version, requiredYn}]}",[108,1548,1516],{},[108,1550,212],{},[88,1552,1553,1558,1561,1563],{},[108,1554,1555],{},[69,1556,1557],{},"POST \u002Fauth\u002Flogout",[108,1559,1560],{},"(Bearer)",[108,1562,1516],{},[108,1564,1565],{},"⚪ — 클라이언트 쿠키 삭제만",[74,1567,1569,1570,72],{"id":1568},"_42-현재-사용자-srcroutesmets","4.2 현재 사용자 (",[69,1571,1572],{},"src\u002Froutes\u002Fme.ts",[82,1574,1575,1587],{},[85,1576,1577],{},[88,1578,1579,1581,1583,1585],{},[91,1580,93],{},[91,1582,1298],{},[91,1584,1301],{},[91,1586,846],{},[103,1588,1589,1606,1627,1645],{},[88,1590,1591,1595,1598,1604],{},[108,1592,1593],{},[69,1594,280],{},[108,1596,1597],{},"Bearer",[108,1599,1600,1603],{},[69,1601,1602],{},"200 {data:{user, company, ctxRole}}"," — TB_USER 13 + TB_COMPANY 17 컬럼 풀 노출(approvalState 포함)",[108,1605,1330],{},[88,1607,1608,1612,1617,1625],{},[108,1609,1610],{},[69,1611,283],{},[108,1613,1614],{},[69,1615,1616],{},"{name?, phone?}",[108,1618,1619,1041,1622,1624],{},[69,1620,1621],{},"200 {data:...}",[69,1623,971],{},"면 403",[108,1626,1330],{},[88,1628,1629,1633,1638,1643],{},[108,1630,1631],{},[69,1632,286],{},[108,1634,1635],{},[69,1636,1637],{},"{companyPhone?, billingEmail?, adReceive?}",[108,1639,1640,1642],{},[69,1641,1621],{}," — owner\u002Fadmin만 + 승인 게이트",[108,1644,1330],{},[88,1646,1647,1651,1656,1658],{},[108,1648,1649],{},[69,1650,359],{},[108,1652,1653],{},[69,1654,1655],{},"{securityLoginYn, securityLoginMethod}",[108,1657,1516],{},[108,1659,212],{},[74,1661,1663,1664,72],{"id":1662},"_43-승인-게이트-미들웨어-srcmiddlewareapprovalts","4.3 승인 게이트 미들웨어 (",[69,1665,1040],{},[17,1667,1668,1671],{},[69,1669,1670],{},"requireApproved({method?: 'mutate-only' | 'all'})"," — 적용 라우트 18종:",[1070,1673,1674,1686,1709,1720,1728],{},[950,1675,1676,128,1678,128,1680,128,1683],{},[69,1677,996],{},[69,1679,999],{},[69,1681,1682],{},"\u002Fcontact-groups",[69,1684,1685],{},"\u002Foptout-entries",[950,1687,1688,128,1691,128,1694,128,1697,128,1700,128,1703,128,1706],{},[69,1689,1690],{},"\u002Fsender-phones",[69,1692,1693],{},"\u002Frcs-brands",[69,1695,1696],{},"\u002Femail-domains",[69,1698,1699],{},"\u002Fpush-certs",[69,1701,1702],{},"\u002Fkakao-sender-profiles",[69,1704,1705],{},"\u002Fkakao-profile-groups",[69,1707,1708],{},"\u002Foptout-080-numbers",[950,1710,1711,128,1714,128,1717],{},[69,1712,1713],{},"\u002Ftemplates",[69,1715,1716],{},"\u002Ftemplate-categories",[69,1718,1719],{},"\u002Flanding-pages",[950,1721,1722,128,1725],{},[69,1723,1724],{},"\u002Fflow-definitions",[69,1726,1727],{},"\u002Fexport-jobs",[950,1729,1730,128,1732],{},[69,1731,401],{},[69,1733,1734],{},"\u002Fcompany-settings",[17,1736,1737],{},"미승인이면 변경(POST\u002FPATCH\u002FPUT\u002FDELETE) 차단 → 403 + 상황별 메시지(pending: 심사 후 가능, rejected: 사유 안내).",[74,1739,1741],{"id":1740},"_44-서비스-담당자-초대-미구현","4.4 서비스 담당자 초대 (미구현)",[82,1743,1744,1752],{},[85,1745,1746],{},[88,1747,1748,1750],{},[91,1749,93],{},[91,1751,846],{},[103,1753,1754],{},[88,1755,1756,1767],{},[108,1757,1758,128,1761,128,1764],{},[69,1759,1760],{},"GET\u002FPOST \u002Fmanager-invites",[69,1762,1763],{},"POST \u002F{token}\u002Faccept",[69,1765,1766],{},"DELETE \u002F{id}",[108,1768,212],{},[74,1770,1772,1773,1776],{"id":1771},"_45-계약서류-srcroutescontractsts-11","4.5 계약·서류 (",[69,1774,1775],{},"src\u002Froutes\u002Fcontracts.ts",", §11)",[82,1778,1779,1789],{},[85,1780,1781],{},[88,1782,1783,1785,1787],{},[91,1784,93],{},[91,1786,846],{},[91,1788,787],{},[103,1790,1791,1803,1815,1827,1838,1850],{},[88,1792,1793,1798,1800],{},[108,1794,1795],{},[69,1796,1797],{},"GET \u002Fcontracts",[108,1799,1330],{},[108,1801,1802],{},"본 회사 계약 목록. §13 lazy auto-create (corp\u002Fsole + 0건 → 'initial' 자동)",[88,1804,1805,1810,1812],{},[108,1806,1807],{},[69,1808,1809],{},"POST \u002Fcontracts\u002F:id\u002Fsign",[108,1811,1330],{},[108,1813,1814],{},"전자서명 완료 → done + signed_at + expires_at=+2y. renew면 다른 done 자동 expired",[88,1816,1817,1822,1824],{},[108,1818,1819],{},[69,1820,1821],{},"GET \u002Fcontracts\u002Ffiles",[108,1823,1330],{},[108,1825,1826],{},"본 회사 파일 목록. §13 자동 회복 (pending + biz 파일 ≥1 → reviewing)",[88,1828,1829,1833,1835],{},[108,1830,1831],{},[69,1832,888],{},[108,1834,1330],{},[108,1836,1837],{},"멀티파트 PDF·10MB R2 적재 + DB insert. §12 kind=biz면 자동 `pending",[88,1839,1840,1845,1847],{},[108,1841,1842],{},[69,1843,1844],{},"GET \u002Fcontracts\u002Ffiles\u002F:id\u002Fdownload",[108,1846,1330],{},[108,1848,1849],{},"R2 stream → application\u002Fpdf",[88,1851,1852,1857,1859],{},[108,1853,1854],{},[69,1855,1856],{},"DELETE \u002Fcontracts\u002Ffiles\u002F:id",[108,1858,1330],{},[108,1860,1861],{},"R2 + DB 삭제 (사용자단은 rejected 상태에서만 호출 §14)",[17,1863,1864,1865,941],{},"상세는 ",[29,1866,1868],{"href":1867},".\u002Fpages\u002FCONTRACT#8-api-%EC%97%94%EB%93%9C%ED%8F%AC%EC%9D%B8%ED%8A%B8--%EA%B5%AC%ED%98%84%EB%90%A8-11",".\u002Fpages\u002FCONTRACT.md §8",[74,1870,1872],{"id":1871},"_46-r2-bucket","4.6 R2 bucket",[82,1874,1875,1887],{},[85,1876,1877],{},[88,1878,1879,1882,1885],{},[91,1880,1881],{},"바인딩",[91,1883,1884],{},"bucket",[91,1886,512],{},[103,1888,1889],{},[88,1890,1891,1896,1901],{},[108,1892,1893],{},[69,1894,1895],{},"FILES",[108,1897,1898],{},[69,1899,1900],{},"malgn-noti-files",[108,1902,1903],{},"사업자등록증·대부업등록증·보험증권 등 계약 첨부 (§11)",[74,1905,1907,1908,72],{"id":1906},"_47-운영자단-미구현-admin","4.7 운영자단 (미구현, ",[69,1909,1910],{},"\u002Fadmin\u002F*",[82,1912,1913,1921],{},[85,1914,1915],{},[88,1916,1917,1919],{},[91,1918,93],{},[91,1920,846],{},[103,1922,1923,1933,1946],{},[88,1924,1925,1931],{},[108,1926,1927,1930],{},[69,1928,1929],{},"GET \u002Fadmin\u002Fcompanies"," · 목록 + 필터",[108,1932,212],{},[88,1934,1935,1943],{},[108,1936,1937,128,1940],{},[69,1938,1939],{},"POST \u002Fadmin\u002Fcompanies\u002F{id}\u002Fapprove",[69,1941,1942],{},"POST \u002Freject {reason}",[108,1944,1945],{},"⚪ — 현재 라이브 DB 직접 UPDATE",[88,1947,1948,1954],{},[108,1949,1950,1953],{},[69,1951,1952],{},"GET \u002Fadmin\u002Fusers"," · 강제 비활성·2FA 초기화·임시 비번",[108,1955,212],{},[61,1957],{},[64,1959,1961],{"id":1960},"_5-db-테이블-회원인증-관련","5. DB 테이블 (회원·인증 관련)",[74,1963,1965],{"id":1964},"_51-핵심-라이브-schemats","5.1 핵심 (라이브 + schema.ts)",[82,1967,1968,1984],{},[85,1969,1970],{},[88,1971,1972,1975,1978,1981],{},[91,1973,1974],{},"테이블",[91,1976,1977],{},"핵심 컬럼",[91,1979,1980],{},"schema.ts",[91,1982,1983],{},"라이브",[103,1985,1986,2009,2043,2057,2071,2085],{},[88,1987,1988,1993,2005,2007],{},[108,1989,1990],{},[69,1991,1992],{},"TB_COMPANY",[108,1994,1995,1996,1999,2000,1999,2002,2004],{},"name, ",[20,1997,1998],{},"company_type",", ",[20,2001,836],{},[20,2003,920],{},", biz_no, biz_type, ceo_name, up_tae, up_jong, address, company_phone, billing_email, credit_balance, ad_receive, status",[108,2006,1330],{},[108,2008,1330],{},[88,2010,2011,2016,2039,2041],{},[108,2012,2013],{},[69,2014,2015],{},"TB_USER",[108,2017,2018,2019,2022,2023,1999,2026,1999,2029,1999,2032,1999,2035,2038],{},"company_id, ",[20,2020,2021],{},"loginid(UNIQUE 전역)",", email, password_hash, name, phone, ",[20,2024,2025],{},"birthdate",[20,2027,2028],{},"gender",[20,2030,2031],{},"national_info",[20,2033,2034],{},"ci(UNIQUE)",[20,2036,2037],{},"mobile_co",", role, member_type, security_login_yn, security_login_method, join_state, status, last_login_at",[108,2040,1330],{},[108,2042,1330],{},[88,2044,2045,2050,2053,2055],{},[108,2046,2047],{},[69,2048,2049],{},"TB_COMPANY_SETTINGS",[108,2051,2052],{},"테넌트별 발송 설정",[108,2054,1330],{},[108,2056,1330],{},[88,2058,2059,2064,2067,2069],{},[108,2060,2061],{},[69,2062,2063],{},"TB_VERIFICATION",[108,2065,2066],{},"target_type(email\u002Fphone), target, code_hash, purpose, attempts, expires_at, consumed_at",[108,2068,1330],{},[108,2070,1330],{},[88,2072,2073,2078,2081,2083],{},[108,2074,2075],{},[69,2076,2077],{},"TB_NICE_AUTH",[108,2079,2080],{},"request_no, transaction_id, ticket, iterators, state(pending\u002Fcompleted\u002Ffailed\u002Fexpired\u002Fconsumed), name, birthdate, gender, ci, di, mobile_no, mobile_co, expires_at, consumed 후 재사용 차단",[108,2082,1330],{},[108,2084,1330],{},[88,2086,2087,2092,2095,2097],{},[108,2088,2089],{},[69,2090,2091],{},"TB_SESSION",[108,2093,2094],{},"발급 JWT 추적용 (logout revoke 시)",[108,2096,212],{},[108,2098,1330],{},[74,2100,2102],{"id":2101},"_52-멀티-계정초대-라이브-있음-schemats-미정의","5.2 멀티 계정·초대 (라이브 있음, schema.ts 미정의)",[82,2104,2105,2113],{},[85,2106,2107],{},[88,2108,2109,2111],{},[91,2110,1974],{},[91,2112,636],{},[103,2114,2115,2125],{},[88,2116,2117,2122],{},[108,2118,2119],{},[69,2120,2121],{},"TB_MEMBER_VERIFICATION",[108,2123,2124],{},"멀티계정 본인 확인",[88,2126,2127,2131],{},[108,2128,2129],{},[69,2130,234],{},[108,2132,2133],{},"서비스 담당자 초대 토큰",[74,2135,2137],{"id":2136},"_53-약관-라이브-미확정","5.3 약관 (라이브 미확정)",[82,2139,2140,2148],{},[85,2141,2142],{},[88,2143,2144,2146],{},[91,2145,1974],{},[91,2147,636],{},[103,2149,2150,2160],{},[88,2151,2152,2157],{},[108,2153,2154],{},[69,2155,2156],{},"TB_TERMS",[108,2158,2159],{},"약관 정본 (추정)",[88,2161,2162,2167],{},[108,2163,2164],{},[69,2165,2166],{},"TB_TERMS_AGREEMENT",[108,2168,2169],{},"동의 기록 (추정)",[17,2171,2172],{},"→ schema.ts 미정의. 후속 작업에서 확정.",[74,2174,2176],{"id":2175},"_54-계약-라이브-schemats-11","5.4 계약 (라이브 + schema.ts §11)",[82,2178,2179,2191],{},[85,2180,2181],{},[88,2182,2183,2185,2187,2189],{},[91,2184,1974],{},[91,2186,1977],{},[91,2188,1980],{},[91,2190,1983],{},[103,2192,2193,2211],{},[88,2194,2195,2200,2207,2209],{},[108,2196,2197],{},[69,2198,2199],{},"TB_CONTRACT",[108,2201,2202,2203,2206],{},"company_id, title, version, ",[20,2204,2205],{},"contract_state","(initial\u002Fdone\u002Frenew\u002Fexpired), status, signer_user_id, signed_at, expires_at",[108,2208,1330],{},[108,2210,1330],{},[88,2212,2213,2218,2239,2241],{},[108,2214,2215],{},[69,2216,2217],{},"TB_CONTRACT_FILE",[108,2219,2220,2221,2224,2225,678,2228,678,2231,2234,2235,2238],{},"contract_id, ",[20,2222,2223],{},"name","(한국어 접두사로 종류 구분 — ",[69,2226,2227],{},"사업자등록증_",[69,2229,2230],{},"대부업등록증_",[69,2232,2233],{},"지급이행보증보험증권_","), size_bytes, ",[20,2236,2237],{},"r2_key",", uploaded_at",[108,2240,1330],{},[108,2242,1330],{},[17,2244,2245,2246,941],{},"상세 스키마 + 정책: ",[29,2247,2249],{"href":2248},".\u002Fpages\u002FCONTRACT#9-db-%ED%85%8C%EC%9D%B4%EB%B8%94-%EB%9D%BC%EC%9D%B4%EB%B8%8C--schemats-%EC%A0%95%EC%9D%98-11",".\u002Fpages\u002FCONTRACT.md §9",[74,2251,2253],{"id":2252},"_55-결제-ddl-이력","5.5 결제 \u002F DDL 이력",[82,2255,2256,2265],{},[85,2257,2258],{},[88,2259,2260,2263],{},[91,2261,2262],{},"테이블 \u002F 마이그레이션",[91,2264,846],{},[103,2266,2267,2276],{},[88,2268,2269,2274],{},[108,2270,2271],{},[69,2272,2273],{},"TB_PAYMENT_METHOD",[108,2275,1330],{},[88,2277,2278,2295],{},[108,2279,2280,128,2283,128,2286,128,2289,128,2292],{},[69,2281,2282],{},"0001_idempotency.sql",[69,2284,2285],{},"0002_export_flow.sql",[69,2287,2288],{},"0003_user_loginid_global_unique.sql",[69,2290,2291],{},"0004_nice_auth.sql",[69,2293,2294],{},"0005_company_approval.sql",[108,2296,2297],{},"모두 라이브 적용 완료",[61,2299],{},[64,2301,2303],{"id":2302},"_6-정책-결정-사항","6. 정책 결정 사항",[14,2305,2306],{},[17,2307,2308,2309,1999,2311,1999,2313,2317],{},"상세: ",[29,2310,32],{"href":31},[29,2312,42],{"href":41},[29,2314,2316],{"href":2315},".\u002FWBS",".\u002FWBS.md"," §2-4·§2-6",[74,2319,2321,2322,72],{"id":2320},"_61-회원-유형-company_type","6.1 회원 유형 (",[69,2323,1998],{},[17,2325,2326,2329,2330,2333,2334,2337],{},[69,2327,2328],{},"corp"," (법인사업자) · ",[69,2331,2332],{},"sole"," (개인사업자) · ",[69,2335,2336],{},"personal"," (개인) 3종. signup 시 전달, TB_COMPANY 적재.",[74,2339,2341],{"id":2340},"_62-결제-방식","6.2 결제 방식",[1070,2343,2344,2355],{},[950,2345,2346,2347,2350,2351,2354],{},"법인·개인사업자: ",[20,2348,2349],{},"카드 충전"," 또는 ",[20,2352,2353],{},"후불 결제"," 선택",[950,2356,2357,2358],{},"개인: ",[20,2359,2360],{},"카드 충전만",[74,2362,2364],{"id":2363},"_63-가입-직후-승인-구현-완료","6.3 가입 직후 승인 (구현 완료)",[82,2366,2367,2385],{},[85,2368,2369],{},[88,2370,2371,2374,2379,2382],{},[91,2372,2373],{},"회사 유형",[91,2375,2376,2378],{},[69,2377,836],{}," 초기값",[91,2380,2381],{},"서비스 이용",[91,2383,2384],{},"정보 수정",[103,2386,2387,2406,2423],{},[88,2388,2389,2394,2401,2404],{},[108,2390,2391,2392],{},"법인사업자 ",[69,2393,2328],{},[108,2395,2396,2398,2399,934],{},[69,2397,864],{}," → biz 첨부 시 ",[69,2400,880],{},[108,2402,2403],{},"❌",[108,2405,2403],{},[88,2407,2408,2413,2419,2421],{},[108,2409,2410,2411],{},"개인사업자 ",[69,2412,2332],{},[108,2414,2415,2398,2417,934],{},[69,2416,864],{},[69,2418,880],{},[108,2420,2403],{},[108,2422,2403],{},[88,2424,2425,2430,2434,2436],{},[108,2426,2427,2428],{},"개인 ",[69,2429,2336],{},[108,2431,2432],{},[69,2433,898],{},[108,2435,1330],{},[108,2437,1330],{},[17,2439,2440,2441,2443,2444,2446,2447,2449,2450,2452],{},"운영자 승인 → ",[69,2442,898],{}," 또는 반려 → ",[69,2445,914],{}," + ",[69,2448,920],{},". 반려 후 재첨부 시 자동 ",[69,2451,880],{},"으로 재진입. 사용자단·백엔드 둘 다 게이트 적용 완료. 운영자단 승인 화면은 미구현(P0).",[74,2454,2456],{"id":2455},"_64-loginid-전역-unique","6.4 loginid 전역 UNIQUE",[17,2458,2459,2462,2463,2466],{},[69,2460,2461],{},"TB_USER.loginid"," 전역 UNIQUE (0003). \"한 이메일 = 한 회사 = 한 로그인\". 회원가입 마법사는 ",[69,2464,2465],{},"loginid = email","로 발급.",[74,2468,2470],{"id":2469},"_65-멀티-계정","6.5 멀티 계정",[17,2472,2473,2474,2476],{},"법인·개인사업자만 주계정 + 보조계정 추가 가능. 개인은 ",[69,2475,366],{}," 탭 미노출(현재 코드 모두 노출 — 후속).",[74,2478,2480],{"id":2479},"_66-비밀번호-정책","6.6 비밀번호 정책",[17,2482,2483,2486],{},[69,2484,2485],{},"min 8자"," (현 검증). 영문·숫자·특수문자 조합 8자 이상은 표시 문구만, 검증은 없음.",[74,2488,2490],{"id":2489},"_67-본인-확인-otp","6.7 본인 확인 \u002F OTP",[82,2492,2493,2506],{},[85,2494,2495],{},[88,2496,2497,2500,2503],{},[91,2498,2499],{},"채널",[91,2501,2502],{},"단순 OTP (소유 검증)",[91,2504,2505],{},"본인 확인 (NICE)",[103,2507,2508,2520],{},[88,2509,2510,2513,2518],{},[108,2511,2512],{},"이메일",[108,2514,124,2515,2517],{},[69,2516,127],{}," (signup·reset·change)",[108,2519,1495],{},[88,2521,2522,2525,2533],{},[108,2523,2524],{},"휴대폰",[108,2526,124,2527,2530,2531,72],{},[69,2528,2529],{},"\u002Fauth\u002Fphone-code\u002F*"," (signup·reset·change·",[20,2532,1429],{},[108,2534,124,2535,2537],{},[69,2536,131],{}," (signup의 Step 4 메인)",[17,2539,2540,2541,2544,2545,2548],{},"자체 SMS OTP는 단순 휴대폰 보유 확인 — 비밀번호 재설정·",[20,2542,2543],{},"계약서 전자서명 직전 본인 확인","(§15) 등에 활용. ",[20,2546,2547],{},"회원가입 본인 확인은 NICE M(휴대폰)으로 일원화"," (NICE 자격증명 발급 후 real 모드 전환 — 현재 mock. §16 참조).",[74,2550,2552],{"id":2551},"_68-외부-자격증명-운영-상태-16","6.8 외부 자격증명 운영 상태 (§16)",[82,2554,2555,2568],{},[85,2556,2557],{},[88,2558,2559,2562,2565],{},[91,2560,2561],{},"서비스",[91,2563,2564],{},"현재",[91,2566,2567],{},"보류 사유",[103,2569,2570,2587],{},[88,2571,2572,2577,2584],{},[108,2573,2574],{},[20,2575,2576],{},"NICE 본인확인",[108,2578,2579,2580,2583],{},"mock (",[69,2581,2582],{},"NICE_MOCK=1","). CLIENT_ID\u002FSECRET\u002FRETURN_URL 3 secret은 등록 후 보관",[108,2585,2586],{},"콘솔 IP 화이트리스트(에러 1007). 사용자 콘솔 작업 대기",[88,2588,2589,2594,2600],{},[108,2590,2591],{},[20,2592,2593],{},"NHN Notification Hub",[108,2595,2579,2596,2599],{},[69,2597,2598],{},"NHN_MOCK=1","). AppKey만 수령",[108,2601,2602],{},"User Access Key + Secret Access Key 미수령 + Bearer 토큰 인증으로 어댑터 재작성 필요",[17,2604,2605,2606,941],{},"키 수령·정책 해결 시 mock 제거 + 어댑터 교체 + e2e — 상세는 ",[29,2607,2609],{"href":2608},".\u002Fhistory\u002Fhistory.20260602#16-%EC%9A%B4%EC%98%81-%EB%85%B8%ED%8A%B8--nice--nhn-notification-hub-%EC%9E%90%EA%B2%A9%EC%A6%9D%EB%AA%85-%EC%8B%9C%EB%8F%84%EC%99%80-%EB%B3%B4%EB%A5%98-%EB%9D%BC%EC%9D%B4%EB%B8%8C-%EC%9A%B4%EC%98%81-%EB%B3%80%EA%B2%BD","history.20260602.md §16",[74,2611,2613],{"id":2612},"_69-nice-본인확인-ci-중복-가입-차단","6.9 NICE 본인확인 + CI 중복 가입 차단",[17,2615,2616,2617,2620,2621,2624],{},"NICE 응답의 ",[69,2618,2619],{},"ci","는 사이트 간 동일인 식별자. ",[69,2622,2623],{},"TB_USER.ci UNIQUE","로 한 사람이 두 회사에 가입 불가. signup 시 사전 검사 — 중복이면 409 \"이미 가입된 사용자입니다. 비밀번호 재설정으로 진행해 주세요.\"",[61,2626],{},[64,2628,2630],{"id":2629},"_7-보안-모델","7. 보안 모델",[82,2632,2633,2644],{},[85,2634,2635],{},[88,2636,2637,2640,2642],{},[91,2638,2639],{},"항목",[91,2641,2564],{},[91,2643,787],{},[103,2645,2646,2662,2674,2692,2704,2716,2732,2747,2760,2773],{},[88,2647,2648,2653,2659],{},[108,2649,2650],{},[20,2651,2652],{},"비밀번호 저장",[108,2654,2655,2656,72],{},"PBKDF2-SHA256 (",[69,2657,2658],{},"src\u002Flib\u002Fpassword.ts",[108,2660,2661],{},"OK",[88,2663,2664,2669,2672],{},[108,2665,2666],{},[20,2667,2668],{},"JWT",[108,2670,2671],{},"HS256, 만료 7일, sub=userId, cid=companyId, role",[108,2673,2661],{},[88,2675,2676,2681,2689],{},[108,2677,2678],{},[20,2679,2680],{},"JWT 저장",[108,2682,2683,2685,2686],{},[69,2684,655],{}," 쿠키, SameSite=Lax, secure-in-prod, HttpOnly ",[20,2687,2688],{},"아님",[108,2690,2691],{},"백엔드 Set-Cookie 미사용 — 후속 강화",[88,2693,2694,2699,2702],{},[108,2695,2696],{},[20,2697,2698],{},"OTP 코드 저장",[108,2700,2701],{},"SHA-256(target|purpose|code) 해시만 (평문 금지)",[108,2703,2661],{},[88,2705,2706,2711,2714],{},[108,2707,2708],{},[20,2709,2710],{},"NICE 본인 확인",[108,2712,2713],{},"AES-256-GCM + PBKDF2 + HMAC 무결성 검증 (Web Crypto)",[108,2715,2661],{},[88,2717,2718,2723,2729],{},[108,2719,2720],{},[20,2721,2722],{},"승인 게이트",[108,2724,2725,2726,2728],{},"DB ",[69,2727,836],{}," + 백엔드 미들웨어 + 프런트 미들웨어",[108,2730,2731],{},"OK (운영자단 승인 UI 미)",[88,2733,2734,2739,2745],{},[108,2735,2736],{},[20,2737,2738],{},"세션 revoke",[108,2740,2741,2742,2744],{},"클라이언트 쿠키 삭제만 (",[69,2743,2091],{}," 미구현)",[108,2746,212],{},[88,2748,2749,2754,2757],{},[108,2750,2751],{},[20,2752,2753],{},"CORS 화이트리스트",[108,2755,2756],{},"백엔드 미설정 → 모두 허용",[108,2758,2759],{},"후속",[88,2761,2762,2767,2770],{},[108,2763,2764],{},[20,2765,2766],{},"Rate limit",[108,2768,2769],{},"발송·검증·로그인 모두 없음",[108,2771,2772],{},"후속 (Cloudflare KV·Durable Objects 검토)",[88,2774,2775,2779,2785],{},[108,2776,2777],{},[20,2778,1245],{},[108,2780,2781,2782,72],{},"mutating 액션 미적재 (",[69,2783,2784],{},"TB_AUDIT_LOG",[108,2786,2759],{},[61,2788],{},[64,2790,2792],{"id":2791},"_8-현-구현-상태-한눈에","8. 현 구현 상태 한눈에",[82,2794,2795,2809],{},[85,2796,2797],{},[88,2798,2799,2801,2804,2807],{},[91,2800,2639],{},[91,2802,2803],{},"백엔드",[91,2805,2806],{},"프런트",[91,2808,787],{},[103,2810,2811,2823,2835,2847,2858,2870,2882,2894,2906,2920,2935,2952,2966,2983,2997,3011,3023,3033,3045,3059,3074,3087,3102,3117,3130,3142],{},[88,2812,2813,2816,2818,2820],{},[108,2814,2815],{},"회원가입 (signup)",[108,2817,1330],{},[108,2819,1330],{},[108,2821,2822],{},"companyType 전달, Step 5 유형 분기",[88,2824,2825,2828,2830,2832],{},[108,2826,2827],{},"이메일 OTP",[108,2829,1330],{},[108,2831,1330],{},[108,2833,2834],{},"NHN 자격증명 발급 후 실 메일 발송",[88,2836,2837,2840,2842,2844],{},[108,2838,2839],{},"휴대폰 SMS OTP",[108,2841,1330],{},[108,2843,1330],{},[108,2845,2846],{},"signup Step 4는 NICE로 대체",[88,2848,2849,2851,2853,2855],{},[108,2850,2576],{},[108,2852,1330],{},[108,2854,1330],{},[108,2856,2857],{},"mock 모드 — NICE 자격증명 발급 후 real",[88,2859,2860,2863,2865,2867],{},[108,2861,2862],{},"로그인 (이메일 + 비번)",[108,2864,1330],{},[108,2866,1330],{},[108,2868,2869],{},"login-by-email 단일 매치",[88,2871,2872,2875,2877,2879],{},[108,2873,2874],{},"\u002Fme 조회",[108,2876,1330],{},[108,2878,1330],{},[108,2880,2881],{},"풀 컬럼(승인 정보 포함)",[88,2883,2884,2887,2889,2891],{},[108,2885,2886],{},"사용자 정보 변경 (PATCH \u002Fme)",[108,2888,1330],{},[108,2890,1330],{},[108,2892,2893],{},"name·phone — 승인 게이트",[88,2895,2896,2899,2901,2903],{},[108,2897,2898],{},"회사 정보 변경 (PATCH \u002Fme\u002Fcompany)",[108,2900,1330],{},[108,2902,1330],{},[108,2904,2905],{},"companyPhone·billingEmail·adReceive — owner\u002Fadmin + 승인 게이트",[88,2907,2908,2913,2915,2917],{},[108,2909,2910],{},[20,2911,2912],{},"승인 게이트 (DB + 18 라우트 + 프런트)",[108,2914,1330],{},[108,2916,1330],{},[108,2918,2919],{},"운영자단 승인 UI 미 — DB 직접 UPDATE로 임시",[88,2921,2922,2928,2930,2932],{},[108,2923,2924,2927],{},[20,2925,2926],{},"reviewing 자동 전이"," (biz 첨부 시)",[108,2929,1330],{},[108,2931,1330],{},[108,2933,2934],{},"§12 + §13 lazy 회복",[88,2936,2937,2942,2944,2946],{},[108,2938,2939],{},[20,2940,2941],{},"계약·서류 R2 업로드 + DB",[108,2943,1330],{},[108,2945,1330],{},[108,2947,2948,2949,2951],{},"§11 — ",[69,2950,315],{}," 5 라우트 + FILES R2 bucket",[88,2953,2954,2959,2961,2963],{},[108,2955,2956],{},[20,2957,2958],{},"이용계약 자동 'initial' 생성",[108,2960,1330],{},[108,2962,1495],{},[108,2964,2965],{},"signup auto-create (§11) + lazy backfill (§13)",[88,2967,2968,2973,2975,2977],{},[108,2969,2970],{},[20,2971,2972],{},"계약 서명 다이얼로그 휴대폰 본인인증",[108,2974,1330],{},[108,2976,1330],{},[108,2978,2979,2980,2982],{},"§15 — ",[69,2981,1429],{}," purpose + 공인인증서 탭 제거",[88,2984,2985,2990,2992,2994],{},[108,2986,2987],{},[20,2988,2989],{},"사업자등록증 행 상태 배지 + 반려 시 삭제",[108,2991,1330],{},[108,2993,1330],{},[108,2995,2996],{},"§14",[88,2998,2999,3002,3005,3008],{},[108,3000,3001],{},"로그아웃",[108,3003,3004],{},"클라이언트 쿠키 삭제",[108,3006,3007],{},"⚪ GNB 미연동",[108,3009,3010],{},"30분 작업",[88,3012,3013,3016,3018,3020],{},[108,3014,3015],{},"비밀번호 재설정",[108,3017,212],{},[108,3019,212],{},[108,3021,3022],{},"OTP 인프라 재활용 — 다음 작업 후보",[88,3024,3025,3027,3029,3031],{},[108,3026,332],{},[108,3028,212],{},[108,3030,212],{},[108,3032],{},[88,3034,3035,3038,3040,3042],{},[108,3036,3037],{},"보안로그인 (2FA)",[108,3039,212],{},[108,3041,212],{},[108,3043,3044],{},"OTP 인프라 재활용",[88,3046,3047,3050,3052,3055],{},[108,3048,3049],{},"약관 동의 적재",[108,3051,212],{},[108,3053,3054],{},"화면용 토스트",[108,3056,3057],{},[69,3058,2166],{},[88,3060,3061,3064,3066,3069],{},[108,3062,3063],{},"이메일 변경 (OTP)",[108,3065,212],{},[108,3067,3068],{},"다이얼로그만",[108,3070,3071],{},[69,3072,3073],{},"POST \u002Fme\u002Femail-change\u002F*",[88,3075,3076,3078,3080,3083],{},[108,3077,598],{},[108,3079,212],{},[108,3081,3082],{},"화면 더미",[108,3084,3085],{},[69,3086,380],{},[88,3088,3089,3092,3094,3097],{},[108,3090,3091],{},"회원 탈퇴",[108,3093,212],{},[108,3095,3096],{},"\"곧 지원\" 안내",[108,3098,3099],{},[69,3100,3101],{},"DELETE \u002Fme",[88,3103,3104,3107,3109,3111],{},[108,3105,3106],{},"운영자단 승인 화면",[108,3108,212],{},[108,3110,212],{},[108,3112,3113,3114],{},"운영자단 화면 전체 미개발 — ",[20,3115,3116],{},"P0 1순위",[88,3118,3119,3122,3125,3127],{},[108,3120,3121],{},"실 메일 발송 (NHN)",[108,3123,3124],{},"mock",[108,3126,1495],{},[108,3128,3129],{},"NHN Notification Hub 자격증명 + 어댑터 재작성 (§16)",[88,3131,3132,3135,3137,3139],{},[108,3133,3134],{},"실 SMS 발송 (NHN)",[108,3136,3124],{},[108,3138,1495],{},[108,3140,3141],{},"동일",[88,3143,3144,3147,3149,3151],{},[108,3145,3146],{},"실 NICE 호출",[108,3148,3124],{},[108,3150,1495],{},[108,3152,3153],{},"NICE 콘솔 IP 정책 해결 + secret 보관 중 (§16)",[61,3155],{},[64,3157,3159],{"id":3158},"_9-알려진-한계-다음-작업","9. 알려진 한계 \u002F 다음 작업",[74,3161,3163],{"id":3162},"p0-인증-폐쇄-루프","P0 — 인증 폐쇄 루프",[947,3165,3166,3184,3190,3199,3208],{},[950,3167,3168,3171,3172,3175,3176,3179,3180,3183],{},[20,3169,3170],{},"운영자단 사업자 승인 화면"," (P0 1순위) — 현재 라이브 DB 직접 UPDATE로만 처리. ",[69,3173,3174],{},"\u002Fadmin\u002Fcompanies\u002F:id\u002F{approve,reject}"," 라우트 + UI. 승인 시 ",[69,3177,3178],{},"reviewing → approved",", 반려 시 ",[69,3181,3182],{},"reviewing → rejected + rejected_reason",". WBS 5-4-3.",[950,3185,3186,3189],{},[20,3187,3188],{},"NHN Notification Hub 자격증명 + 어댑터 재작성"," — User Access Key 수령 시 어댑터 OAuth\u002FBearer로 교체 + e2e (§16).",[950,3191,3192,1041,3195,3198],{},[20,3193,3194],{},"로그아웃 GNB 실 액션",[69,3196,3197],{},"useAuthStore().logout()"," 연결 (30분).",[950,3200,3201,3203,3204,3207],{},[20,3202,3015],{}," — OTP 인프라 재활용, ",[69,3205,3206],{},"purpose='reset_password'"," (2~3시간).",[950,3209,3210,3216,3217,3219],{},[3211,3212,3213],"del",{},[20,3214,3215],{},"계약·서류 업로드 라우트 + R2"," — ✅ §11에서 완료. ",[69,3218,315],{}," 5 라우트 + R2 bucket + 사용자단 연동.",[74,3221,3223],{"id":3222},"p1-정책-통합","P1 — 정책 통합",[947,3225,3227,3236,3246,3252,3258,3264],{"start":3226},5,[950,3228,3229,1041,3231,2446,3233,3235],{},[20,3230,3049],{},[69,3232,2156],{},[69,3234,2166],{}," 라우트 + signup 통합",[950,3237,3238,1041,3241,993,3243,3245],{},[20,3239,3240],{},"개인 유형 LNB\u002F메뉴 분기",[69,3242,366],{},[69,3244,294],{}," 등 사업자 전용 메뉴 숨김",[950,3247,3248,3251],{},[20,3249,3250],{},"사업자등록번호 체크섬"," — 프런트 검증",[950,3253,3254,3257],{},[20,3255,3256],{},"승인 완료 자동 알림"," — 이메일·SMS trigger",[950,3259,3260,3263],{},[20,3261,3262],{},"GNB 메뉴 항목 disabled (미승인)"," — 시각적으로 비활성화 (현재는 미들웨어 리다이렉트만)",[950,3265,3266,3269],{},[20,3267,3268],{},"승인 완료 후 자동 새로고침"," — WebSocket 또는 폴링",[74,3271,3273],{"id":3272},"p2-계정-관리","P2 — 계정 관리",[947,3275,3277,3286,3294,3303,3312],{"start":3276},11,[950,3278,3279,3285],{},[20,3280,3281,2446,3283],{},[69,3282,337],{},[69,3284,323],{}," — 비밀번호 변경",[950,3287,3288,1041,3291],{},[20,3289,3290],{},"이메일 변경 OTP",[69,3292,3293],{},"POST \u002Fme\u002Femail-change\u002F{request,confirm}",[950,3295,3296,3302],{},[20,3297,3298,2446,3300],{},[69,3299,359],{},[69,3301,345],{}," — 2FA",[950,3304,3305,3311],{},[20,3306,3307,2446,3309],{},[69,3308,380],{},[69,3310,366],{}," — 서비스 담당자 초대",[950,3313,3314,3319],{},[20,3315,3316,3318],{},[69,3317,3101],{}," (회원 탈퇴)"," — soft-delete + 데이터 정책",[74,3321,3323],{"id":3322},"p3-외부-의존","P3 — 외부 의존",[947,3325,3327,3336,3342],{"start":3326},16,[950,3328,3329,1041,3332,3335],{},[20,3330,3331],{},"NICE 통합인증 계약 + Outbound IP 협상",[29,3333,3334],{"href":41},".\u002FNICE_AUTH.md §9·§10"," 참조",[950,3337,3338,3341],{},[20,3339,3340],{},"NHN 이메일 자격증명 등록"," — 실 메일 발송 활성화",[950,3343,3344,3347],{},[20,3345,3346],{},"NHN SMS 자격증명 등록"," — 비밀번호 재설정·휴대폰 변경 OTP 실 발송",[74,3349,3351],{"id":3350},"위생적-작업","위생적 작업",[947,3353,3355,3377,3383],{"start":3354},19,[950,3356,3357,1041,3362,993,3364,993,3366,993,3368,993,3370,990,3372,993,3374,3376],{},[20,3358,3359,3361],{},[69,3360,1980],{},"에 누락된 회원·인증 테이블 정의",[69,3363,2091],{},[69,3365,2156],{},[69,3367,2166],{},[69,3369,2121],{},[69,3371,234],{},[69,3373,2199],{},[69,3375,2217],{},"은 §11에서 추가 완료)",[950,3378,3379,3382],{},[20,3380,3381],{},"운영 절차 다중화"," — Aurora SG 접근 다중화 (Cloudflare Tunnel·RDS Proxy 등)",[950,3384,3385,3388],{},[20,3386,3387],{},"NICE secret 회전"," (§16.1) — IP 정책 해결 시점에 CLIENT_SECRET 회전 권장 (오늘 채팅에 평문 노출)",{"title":3390,"searchDepth":3391,"depth":3391,"links":3392},"",3,[3393,3404,3411,3413,3428,3435,3447,3448,3449],{"id":66,"depth":3394,"text":3395,"children":3396},2,"1. 사용자단 페이지 (malgn-noti)",[3397,3399,3401,3402,3403],{"id":76,"depth":3391,"text":3398},"1.1 가입·로그인·재설정 (인증 게이트 — meta.auth: false)",{"id":238,"depth":3391,"text":3400},"1.2 계정 관리 (\u002Faccount\u002F*, 인증 필요)",{"id":499,"depth":3391,"text":500},{"id":624,"depth":3391,"text":625},{"id":773,"depth":3391,"text":774},{"id":823,"depth":3394,"text":824,"children":3405},[3406,3408,3409,3410],{"id":832,"depth":3391,"text":3407},"2.1 승인 상태 (approval_state) — 4단계 (§7·§12)",{"id":944,"depth":3391,"text":945},{"id":1034,"depth":3391,"text":1035},{"id":1087,"depth":3391,"text":1088},{"id":1167,"depth":3394,"text":3412},"3. 운영자단 페이지 (malgn-noti-admin, 기획 MD만 존재)",{"id":1276,"depth":3394,"text":3414,"children":3415},"4. API 엔드포인트 (malgn-noti-api)",[3416,3418,3420,3422,3423,3425,3426],{"id":1283,"depth":3391,"text":3417},"4.1 인증 (src\u002Froutes\u002Fauth.ts)",{"id":1568,"depth":3391,"text":3419},"4.2 현재 사용자 (src\u002Froutes\u002Fme.ts)",{"id":1662,"depth":3391,"text":3421},"4.3 승인 게이트 미들웨어 (src\u002Fmiddleware\u002Fapproval.ts)",{"id":1740,"depth":3391,"text":1741},{"id":1771,"depth":3391,"text":3424},"4.5 계약·서류 (src\u002Froutes\u002Fcontracts.ts, §11)",{"id":1871,"depth":3391,"text":1872},{"id":1906,"depth":3391,"text":3427},"4.7 운영자단 (미구현, \u002Fadmin\u002F*)",{"id":1960,"depth":3394,"text":1961,"children":3429},[3430,3431,3432,3433,3434],{"id":1964,"depth":3391,"text":1965},{"id":2101,"depth":3391,"text":2102},{"id":2136,"depth":3391,"text":2137},{"id":2175,"depth":3391,"text":2176},{"id":2252,"depth":3391,"text":2253},{"id":2302,"depth":3394,"text":2303,"children":3436},[3437,3439,3440,3441,3442,3443,3444,3445,3446],{"id":2320,"depth":3391,"text":3438},"6.1 회원 유형 (company_type)",{"id":2340,"depth":3391,"text":2341},{"id":2363,"depth":3391,"text":2364},{"id":2455,"depth":3391,"text":2456},{"id":2469,"depth":3391,"text":2470},{"id":2479,"depth":3391,"text":2480},{"id":2489,"depth":3391,"text":2490},{"id":2551,"depth":3391,"text":2552},{"id":2612,"depth":3391,"text":2613},{"id":2629,"depth":3394,"text":2630},{"id":2791,"depth":3394,"text":2792},{"id":3158,"depth":3394,"text":3159,"children":3450},[3451,3452,3453,3454,3455],{"id":3162,"depth":3391,"text":3163},{"id":3222,"depth":3391,"text":3223},{"id":3272,"depth":3391,"text":3273},{"id":3322,"depth":3391,"text":3323},{"id":3350,"depth":3391,"text":3351},"md",{},true,"\u002Fmembership",{"title":5,"description":3390},"MEMBERSHIP","7MnerjMJknj9nVhY0a2G8bUqYiVTNdN5XSgcW7nY8l8",1780638909350]