diff --git a/README.md b/README.md
index 869f96b..ace9a80 100644
--- a/README.md
+++ b/README.md
@@ -43,6 +43,8 @@ The backend now uses an auth-first request model. Users register into a tenant,
Protected document and question APIs require `Authorization: Bearer $ACCESS_TOKEN`. Auth state is backed by Prisma-managed PostgreSQL tables for user sessions, refresh tokens, verification tokens, password reset tokens, and audit events.
+The web application uses server-side Next.js routes for browser authentication. Access and refresh tokens are stored in `httpOnly` cookies, not in browser JavaScript. Public privacy, terms, cookie, and security pages are available from the footer and consent menu.
+
Implemented auth flows:
| Flow | Endpoint |
diff --git a/apps/web/app/api/web/auth/email/verify/route.ts b/apps/web/app/api/web/auth/email/verify/route.ts
new file mode 100644
index 0000000..e4e76aa
--- /dev/null
+++ b/apps/web/app/api/web/auth/email/verify/route.ts
@@ -0,0 +1,10 @@
+import { NextRequest } from "next/server";
+import { proxyPublic } from "@/lib/server-gateway";
+
+export async function POST(request: NextRequest) {
+ return proxyPublic({
+ method: "POST",
+ path: "/api/auth/email/verify",
+ body: await request.json()
+ });
+}
diff --git a/apps/web/app/api/web/auth/login/route.ts b/apps/web/app/api/web/auth/login/route.ts
new file mode 100644
index 0000000..77d3726
--- /dev/null
+++ b/apps/web/app/api/web/auth/login/route.ts
@@ -0,0 +1,6 @@
+import { NextRequest } from "next/server";
+import { loginThroughGateway } from "@/lib/server-gateway";
+
+export async function POST(request: NextRequest) {
+ return loginThroughGateway(await request.json());
+}
diff --git a/apps/web/app/api/web/auth/logout/route.ts b/apps/web/app/api/web/auth/logout/route.ts
new file mode 100644
index 0000000..cdbf659
--- /dev/null
+++ b/apps/web/app/api/web/auth/logout/route.ts
@@ -0,0 +1,5 @@
+import { logoutThroughGateway } from "@/lib/server-gateway";
+
+export async function POST() {
+ return logoutThroughGateway();
+}
diff --git a/apps/web/app/api/web/auth/me/route.ts b/apps/web/app/api/web/auth/me/route.ts
new file mode 100644
index 0000000..da0a641
--- /dev/null
+++ b/apps/web/app/api/web/auth/me/route.ts
@@ -0,0 +1,8 @@
+import { proxyPrivate } from "@/lib/server-gateway";
+
+export async function GET() {
+ return proxyPrivate({
+ method: "GET",
+ path: "/api/auth/me"
+ });
+}
diff --git a/apps/web/app/api/web/auth/register/route.ts b/apps/web/app/api/web/auth/register/route.ts
new file mode 100644
index 0000000..e5ac93f
--- /dev/null
+++ b/apps/web/app/api/web/auth/register/route.ts
@@ -0,0 +1,10 @@
+import { NextRequest } from "next/server";
+import { proxyPublic } from "@/lib/server-gateway";
+
+export async function POST(request: NextRequest) {
+ return proxyPublic({
+ method: "POST",
+ path: "/api/auth/register",
+ body: await request.json()
+ });
+}
diff --git a/apps/web/app/api/web/documents/route.ts b/apps/web/app/api/web/documents/route.ts
new file mode 100644
index 0000000..543f534
--- /dev/null
+++ b/apps/web/app/api/web/documents/route.ts
@@ -0,0 +1,17 @@
+import { NextRequest } from "next/server";
+import { proxyPrivate } from "@/lib/server-gateway";
+
+export async function GET() {
+ return proxyPrivate({
+ method: "GET",
+ path: "/api/documents"
+ });
+}
+
+export async function POST(request: NextRequest) {
+ return proxyPrivate({
+ method: "POST",
+ path: "/api/documents",
+ body: await request.json()
+ });
+}
diff --git a/apps/web/app/api/web/questions/route.ts b/apps/web/app/api/web/questions/route.ts
new file mode 100644
index 0000000..989cafb
--- /dev/null
+++ b/apps/web/app/api/web/questions/route.ts
@@ -0,0 +1,10 @@
+import { NextRequest } from "next/server";
+import { proxyPrivate } from "@/lib/server-gateway";
+
+export async function POST(request: NextRequest) {
+ return proxyPrivate({
+ method: "POST",
+ path: "/api/questions",
+ body: await request.json()
+ });
+}
diff --git a/apps/web/app/cookies/page.tsx b/apps/web/app/cookies/page.tsx
new file mode 100644
index 0000000..def0381
--- /dev/null
+++ b/apps/web/app/cookies/page.tsx
@@ -0,0 +1,33 @@
+import { LegalPage } from "@/components/LegalPage";
+
+export default function CookiesPage() {
+ return (
+