cloudflare
tcp/443 tcp/80 tcp/8443
Open service 2606:4700:3032::ac43:c960:80 · experiment.ppoms.cloud
2026-01-08 09:56
HTTP/1.1 301 Moved Permanently
Date: Thu, 08 Jan 2026 09:56:59 GMT
Content-Length: 0
Connection: close
Location: https://experiment.ppoms.cloud/
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=9eA8E0fP1p5oLoyUXhbABN6xXnSJG6mXbRJ1E1%2FyFk4jfgdUirEXjsWDc3DwuB%2Bvcy8bk%2F5woTMY0VKGQI2qyATRNl1Ci%2Bt8g0EnsTWTn5ury9BoehlAKnlD%2BaVZM0Wg"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
Server-Timing: cfCacheStatus;desc="DYNAMIC"
Server-Timing: cfEdge;dur=23,cfOrigin;dur=10
cf-cache-status: DYNAMIC
CF-RAY: 9baad3fd2d2067a3-SJC
alt-svc: h3=":443"; ma=86400
Open service 2606:4700:3034::6815:24f2:8443 · experiment.ppoms.cloud
2026-01-08 09:56
HTTP/1.1 200 OK
Date: Thu, 08 Jan 2026 09:56:59 GMT
Content-Type: text/html;charset=UTF-8
Transfer-Encoding: chunked
Connection: close
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=0fenRnCw0UGP1UI7lWv67XFci7Wli3i1Odmy4xsjop0%2BSYbbXZFcYnREnxGZPdD8qcMJRINvEwiSz2oTDYmdeG3CArzwYM3kzXbYLLHciZ7s%2Byhjijui24ttjJd7tF%2Bp"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
Server-Timing: cfCacheStatus;desc="DYNAMIC"
Server-Timing: cfEdge;dur=11,cfOrigin;dur=20
cf-cache-status: DYNAMIC
CF-RAY: 9baad3fd3bce0c88-EWR
alt-svc: h3=":8443"; ma=86400
Page title: Admin Login
<!DOCTYPE html>
<html>
<head>
<title>Admin Login</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
body { font-family: sans-serif; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background: #f0f2f5; }
.card { background: white; padding: 2rem; border-radius: 12px; box-shadow: 0 8px 20px rgba(0,0,0,0.1); width: 100%; max-width: 320px; text-align: center; }
input { width: 100%; padding: 12px; margin: 8px 0; border: 1px solid #ddd; border-radius: 6px; box-sizing: border-box; }
button { width: 100%; padding: 12px; background: #1a73e8; color: white; border: none; border-radius: 6px; cursor: pointer; font-weight: bold; }
</style>
</head>
<body>
<div class="card">
<h2>Admin Login</h2>
<input type="text" id="id" placeholder="ID">
<input type="password" id="pw" placeholder="Password">
<button onclick="login()">Login</button>
</div>
<script>
async function login() {
const id = document.getElementById('id').value;
const pw = document.getElementById('pw').value;
const res = await fetch('/api/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ id, pw })
});
if (res.ok) location.reload(); else alert('로그인 실패');
}
</script>
<script defer src="https://static.cloudflareinsights.com/beacon.min.js/vcd15cbe7772f49c399c6a5babf22c1241717689176015" integrity="sha512-ZpsOmlRQV6y907TI0dKBHq9Md29nnaEIPlkf84rnaERnq6zvWvPUqr2ft8M1aS28oN72PdrCzSjY4U6VaAw1EQ==" data-cf-beacon='{"version":"2024.11.0","token":"fac143926e694e649e7c62bd372e46e3","r":1,"server_timing":{"name":{"cfCacheStatus":true,"cfEdge":true,"cfExtPri":true,"cfL4":true,"cfOrigin":true,"cfSpeedBrain":true},"location_startswith":null}}' crossorigin="anonymous"></script>
</body>
</html>
Open service 2606:4700:3032::ac43:c960:443 · experiment.ppoms.cloud
2026-01-08 09:56
HTTP/1.1 200 OK
Date: Thu, 08 Jan 2026 09:56:59 GMT
Content-Type: text/html;charset=UTF-8
Transfer-Encoding: chunked
Connection: close
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=faeTFK00zLni5no6x%2F3SGyXTUSsz0K96VCHmDZ7xgCirngEqO4vGon1MqOVWP%2FtSaM40Fpgj4mtJMXjDX7k8X32Vmu1xLlpV2KXaavTUEhLZKHbGCjCWv9L8t928jD7S"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
Server-Timing: cfCacheStatus;desc="DYNAMIC"
Server-Timing: cfEdge;dur=13,cfOrigin;dur=14
cf-cache-status: DYNAMIC
CF-RAY: 9baad3fd4d300f4b-EWR
alt-svc: h3=":443"; ma=86400
Page title: Admin Login
<!DOCTYPE html>
<html>
<head>
<title>Admin Login</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
body { font-family: sans-serif; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background: #f0f2f5; }
.card { background: white; padding: 2rem; border-radius: 12px; box-shadow: 0 8px 20px rgba(0,0,0,0.1); width: 100%; max-width: 320px; text-align: center; }
input { width: 100%; padding: 12px; margin: 8px 0; border: 1px solid #ddd; border-radius: 6px; box-sizing: border-box; }
button { width: 100%; padding: 12px; background: #1a73e8; color: white; border: none; border-radius: 6px; cursor: pointer; font-weight: bold; }
</style>
</head>
<body>
<div class="card">
<h2>Admin Login</h2>
<input type="text" id="id" placeholder="ID">
<input type="password" id="pw" placeholder="Password">
<button onclick="login()">Login</button>
</div>
<script>
async function login() {
const id = document.getElementById('id').value;
const pw = document.getElementById('pw').value;
const res = await fetch('/api/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ id, pw })
});
if (res.ok) location.reload(); else alert('로그인 실패');
}
</script>
<script defer src="https://static.cloudflareinsights.com/beacon.min.js/vcd15cbe7772f49c399c6a5babf22c1241717689176015" integrity="sha512-ZpsOmlRQV6y907TI0dKBHq9Md29nnaEIPlkf84rnaERnq6zvWvPUqr2ft8M1aS28oN72PdrCzSjY4U6VaAw1EQ==" data-cf-beacon='{"version":"2024.11.0","token":"fac143926e694e649e7c62bd372e46e3","r":1,"server_timing":{"name":{"cfCacheStatus":true,"cfEdge":true,"cfExtPri":true,"cfL4":true,"cfOrigin":true,"cfSpeedBrain":true},"location_startswith":null}}' crossorigin="anonymous"></script>
</body>
</html>
Open service 2606:4700:3034::6815:24f2:443 · experiment.ppoms.cloud
2026-01-08 09:56
HTTP/1.1 200 OK
Date: Thu, 08 Jan 2026 09:56:59 GMT
Content-Type: text/html;charset=UTF-8
Transfer-Encoding: chunked
Connection: close
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=9mO5qiUCxthz2WEedOgPSctZOdqPMFuMLb4VMxCHRohOcQVLSdWH1kACb2LG7tisb0F0YZf71hd%2FQ8F31Sa5sxh9eyXcNc5tXy8jvaQlfLsVfNRK633gxOUVrNzmwj7HMAA%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
Server-Timing: cfCacheStatus;desc="DYNAMIC"
Server-Timing: cfEdge;dur=16,cfOrigin;dur=24
cf-cache-status: DYNAMIC
CF-RAY: 9baad3fd1922ce3d-SIN
alt-svc: h3=":443"; ma=86400
Page title: Admin Login
<!DOCTYPE html>
<html>
<head>
<title>Admin Login</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
body { font-family: sans-serif; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background: #f0f2f5; }
.card { background: white; padding: 2rem; border-radius: 12px; box-shadow: 0 8px 20px rgba(0,0,0,0.1); width: 100%; max-width: 320px; text-align: center; }
input { width: 100%; padding: 12px; margin: 8px 0; border: 1px solid #ddd; border-radius: 6px; box-sizing: border-box; }
button { width: 100%; padding: 12px; background: #1a73e8; color: white; border: none; border-radius: 6px; cursor: pointer; font-weight: bold; }
</style>
</head>
<body>
<div class="card">
<h2>Admin Login</h2>
<input type="text" id="id" placeholder="ID">
<input type="password" id="pw" placeholder="Password">
<button onclick="login()">Login</button>
</div>
<script>
async function login() {
const id = document.getElementById('id').value;
const pw = document.getElementById('pw').value;
const res = await fetch('/api/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ id, pw })
});
if (res.ok) location.reload(); else alert('로그인 실패');
}
</script>
<script defer src="https://static.cloudflareinsights.com/beacon.min.js/vcd15cbe7772f49c399c6a5babf22c1241717689176015" integrity="sha512-ZpsOmlRQV6y907TI0dKBHq9Md29nnaEIPlkf84rnaERnq6zvWvPUqr2ft8M1aS28oN72PdrCzSjY4U6VaAw1EQ==" data-cf-beacon='{"version":"2024.11.0","token":"fac143926e694e649e7c62bd372e46e3","r":1,"server_timing":{"name":{"cfCacheStatus":true,"cfEdge":true,"cfExtPri":true,"cfL4":true,"cfOrigin":true,"cfSpeedBrain":true},"location_startswith":null}}' crossorigin="anonymous"></script>
</body>
</html>
Open service 104.21.36.242:8443 · experiment.ppoms.cloud
2026-01-08 09:56
HTTP/1.1 200 OK
Date: Thu, 08 Jan 2026 09:56:59 GMT
Content-Type: text/html;charset=UTF-8
Transfer-Encoding: chunked
Connection: close
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=kILeKrB94smgPZHoV%2BXvdhV13YrnyX1%2FPP23oODdVgnnBr78UyOUqZjsnlYGXeXk09rbezT3tVoyvC89gSFB9qz69WS7Z46JBosYYN3kD8vSCeUWB%2F8%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
cf-cache-status: DYNAMIC
CF-RAY: 9baad3fcbb489134-FRA
alt-svc: h3=":8443"; ma=86400
Page title: Admin Login
<!DOCTYPE html>
<html>
<head>
<title>Admin Login</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
body { font-family: sans-serif; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background: #f0f2f5; }
.card { background: white; padding: 2rem; border-radius: 12px; box-shadow: 0 8px 20px rgba(0,0,0,0.1); width: 100%; max-width: 320px; text-align: center; }
input { width: 100%; padding: 12px; margin: 8px 0; border: 1px solid #ddd; border-radius: 6px; box-sizing: border-box; }
button { width: 100%; padding: 12px; background: #1a73e8; color: white; border: none; border-radius: 6px; cursor: pointer; font-weight: bold; }
</style>
</head>
<body>
<div class="card">
<h2>Admin Login</h2>
<input type="text" id="id" placeholder="ID">
<input type="password" id="pw" placeholder="Password">
<button onclick="login()">Login</button>
</div>
<script>
async function login() {
const id = document.getElementById('id').value;
const pw = document.getElementById('pw').value;
const res = await fetch('/api/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ id, pw })
});
if (res.ok) location.reload(); else alert('로그인 실패');
}
</script>
</body>
</html>
Open service 2606:4700:3034::6815:24f2:80 · experiment.ppoms.cloud
2026-01-08 09:56
HTTP/1.1 301 Moved Permanently
Date: Thu, 08 Jan 2026 09:56:58 GMT
Content-Length: 0
Connection: close
Location: https://experiment.ppoms.cloud/
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=vMD%2FlTFvf2c8HT8MLsN9t9jf3qwY8nJi6RvGHXf72VPRNEtG2jfjd2%2FWPdaONEnAKQVw8exQ4cbTbz5A8huGfXpFNpN0m8HVyQ2NmxyhHq8BIBelP4xAhtLNudHRYLCnVZ8%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
cf-cache-status: DYNAMIC
CF-RAY: 9baad3fc88ce6405-LHR
alt-svc: h3=":443"; ma=86400
Open service 2606:4700:3032::ac43:c960:8443 · experiment.ppoms.cloud
2026-01-08 09:56
HTTP/1.1 200 OK
Date: Thu, 08 Jan 2026 09:56:58 GMT
Content-Type: text/html;charset=UTF-8
Transfer-Encoding: chunked
Connection: close
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=ZWlEBOEowP5Hh7DTxRf0W%2FQGA7SbZKmcmg3uxHvtYWMV%2BE0w6pzLGgdt2KyPzRGFeeu5wH22aZpDiVZ3lrWBlUGiZ1qjNbCd8Zu9k4C9q%2BHxmgXnsCGQlyiRO1O1%2B%2FAt"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
cf-cache-status: DYNAMIC
CF-RAY: 9baad3fc4c13ef44-LHR
alt-svc: h3=":8443"; ma=86400
Page title: Admin Login
<!DOCTYPE html>
<html>
<head>
<title>Admin Login</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
body { font-family: sans-serif; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background: #f0f2f5; }
.card { background: white; padding: 2rem; border-radius: 12px; box-shadow: 0 8px 20px rgba(0,0,0,0.1); width: 100%; max-width: 320px; text-align: center; }
input { width: 100%; padding: 12px; margin: 8px 0; border: 1px solid #ddd; border-radius: 6px; box-sizing: border-box; }
button { width: 100%; padding: 12px; background: #1a73e8; color: white; border: none; border-radius: 6px; cursor: pointer; font-weight: bold; }
</style>
</head>
<body>
<div class="card">
<h2>Admin Login</h2>
<input type="text" id="id" placeholder="ID">
<input type="password" id="pw" placeholder="Password">
<button onclick="login()">Login</button>
</div>
<script>
async function login() {
const id = document.getElementById('id').value;
const pw = document.getElementById('pw').value;
const res = await fetch('/api/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ id, pw })
});
if (res.ok) location.reload(); else alert('로그인 실패');
}
</script>
</body>
</html>
Open service 104.21.36.242:80 · experiment.ppoms.cloud
2026-01-08 09:56
HTTP/1.1 301 Moved Permanently
Date: Thu, 08 Jan 2026 09:56:58 GMT
Content-Length: 0
Connection: close
Location: https://experiment.ppoms.cloud/
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=OxX2CzvZ5MQ1KrtRB4GQS1UNw5p2zSbA2mU3LxjNZ47QtxvOtEVQlPAGVkjU3E%2F2zdPRjZTXVUaiEwFKxH38PowsXWsn5FDQSycFsvw%2F%2BbXKs8LVtfY%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
cf-cache-status: DYNAMIC
CF-RAY: 9baad3fc1b52dcb5-FRA
alt-svc: h3=":443"; ma=86400
Open service 172.67.201.96:8443 · experiment.ppoms.cloud
2026-01-08 09:56
HTTP/1.1 200 OK
Date: Thu, 08 Jan 2026 09:56:58 GMT
Content-Type: text/html;charset=UTF-8
Transfer-Encoding: chunked
Connection: close
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=POz4AtJoF0uwgkd%2BOvpez2h5l%2FOdjgUeUDAmQaG29u3%2Bp%2BonPLV%2Ba5cXuFpafQRjmehN%2BltBoCRqz5ySBiB6OeIBYGRbiuiC1T7LR%2F%2FK0S6hJ%2FADvF4%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
cf-cache-status: DYNAMIC
CF-RAY: 9baad3fc287e66db-AMS
alt-svc: h3=":8443"; ma=86400
Page title: Admin Login
<!DOCTYPE html>
<html>
<head>
<title>Admin Login</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
body { font-family: sans-serif; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background: #f0f2f5; }
.card { background: white; padding: 2rem; border-radius: 12px; box-shadow: 0 8px 20px rgba(0,0,0,0.1); width: 100%; max-width: 320px; text-align: center; }
input { width: 100%; padding: 12px; margin: 8px 0; border: 1px solid #ddd; border-radius: 6px; box-sizing: border-box; }
button { width: 100%; padding: 12px; background: #1a73e8; color: white; border: none; border-radius: 6px; cursor: pointer; font-weight: bold; }
</style>
</head>
<body>
<div class="card">
<h2>Admin Login</h2>
<input type="text" id="id" placeholder="ID">
<input type="password" id="pw" placeholder="Password">
<button onclick="login()">Login</button>
</div>
<script>
async function login() {
const id = document.getElementById('id').value;
const pw = document.getElementById('pw').value;
const res = await fetch('/api/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ id, pw })
});
if (res.ok) location.reload(); else alert('로그인 실패');
}
</script>
</body>
</html>
Open service 172.67.201.96:80 · experiment.ppoms.cloud
2026-01-08 09:56
HTTP/1.1 301 Moved Permanently
Date: Thu, 08 Jan 2026 09:56:58 GMT
Content-Length: 0
Connection: close
Location: https://experiment.ppoms.cloud/
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=4jN%2FV4MS5GDe57%2B%2Fqn2Gd6fXDRxbyBoXMmG%2F%2FGKrQ2h1TohfuAof9X8pYxPPD1j8V%2BMofESy8iJVgfhRCoa1T1bDxrAHwAztIb%2BwwBHq3FSJGGoxeGY%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
cf-cache-status: DYNAMIC
CF-RAY: 9baad3fbfa0a6627-AMS
alt-svc: h3=":443"; ma=86400
Open service 104.21.36.242:443 · experiment.ppoms.cloud
2026-01-08 09:56
HTTP/1.1 200 OK
Date: Thu, 08 Jan 2026 09:56:58 GMT
Content-Type: text/html;charset=UTF-8
Transfer-Encoding: chunked
Connection: close
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=GBQ4CI%2BiJ1klf6UySOACPa81xOucMGZ3piVaGtrgVCNSXm9hfdGGydZtqA3x4Zt97meej2jXjeM6rA1Zv6ll9Dz6%2FP%2F9ridzt2i70FuQ84vxUKAjSBU%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
cf-cache-status: DYNAMIC
CF-RAY: 9baad3fc0a85e85e-FRA
alt-svc: h3=":443"; ma=86400
Page title: Admin Login
<!DOCTYPE html>
<html>
<head>
<title>Admin Login</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
body { font-family: sans-serif; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background: #f0f2f5; }
.card { background: white; padding: 2rem; border-radius: 12px; box-shadow: 0 8px 20px rgba(0,0,0,0.1); width: 100%; max-width: 320px; text-align: center; }
input { width: 100%; padding: 12px; margin: 8px 0; border: 1px solid #ddd; border-radius: 6px; box-sizing: border-box; }
button { width: 100%; padding: 12px; background: #1a73e8; color: white; border: none; border-radius: 6px; cursor: pointer; font-weight: bold; }
</style>
</head>
<body>
<div class="card">
<h2>Admin Login</h2>
<input type="text" id="id" placeholder="ID">
<input type="password" id="pw" placeholder="Password">
<button onclick="login()">Login</button>
</div>
<script>
async function login() {
const id = document.getElementById('id').value;
const pw = document.getElementById('pw').value;
const res = await fetch('/api/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ id, pw })
});
if (res.ok) location.reload(); else alert('로그인 실패');
}
</script>
</body>
</html>
Open service 172.67.201.96:443 · experiment.ppoms.cloud
2026-01-08 09:56
HTTP/1.1 200 OK
Date: Thu, 08 Jan 2026 09:56:58 GMT
Content-Type: text/html;charset=UTF-8
Transfer-Encoding: chunked
Connection: close
Vary: accept-encoding
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=gtKCzcrGIoc9yeuQqLdpgmpZdSIM6lt4w6AqLoDqd4qbIJYJ4hyVxpNTxPHIb14%2B5HSuhmxTG3UBuu78nq4dOQJ35yN%2BI6cTGLxwxi7VmNND%2BcztI%2FA%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server: cloudflare
cf-cache-status: DYNAMIC
CF-RAY: 9baad3fc1dbbdc98-FRA
alt-svc: h3=":443"; ma=86400
Page title: Admin Login
<!DOCTYPE html>
<html>
<head>
<title>Admin Login</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
body { font-family: sans-serif; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background: #f0f2f5; }
.card { background: white; padding: 2rem; border-radius: 12px; box-shadow: 0 8px 20px rgba(0,0,0,0.1); width: 100%; max-width: 320px; text-align: center; }
input { width: 100%; padding: 12px; margin: 8px 0; border: 1px solid #ddd; border-radius: 6px; box-sizing: border-box; }
button { width: 100%; padding: 12px; background: #1a73e8; color: white; border: none; border-radius: 6px; cursor: pointer; font-weight: bold; }
</style>
</head>
<body>
<div class="card">
<h2>Admin Login</h2>
<input type="text" id="id" placeholder="ID">
<input type="password" id="pw" placeholder="Password">
<button onclick="login()">Login</button>
</div>
<script>
async function login() {
const id = document.getElementById('id').value;
const pw = document.getElementById('pw').value;
const res = await fetch('/api/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ id, pw })
});
if (res.ok) location.reload(); else alert('로그인 실패');
}
</script>
</body>
</html>