Middleware allows you to run code before a request is completed. Then, based on the incoming request, you can modify the response by rewriting, redirecting, modifying the request or response headers, or responding directly.
한마디로 미들웨어란 요청이 들어왔을 때 해당 요청에 대해 응답을 보내기 전 무언가를 수행할 수 있게 해주는 중간자같은 역할을 한다고 볼 수 있다.
애플리케이션의 성능과 보안성, 사용자 경험을 강화하고자 할 때 사용되는데,
일반적으로 다음과 같은 경우에서 효과적으로 쓰인다 :
- 특정 페이지로 라우팅하기 전 세션 토큰이나 사용자 권한 등을 체크하고자 할 경우
- 페이지 또는 API에 접근하기 전 request data에 대해 정보를 확인 및 분석하고자 할 경우
- 유저에 따라 서버 사이드로 리다이렉트 시키는 경우
- 요청에 대한 응답을 변환시키거나 에러를 처리할 경우
미들웨어가 실행되는 시점
1. 서버로 요청을 보낼 시 (서버 API 실행 직전)
2. 특정 페이지로 접속 시 (특정 페이지 로드 직전)
미들웨어 사용 예시
root에 middleware.js라는 파일을 만들어 코드를 작성한다.
1) 특정 페이지에 접속한 사용자 기록하기
import { NextResponse } from "next/server";
export async function middleware(req) {
if (req.nextUrl.pathname == "/list") {
console.log(req.headers.get("sec-ch-ua-platform"));
console.log(new Date());
return NextResponse.next();
}
}
req.nextUrl
: 사용자가 요청 중인 URL을 반환req.headers
: 사용자에 대한 정보(브라우저, 언어, OS 정보 등)를 반환NextResponse.next()
: 마지막에 return문에서 통과의 의미로 작성
2) 로그인 안 한 사용자의 접속 제한하기
import { NextResponse } from "next/server";
import { getToken } from "next-auth/jwt";
export async function middleware(req) {
if (req.nextUrl.pathname.startsWith("/write")) {
const session = await getToken({ req: req });
console.log("세션", session);
if (session == null) {
return NextResponse.redirect(new URL("/api/auth/signin", req.url));
}
}
}
NextResponse.redirect()
: 특정 페이지로 리다이렉션
💭 NextResponse.rewrite() 과의 차이점?
rewrite는 url을 유지한 채로 다른 페이지로 이동을 시켜준다!
3) 특정 페이지 접속 시 쿠키 생성하기
import { NextResponse } from "next/server";
import { getToken } from "next-auth/jwt";
export async function middleware(req) {
const session = await getToken({ req: req });
if (req.nextUrl.pathname.startsWith("/register")) {
if (req.cookies.has("visited") == false) {
const res = NextResponse.next();
res.cookies.set({
name: "visited",
value: "true",
maxAge: 60 * 60,
httpOnly: true,
});
return res;
}
return NextResponse.next();
}
}
req.cookies
: 사용자가 보낸 쿠키 반환
예시에 나온 것들 외 request 또는 response와 관련된 함수들도 많은데, 이는 공식문서에 잘 나와 있으니 필요 시 직접 알아보는 것을 권장한다.
참고 :
https://nextjs.org/docs/app/building-your-application/routing/middleware
Routing: Middleware | Next.js
Learn how to use Middleware to run code before a request is completed.
nextjs.org
https://nextjs.org/docs/app/api-reference/functions/next-response#next
Functions: NextResponse | Next.js
API Reference for NextResponse.
nextjs.org
https://velog.io/@pds0309/nextjs-%EB%AF%B8%EB%93%A4%EC%9B%A8%EC%96%B4%EB%9E%80
문서보며 알아보는 nextjs 미들웨어
공식문서를 활용해 nextjs(13v 기준)의 middleware에 대해 알아보자Middleware allows you to run code before a request is completed, then based on the incoming request, you
velog.io
'Next.js' 카테고리의 다른 글
[Next.js] 게시물 삭제 기능 구현하기 - 서버에 요청 보내는 방식 (Ajax, query string, URL parameter) (0) | 2024.06.21 |
---|---|
[Next.js] Next.js Server Actions (0) | 2024.05.28 |
[Next.js] 다크모드 기능 구현하기 (0) | 2024.05.28 |
[Next.js] Local Font 추가하여 전역 폰트 적용하기 (feat. TailwindCSS) (0) | 2024.05.24 |
Next.js로 웹서비스 만들기 4주차 - 게시판 만들기 (Dynamic Routes, 페이지 이동, MongoDB 데이터 수정) (0) | 2024.04.09 |
Middleware allows you to run code before a request is completed. Then, based on the incoming request, you can modify the response by rewriting, redirecting, modifying the request or response headers, or responding directly.
한마디로 미들웨어란 요청이 들어왔을 때 해당 요청에 대해 응답을 보내기 전 무언가를 수행할 수 있게 해주는 중간자같은 역할을 한다고 볼 수 있다.
애플리케이션의 성능과 보안성, 사용자 경험을 강화하고자 할 때 사용되는데,
일반적으로 다음과 같은 경우에서 효과적으로 쓰인다 :
- 특정 페이지로 라우팅하기 전 세션 토큰이나 사용자 권한 등을 체크하고자 할 경우
- 페이지 또는 API에 접근하기 전 request data에 대해 정보를 확인 및 분석하고자 할 경우
- 유저에 따라 서버 사이드로 리다이렉트 시키는 경우
- 요청에 대한 응답을 변환시키거나 에러를 처리할 경우
미들웨어가 실행되는 시점
1. 서버로 요청을 보낼 시 (서버 API 실행 직전)
2. 특정 페이지로 접속 시 (특정 페이지 로드 직전)
미들웨어 사용 예시
root에 middleware.js라는 파일을 만들어 코드를 작성한다.
1) 특정 페이지에 접속한 사용자 기록하기
import { NextResponse } from "next/server";
export async function middleware(req) {
if (req.nextUrl.pathname == "/list") {
console.log(req.headers.get("sec-ch-ua-platform"));
console.log(new Date());
return NextResponse.next();
}
}
req.nextUrl
: 사용자가 요청 중인 URL을 반환req.headers
: 사용자에 대한 정보(브라우저, 언어, OS 정보 등)를 반환NextResponse.next()
: 마지막에 return문에서 통과의 의미로 작성
2) 로그인 안 한 사용자의 접속 제한하기
import { NextResponse } from "next/server";
import { getToken } from "next-auth/jwt";
export async function middleware(req) {
if (req.nextUrl.pathname.startsWith("/write")) {
const session = await getToken({ req: req });
console.log("세션", session);
if (session == null) {
return NextResponse.redirect(new URL("/api/auth/signin", req.url));
}
}
}
NextResponse.redirect()
: 특정 페이지로 리다이렉션
💭 NextResponse.rewrite() 과의 차이점?
rewrite는 url을 유지한 채로 다른 페이지로 이동을 시켜준다!
3) 특정 페이지 접속 시 쿠키 생성하기
import { NextResponse } from "next/server";
import { getToken } from "next-auth/jwt";
export async function middleware(req) {
const session = await getToken({ req: req });
if (req.nextUrl.pathname.startsWith("/register")) {
if (req.cookies.has("visited") == false) {
const res = NextResponse.next();
res.cookies.set({
name: "visited",
value: "true",
maxAge: 60 * 60,
httpOnly: true,
});
return res;
}
return NextResponse.next();
}
}
req.cookies
: 사용자가 보낸 쿠키 반환
예시에 나온 것들 외 request 또는 response와 관련된 함수들도 많은데, 이는 공식문서에 잘 나와 있으니 필요 시 직접 알아보는 것을 권장한다.
참고 :
https://nextjs.org/docs/app/building-your-application/routing/middleware
Routing: Middleware | Next.js
Learn how to use Middleware to run code before a request is completed.
nextjs.org
https://nextjs.org/docs/app/api-reference/functions/next-response#next
Functions: NextResponse | Next.js
API Reference for NextResponse.
nextjs.org
https://velog.io/@pds0309/nextjs-%EB%AF%B8%EB%93%A4%EC%9B%A8%EC%96%B4%EB%9E%80
문서보며 알아보는 nextjs 미들웨어
공식문서를 활용해 nextjs(13v 기준)의 middleware에 대해 알아보자Middleware allows you to run code before a request is completed, then based on the incoming request, you
velog.io
'Next.js' 카테고리의 다른 글
[Next.js] 게시물 삭제 기능 구현하기 - 서버에 요청 보내는 방식 (Ajax, query string, URL parameter) (0) | 2024.06.21 |
---|---|
[Next.js] Next.js Server Actions (0) | 2024.05.28 |
[Next.js] 다크모드 기능 구현하기 (0) | 2024.05.28 |
[Next.js] Local Font 추가하여 전역 폰트 적용하기 (feat. TailwindCSS) (0) | 2024.05.24 |
Next.js로 웹서비스 만들기 4주차 - 게시판 만들기 (Dynamic Routes, 페이지 이동, MongoDB 데이터 수정) (0) | 2024.04.09 |