Astro 메타 설명 따옴표 버그가 SEO 전반에 미친 영향
목차
메인 페이지 메타 설명을 다시 손봤다. 내용은 부실했고, Astro 컴포넌트 내 따옴표 처리도 빠졌다. 작은 수정처럼 보이지만, 이 종류 버그가 사실 얼마나 광범위한 영향을 주는지 회고해본다.
메타 설명은 더 많은 역할을 한다
처음에는 "아, description 한 줄 텍스트 수정이네" 정도로 봤다. 하지만 페이지 메타 설명이라는 건 사실 여러 채널을 통해 노출된다.
- 검색 엔진: Google 검색 결과에 제목 아래 두세 줄로 표시되는 그 스니펫
- Open Graph (og:description): 페이스북, 카카오톡, 슬랙 등에서 링크 공유할 때 보이는 설명
- Twitter Card: 트위터/X에서 공유할 때의 설명
- 브라우저 탭/히스토리: 사용자의 북마크나 방문 기록에 저장되는 정보
"부실했다"는 건, 이 모든 채널에서 사용자가 받는 첫 인상이 약했다는 뜻이다. 검색 결과에서 클릭을 유도하지 못하고, SNS 공유했을 때도 뭘 하는 서비스인지 명확하지 않으면 클릭률이 뚝 떨어진다. 팀의 관점에서 보면 마케팅과 SEO 전략이 제 역할을 못 하는 셈이다.
Astro의 따옴표 처리, 작은 함정
이번 수정에서 "Astro 따옴표 누락"이라는 게 키 포인트였다. Astro는 .astro 파일에서 JSX 같은 문법으로 컴포넌트를 쓰는데, 메타 태그를 처리할 때 문자열 인터폴레이션과 HTML 속성 처리가 함께 일어난다.
예를 들어:
<meta name="description" content={description} />
여기서 description 변수 값이 따옴표를 포함하면 어떻게 될까?
<!-- description = "내 서비스는 '최고'입니다" -->
<meta name="description" content={description} />
<!-- 결과: content="내 서비스는 '최고'입니다" → 문제없음 -->
<!-- 하지만 description에 큰따옴표가 있으면? -->
<!-- description = 'he said "hello"' -->
<!-- 결과: content=he said "hello" → 속성값이 깨짐! -->
또는 더 심한 경우, 템플릿 리터럴이나 동적 description을 쓸 때 백틱이나 이스케이프 처리를 놓치면 HTML 파싱이 깨진다. Astro의 하이드레이션과 SSR 프로세스에서 이런 이스케이핑이 자동으로 처리되지 않는 경우가 있고, 특히 수동으로 문자열을 조합할 때 실수하기 쉽다.
이런 버그가 왜 자주 발생하는가
내가 봐온 패턴이 있다:
-
메타 태그는 "한 번 쓰고 잊는" 대상이다. HTML 구조나 비즈니스 로직처럼 자주 수정하지 않으니, 초기 작성이 나쁘면 오래 방치된다.
-
메타 태그는 테스트하기 어렵다. 렌더링된 HTML을 까서 직접 보거나, Open Graph 디버거로 확인해야 한다. 자동화된 테스트를 만들기는 번거롭다.
-
프레임워크마다 다루는 방식이 다르다. React Helmet, Vue의 vue-meta, Nuxt의 useHead, Astro의 SEO 컴포넌트… 각각의 이스케이핑과 타입 처리가 약간씩 다르다. 한 기술에서 다른 기술로 옮기면서 실수하기 쉽다.
우리 팀은 어떻게 다시 막을까
이 수정 후에 생각해본 개선 사항:
- 메타 설명 길이 제약: 보통 120-160자가 검색 결과에 온전히 표시된다. 팀 가이드라인으로 명시.
- 메타 태그 검증: 빌드 단계에서 description 콘텐츠를 파싱해서 따옴표, 앰퍼샌드(&), 부등호(<, >) 같은 특수문자가 이스케이프되어 있는지 확인하는 린터 규칙 추가.
- 코드 리뷰 체크리스트: 메타 태그 수정하는 PR이 들어오면, "og:description과 일치하는가?", "특수문자 이스케이프?", "길이는 합리적인가?" 다시 한 번 묻기.
작은 버그지만, 이렇게 쌓이는 게 기술 부채가 된다. 다음부터는 초기 구현 단계에서 좀 더 신경 써야겠다.
🛒 이 글과 어울리는 추천 상품
*위 링크는 쿠팡파트너스 활동의 일환이며, 일정액의 수수료를 제공받을 수 있습니다.
댓글 0
첫 댓글 달아줘.