headers 함수 알아보기
headers
함수는 Server Component 내에서 HTTP 요청 헤더를 비동기로 읽을 수 있게 도와주는 유틸리티입니다. 간단히 말해, 클라이언트가 서버에 보낸 요청의 헤더 정보를 서버 컴포넌트 안에서 쉽게 확인할 수 있다는 거죠.
아래 예제를 보고 한번 살펴볼게요!
import { headers } from 'next/headers'
export default async function Page() {
const headersList = await headers()
const userAgent = headersList.get('user-agent')
return (
<div>
<p>당신의 User-Agent: {userAgent}</p>
</div>
)
}
- 여기서
headers()
를 호출하면 요청에 포함된 모든 헤더 정보를 담은 객체를 비동기로 가져옵니다. headersList.get('user-agent')
로 특정 헤더(user-agent
) 값을 얻을 수 있어요.- 이렇게 얻은 헤더 정보로 클라이언트 환경에 따라 다른 내용을 렌더링하거나, API 요청 시 헤더를 조작할 수도 있습니다.
참고로,
headers()
함수는 Server Component에서만 사용 가능하기 때문에 클라이언트 컴포넌트에서는 사용할 수 없다는 점 기억하세요!
헤더 정보 활용 팁
- 사용자 환경 감지: User-Agent 헤더를 통해 브라우저 종류나 버전을 확인할 수 있어, 맞춤형 UI를 제공할 때 유용해요.
- 보안 검사: 특정 헤더 값을 검사해서 요청이 정상적인지 체크할 수도 있고, 토큰이나 인증 정보를 확인하는 데도 쓰입니다.
- 로깅 및 분석: 클라이언트 IP, 언어 설정, 쿠키 등 다양한 헤더 정보를 기록해서 서비스 개선에 활용하세요.
필요할 때마다 headers
를 활용하면 서버 사이드에서 더 스마트하게 사용자 요청을 다룰 수 있으니 꼭 기억해두세요!
파라미터
headers는 별도의 파라미터를 받지 않습니다.
반환값
headers는 읽기 전용(Web Headers) 객체를 반환합니다.
여기서 Web Headers 객체란, 웹 요청과 응답에 포함되는 헤더 정보를 나타내는 객체예요. 쉽게 말해서, 서버나 클라이언트가 주고받는 부가 정보를 가지고 있는 거죠. 주로 콘텐츠 타입(Content-Type), 인증 정보(Authorization), 캐시 제어(Cache-Control) 등 다양한 정보를 담고 있답니다.
이 객체가 읽기 전용이라서, 값들을 마음대로 바꾸지는 못하지만, 필요한 경우 새로운 헤더를 만들어서 요청에 추가할 수 있어요. 혹시 헤더를 조작하거나 확인하는 작업이 필요하다면, 이 점 참고하면 좋을 것 같아요!
Headers 객체 메서드 정리해봤어요! 웹 개발할 때 Headers 다룰 일 많으니 참고해 보세요.
메서드 | 설명 |
---|---|
Headers.entries() | Headers 객체에 들어있는 모든 키/값 쌍을 돌면서 이터레이터(iterator)를 반환해요. |
Headers.forEach() | Headers 내 각 키/값 쌍에 대해 한 번씩 제공한 함수를 실행해요. |
Headers.get() | 특정 이름을 가진 헤더의 모든 값을 문자열(String)로 반환해요. |
Headers.has() | 해당 헤더가 존재하는지 여부를 boolean으로 알려줘요. |
Headers.keys() | 모든 키를 순회할 수 있는 이터레이터를 반환해요. |
Headers.values() | 모든 값을 순회할 수 있는 이터레이터를 반환해요. |
알아두면 좋은 점
-
headers
함수는 비동기(async) 함수라 Promise를 반환해요. 그래서async/await
문법이나 React에서 제공하는 hook들을 사용해야 합니다. -
Next.js 14버전 이전까진
headers
가 동기 함수였는데, Next.js 15버전에서도 아직 동기 방식으로 접근은 가능하지만 점점 사라질 예정이에요. 호환성 때문에 아직 남겨두고 있긴 합니다. -
headers
는 읽기 전용(Read-only)입니다. 그래서 요청 헤더를 새로 설정하거나 삭제하는 건 불가능해요. -
headers
가 동적으로 API 값을 반환하기 때문에, 해당 라우트(페이지)는 자동으로 ‘동적 렌더링’ 모드로 들어갑니다. 정적 생성(Static Generation)이 필요한 상황에서는 주의하세요.
혹시 Headers
객체를 사용할 때 어떻게 데이터를 순회하는지 궁금하다면, 다음처럼 간단한 예제도 있어요!
const headers = new Headers();
headers.append('Content-Type', 'application/json');
headers.append('X-Custom-Header', 'Value123');
for (const [key, value] of headers.entries()) {
console.log(`${key}: ${value}`);
}
headers.forEach((value, key) => {
console.log(`${key} = ${value}`);
});
이런 식으로 entries()
로 반복문 사용하거나 forEach
를 바로 쓸 수 있어요.
개발하시면서 Headers 객체를 다룰 일이 많다면, 이런 기본 메서드들을 익혀두면 훨씬 편리합니다. 꼭 기억해두세요!
Authorization 헤더 사용하기
import { headers } from 'next/headers'
export default async function Page() {
const authorization = (await headers()).get('authorization')
const res = await fetch('...', {
headers: { authorization }, // Authorization 헤더 전달하기
})
const user = await res.json()
return <h1>{user.name}</h1>
}
여기서 중요한 점은, Next.js 13부터 headers()
함수가 비동기 함수가 되었다는 거예요. 그래서 await headers()
로 호출해야 하고, 그 결과에서 authorization
헤더 값을 가져올 수 있습니다. 그리고 이 값을 fetch 요청의 헤더로 그대로 넘겨줘서, 서버 간 인증 정보를 전달할 수 있죠.
이 방법은 특히 API 라우트나 서버 컴포넌트에서 클라이언트가 보낸 헤더를 그대로 백엔드 API에 넘길 때 유용해요. 예를 들어, JWT 토큰을 포함한 Authorization 헤더를 안전하게 전달할 수 있다는 뜻이죠.
다만, Authorization 헤더에는 민감한 정보가 많이 담기므로, 꼭 신뢰할 수 있는 환경에서만 이렇게 포워딩하고, 노출되지 않도록 주의해야 합니다.
버전 히스토리
Version | Changes |
---|---|
v15.0.0-RC | headers 가 이제 비동기 함수가 되었습니다. 관련 코드 변경을 도와주는 codemod가 제공됩니다. |
v13.0.0 | headers 함수가 도입되었습니다. |
참고로, 예전 Next.js 버전에서는 headers
가 동기 함수였는데, 비동기 함수로 변경되면서 더 유연한 비동기 작업이 가능해졌어요. 업그레이드할 때는 이 점 꼭 체크하세요! 그리고 authorization
외에도 필요한 다른 헤더들도 동일한 방식으로 가져와서 활용할 수 있답니다.