11import { NextRequest , NextResponse } from 'next/server' ;
22
3- export const proxy = ( request : NextRequest ) => {
3+ import { API } from './api' ;
4+
5+ export const proxy = async ( request : NextRequest ) => {
46 const accessToken = request . cookies . get ( 'accessToken' ) ;
57 const refreshToken = request . cookies . get ( 'refreshToken' ) ;
8+ let hasValidToken = ! ! accessToken ;
69
710 const protectedPaths = [ '/mypage' , '/create-group' , '/message' , '/schedule' , '/notification' ] ;
811 const isProtected = protectedPaths . some ( ( path ) => request . nextUrl . pathname . startsWith ( path ) ) ;
@@ -11,24 +14,45 @@ export const proxy = (request: NextRequest) => {
1114 const isPublic = publicPaths . some ( ( path ) => request . nextUrl . pathname . startsWith ( path ) ) ;
1215
1316 // 인증된 사용자가 public 페이지 접근 시 홈으로
14- if ( isPublic && ( accessToken || refreshToken ) ) {
17+ // refresh 중복 실행을 방지하기 위해 최상단으로 이동
18+ if ( isPublic && refreshToken ) {
1519 return NextResponse . redirect ( new URL ( '/' , request . url ) ) ;
1620 }
1721
22+ // 일반 응답 생성
23+ const response = NextResponse . next ( ) ;
24+
25+ // accessToken이 없으면 refresh 실행하여 일반 응답에 set cookie 설정
26+ if ( ! accessToken && refreshToken ) {
27+ try {
28+ const res = await API . authService . refresh ( ) ;
29+ const data = res ;
30+ hasValidToken = true ;
31+ response . cookies . set ( 'accessToken' , data . accessToken , {
32+ httpOnly : false ,
33+ maxAge : data . expiresIn ,
34+ domain : 'wego.monster' ,
35+ secure : process . env . NODE_ENV === 'production' ,
36+ } ) ;
37+ } catch {
38+ hasValidToken = false ;
39+ }
40+ }
41+
1842 // 보호되지 않은 경로는 그냥 통과
1943 if ( ! isProtected ) {
20- return NextResponse . next ( ) ;
44+ return response ;
2145 }
2246
23- // 둘 다 없으면 로그인 페이지로 redirect
24- if ( ! accessToken && ! refreshToken ) {
47+ // accessToken 없으면 login redirect
48+ if ( ! hasValidToken ) {
2549 const loginUrl = new URL ( '/login' , request . url ) ;
2650 loginUrl . searchParams . set ( 'error' , 'unauthorized' ) ;
2751 loginUrl . searchParams . set ( 'path' , request . nextUrl . pathname ) ;
2852 return NextResponse . redirect ( loginUrl ) ;
2953 }
3054
31- return NextResponse . next ( ) ;
55+ return response ;
3256} ;
3357
3458export const config = {
0 commit comments