React SEO 가이드: 클라이언트 측 렌더링이 색인을 늦추는 이유, SSR과 사전 렌더링을 선택할 시점, React 19의 메타 태그 설정, AI가 읽을 수 있는 페이지 만들기.

이 페이지의 내용
요약
React도 Google에서 상위 노출될 수 있지만, 기본 싱글 페이지 앱은 거의 빈 HTML 파일을 보내고 콘텐츠 표시를 JavaScript에 의존하므로 색인이 늦어지고 대부분의 AI 크롤러에는 페이지가 보이지 않습니다. 확실한 해결책은 서버에서 HTML을 제공하는 것입니다. 정적 페이지는 빌드 시 사전 렌더링하거나 서버 렌더링을 지원하는 프레임워크(Next.js, React Router)를 사용하십시오. 그다음 URL마다 고유한 제목, 설명, canonical을 지정하고, 실제 링크와 올바른 상태 코드를 사용하며, 봇이 받는 내용을 확인하십시오.
더 알아보고 싶다면 물어보세요
간단 퀴즈
SEO가 맞습니까? 어떻게 시작해야 합니까?
Sorank가 답변에 잘 맞습니다
귀사의 사이트에서 3일 동안 사용해 보시고 Google, ChatGPT 및 다른 AI에서 귀사의 현재 위치를 확인하십시오.
3일 무료 체험 시작3일 무료, 이후 언제든 해지할 수 있습니다. 90일 성과 미달 시 환불 보장.
React SEO는 React 애플리케이션을 검색엔진과 AI 어시스턴트가 크롤링하고 색인하고 이해할 수 있게 만드는 작업입니다. React 자체는 중립적이며, 문제는 모든 것을 브라우저에서 렌더링하는 데서 생깁니다. Google은 JavaScript SEO 기본사항에서 JavaScript 앱을 크롤링, 렌더링, 색인 생성의 세 단계로 처리하며, 서버 측 렌더링이나 사전 렌더링은 "사용자와 크롤러 모두에게 사이트를 더 빠르게 만들고, 모든 봇이 JavaScript를 실행할 수 있는 것은 아니므로 여전히 좋은 방법"이라고 확인합니다.
싱글 페이지 애플리케이션으로 만든 React 앱이 전달하는 HTML 파일에는 빈 루트 div와 script 태그 정도만 들어 있습니다. 브라우저가 JavaScript를 내려받아 실행하고 페이지를 만듭니다. HTML만 읽는 크롤러에는 색인할 제목도, 본문도, 링크도 보이지 않습니다.
Googlebot은 JavaScript를 실행하지만 별도 단계에서 처리합니다. 페이지를 크롤링하고, 렌더링 대기열에 넣고, 헤드리스 Chromium에서 렌더링한 뒤에야 렌더링된 링크와 콘텐츠를 사용합니다. 단계가 늘어날 때마다 실패할 가능성(스크립트 오류, API 차단, 시간 초과)이 생기고, 새 페이지가 검색 결과에 나타나기까지 시간이 더 걸립니다. 이 과정은 JavaScript SEO 가이드에서, 색인을 앞당기는 방법은 Google 색인 생성 글에서 설명합니다.
다른 봇은 이만큼 기다려 주지 않습니다. Vercel이 2024년 12월에 발표한 분석 The rise of the AI crawler는 "주요 AI 크롤러 중 현재 JavaScript를 렌더링하는 것은 없다"고 밝히며 GPTBot, ChatGPT-User, OAI-SearchBot, ClaudeBot, PerplexityBot을 언급했습니다. 클라이언트에서 렌더링한 React 페이지는 Google이 색인하더라도 ChatGPT, Claude, Perplexity에는 보이지 않습니다.
React 팀은 이제 새 앱을 프레임워크로 시작하라고 권장합니다. 2025년 2월 14일 Create React App을 지원 중단하면서 공지에서 "서버 렌더링은 SEO를 개선할 수 있다"고 밝혔고, 콘텐츠를 보기 전에 내려받아야 할 JavaScript를 줄여 성능도 높인다고 설명했습니다. 검색에 약한 방식부터 강한 방식까지 정리하면 다음과 같습니다.
| 방식 | 봇이 받는 내용 | SEO 평가 | 대표 도구 |
|---|---|---|---|
| 클라이언트 측 렌더링(SPA) | 빈 HTML, JavaScript 실행 후 콘텐츠 | 취약: 색인 지연, AI 크롤러에 보이지 않음 | Vite + React, 기존 Create React App 프로젝트 |
| 동적 렌더링 | 봇에게만 사전 렌더링한 HTML | 임시방편이며 Google이 권장하지 않음 | 사전 렌더링 서비스, 헤드리스 브라우저 프록시 |
| 빌드 시 정적 사전 렌더링 | 알려진 모든 URL에 완전한 HTML | 자주 바뀌지 않는 콘텐츠에 매우 적합 | React Router 사전 렌더링, 정적 사이트 생성기, Next.js 정적 내보내기 |
| 서버 측 렌더링 | 요청마다 완전한 HTML, 이후 하이드레이션 | 규모가 크거나 자주 갱신되는 사이트에 최상 | Next.js, React Router(프레임워크 모드, 이전 Remix) |
동적 렌더링에 대해 Google 문서는 "임시방편이었으며 장기적인 해결책이 아니었다"고 분명히 밝히고, 대신 서버 측 렌더링, 정적 렌더링, 하이드레이션을 권장합니다. 프레임워크를 고르고 있다면 Next.js SEO 가이드에서 렌더링 방식, Metadata API, 사이트맵을 자세히 다룹니다.
이전이 어렵다면 몇 가지만 주의해도 Google은 싱글 페이지 앱을 색인할 수 있습니다. 조건은 싱글 페이지 애플리케이션 SEO 가이드에 정리했으며, 이 글의 나머지 내용은 두 경우 모두에 적용됩니다.
React 19(2024년 12월 5일 안정화) 이후 컴포넌트는 title, meta, link 태그를 직접 렌더링할 수 있으며, React가 이를 문서의 head로 옮깁니다. React 19 릴리스 노트는 이 기본 지원이 "클라이언트 전용 앱, 스트리밍 SSR, Server Components"에서 모두 동작한다고 설명합니다. React 19 이전에는 react-helmet이나 react-helmet-async 같은 라이브러리가 이 역할을 했으며, 경로별로 기본값을 덮어쓸 때는 지금도 유용합니다.
function ProductPage({ product }) {
return (
<>
<title>{`${product.name} | Shop`}</title>
<meta name="description" content={product.summary} />
<link rel="canonical" href={`https://example.com/p/${product.slug}`} />
<h1>{product.name}</h1>
</>
)
}어떤 방법을 쓰든 세 가지 규칙이 적용됩니다.
주의
클라이언트 전용 앱에서는 React가 렌더링한 태그가 JavaScript 실행 후에만 존재합니다. Google은 렌더링 후 읽을 수 있지만, AI 크롤러와 대부분의 소셜 미리보기 봇은 읽지 못합니다. 서버 렌더링이나 사전 렌더링을 하면 모든 봇을 위해 HTML 응답에 태그가 포함됩니다.
Google은 "href 속성이 있는 HTML a 요소여야만 링크를 발견할 수 있다"고 밝히며, 서로 다른 콘텐츠를 불러오는 데 URL 프래그먼트를 쓰지 말라고 권합니다. React SEO 실패의 대부분은 라우팅의 세부 사항에서 비롯됩니다.
| 실수 | 영향 | 해결 |
|---|---|---|
| div나 버튼의 onClick으로 이동 | Google이 따라갈 링크를 찾지 못함 | href가 있는 a를 렌더링하는 라우터의 Link 컴포넌트 사용 |
| 해시 경로(/#/products) | Google에는 모든 페이지가 하나의 URL을 공유 | BrowserRouter나 프레임워크로 history 기반 경로(/products) 사용 |
| "찾을 수 없음" 화면을 200으로 응답 | Search Console의 "소프트 404" | 서버에서 실제 404를 반환하거나, 순수 SPA라면 JavaScript로 noindex 추가 |
| 클라이언트 측 리디렉션만 사용 | 리디렉션이 느리거나 누락됨 | 이전된 페이지에는 서버의 301 또는 308 리디렉션 사용 |
| 클릭이나 스크롤 시 불러오는 콘텐츠 | 크롤러에게는 본문이 렌더링되지 않음 | 주요 콘텐츠는 로드 시 렌더링하고, 목록은 실제 URL로 페이지를 나눔 |
| robots.txt에서 JavaScript나 API 차단 | Google이 빈 페이지를 렌더링 | 페이지에 필요한 스크립트와 API 엔드포인트 허용 |
Google이 무엇을 렌더링하는지 보려면 Search Console의 URL 검사 도구에서 테스트한 페이지의 HTML을 확인하거나, 주요 템플릿을 색인 가능성 검사기로 점검하십시오.
React에는 사이트맵 기능이 내장되어 있지 않습니다. 빌드 시 경로와 데이터로 sitemap.xml을 생성하고(또는 프레임워크의 사이트맵 기능을 사용하고), 200을 반환하는 canonical URL만 넣은 뒤 robots.txt에서 참조하십시오. 작은 정적 사이트라면 XML 사이트맵 생성기로 충분합니다.
구조화된 데이터도 메타데이터와 같은 규칙을 따릅니다. JSON-LD 스크립트를 페이지와 함께, 같은 데이터로, 가능하면 서버에서 렌더링하십시오. Google은 JavaScript로 삽입된 JSON-LD를 렌더링 후 읽을 수 있지만, 초기 HTML에 없는 마크업은 렌더링하지 않는 크롤러에게는 존재하지 않습니다. 글에는 Article, 전자상거래에는 Product, 사이트 전체에는 Organization, 깊은 페이지에는 BreadcrumbList를 사용하십시오.
팁
페이지 URL에 curl을 실행하고 출력에서 H1과 본문의 한 문장을 검색하십시오. 찾을 수 없다면 Google은 렌더링 후 색인할 수도 있지만 AI 크롤러에는 아무것도 보이지 않습니다.
큰 JavaScript 번들은 Core Web Vitals를 떨어뜨립니다. 페이지가 반응하기 전에 브라우저가 코드를 내려받고 해석하고 하이드레이션해야 하므로, 특히 모바일에서 Largest Contentful Paint와 Interaction to Next Paint에 부담이 됩니다. Create React App에 관한 React 팀의 공지는 서버 렌더링이 더 적은 JavaScript와 완전한 HTML 문서를 보내므로 First Contentful Paint가 빨라지고 INP도 낮아질 수 있다고 설명합니다. 실천 방법은 React.lazy로 경로별 코드 분할, 크기를 명시한 이미지 제공, 첫 화면 아래 컴포넌트의 지연 로딩, 외부 스크립트 점검입니다.
GEO(생성형 엔진 최적화)는 접근성에서 시작합니다. AI 크롤러는 원본 HTML을 가져가므로, React 페이지는 JavaScript 없이도 본문, 제목, JSON-LD를 제공해야 읽히고 요약되고 인용될 수 있습니다. AI 크롤링 가능성 점검으로 이 봇들이 페이지에서 무엇을 받는지 확인할 수 있습니다. 두 번째 조건은 인용할 가치가 있는 콘텐츠로, 섹션마다 질문 하나에 답하고 출처, 수치, 명확한 정의를 갖춘 페이지입니다.
이 콘텐츠 영역을 자동화하는 것이 저희 제품 Sorank입니다. Sorank는 autopilot으로 SEO와 GEO를 수행하는 소프트웨어로, 블로그 글 생성기가 출처, 내부 링크, 이미지를 갖춘 글을 매월 20개, 60개 또는 120개 작성하고 게시하며, webhook으로 React나 Next.js 같은 맞춤형 사이트에도 연결됩니다. SEO Chat은 사이트의 검색 성과에 대한 질문에 대화 형식으로 답합니다.

정리하면 HTML은 서버에서 제공하고, URL마다 고유한 제목, 설명, canonical을 지정하며, 실제 링크를 사용하는 것입니다. 그러면 React 사이트도 다른 사이트처럼 상위 노출되고 AI 어시스턴트도 읽을 수 있습니다. Google과 AI를 위한 글을 사이트에 꾸준히 공급하려면 Sorank 요금제를 확인하십시오. 월 49달러부터 시작하며 3일 무료 체험을 제공합니다.
아닙니다. React는 사용자 인터페이스 라이브러리이며, SEO는 페이지를 렌더링하는 방식에 달려 있습니다. 클라이언트에서 렌더링하는 싱글 페이지 앱은 빈 HTML을 보내고 Google의 렌더링 단계에 의존하므로 색인이 늦어지고 AI 크롤러에는 콘텐츠가 보이지 않습니다. 같은 React 코드라도 서버 렌더링이나 정적 사전 렌더링으로 제공하면 일반 사이트처럼 상위 노출됩니다.
그렇습니다. Googlebot은 최신에 가까운 Chromium으로 JavaScript를 실행하므로 React 앱이 브라우저에서 만드는 콘텐츠도 색인할 수 있습니다. 다만 렌더링은 크롤링 이후에 이루어지며, 스크립트 오류나 API 차단이 있으면 지연되거나 실패할 수 있습니다. Search Console의 URL 검사 도구에서 Google이 보는 렌더링된 HTML을 확인할 수 있습니다.
단순한 경우에는 필요하지 않습니다. React 19는 어떤 컴포넌트에서든 title, meta, link 태그를 렌더링하고 문서의 head로 옮깁니다. 사이트 공통 기본값을 경로별로 덮어써야 하거나 이전 버전의 React를 지원해야 한다면 react-helmet-async 같은 라이브러리가 여전히 유용합니다.
먼저 Sorank를 경험한 사람들
