-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmiddleware.ts
More file actions
66 lines (54 loc) · 2.16 KB
/
Copy pathmiddleware.ts
File metadata and controls
66 lines (54 loc) · 2.16 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import { NextResponse, NextRequest } from "next/server";
import { getUserFromCookieEdge } from "@/utils/auth";
// 인증 페이지 — 이미 로그인된 유저는 게임으로 리다이렉트
const AUTH_REDIRECT_PATHS = new Set<string>([
"/",
"/signin",
"/signup",
"/findid",
"/findpw",
]);
// 누구나 접근 가능한 정적 정보 페이지 (로그인 여부와 무관)
const OPEN_PATHS = new Set<string>([
"/terms",
"/privacy",
"/splash", // PWA 진입용 splash — 인증 상태와 무관하게 통과 (자체적으로 다음 경로 결정)
]);
// 차단 경로 (사용 중단된 페이지)
const BLOCKED_PATHS = new Set<string>([
"/beginning",
]);
export async function middleware(request: NextRequest) {
const { pathname } = request.nextUrl;
// 차단 경로: 루트로 리다이렉트
if (BLOCKED_PATHS.has(pathname)) {
return NextResponse.redirect(new URL("/", request.url));
}
// 토큰 검증 (+ 만료 시 자동 갱신)
const { user, response: refreshedResponse } = await getUserFromCookieEdge(request);
// 누구나 열람 가능한 페이지: 통과
if (OPEN_PATHS.has(pathname)) {
return refreshedResponse ?? NextResponse.next();
}
// 인증 페이지: 로그인 유저는 게임으로, 비로그인 유저는 토큰 상태 헤더 노출
if (AUTH_REDIRECT_PATHS.has(pathname)) {
if (user) {
return NextResponse.redirect(new URL("/play/character", request.url));
}
const hasAccessToken = !!request.cookies.get("accessToken");
const hasRefreshToken = !!request.cookies.get("refreshToken");
const response = refreshedResponse ?? NextResponse.next();
response.headers.set("X-Has-AccessToken", String(hasAccessToken));
response.headers.set("X-Has-RefreshToken", String(hasRefreshToken));
return response;
}
// 보호 경로: 인증 필수
if (!user) {
return NextResponse.redirect(new URL("/signin", request.url));
}
// 인증된 사용자 통과 (토큰 갱신된 경우 새 쿠키 포함한 응답 반환)
return refreshedResponse ?? NextResponse.next();
}
export const config = {
matcher: ["/((?!_next/|api/|endings/|titles/|fonts/|icons/|images/|js/|manifest.json).*)"],
};