HTTPQUERY
한국어

410 Gone

사용법

410 Gone 오류 메시지를 받으면 클라이언트는 그 주소가 한때 유효했지만 해당 리소스가 더 이상 존재하지 않음을 알게 됩니다. 이는 기간 한정 프로모션의 일부로 제공되던 문서처럼 리소스가 만료된 뒤 반환되는 응답입니다. 서버가 그 제거를 영구적인 것으로 보지 않는다면 대신 404를 사용합니다.

이 상태 코드는 웹 유지 관리에 유용하며, 클라이언트에게 해당 리소스로의 링크를 제거하라는 신호를 줍니다. 이 응답은 기본적으로 캐시 가능합니다. 클라이언트와 중간 노드는 명시적인 Cache-Control 지시문이 없어도 410을 저장합니다. 나중에 재시도하면 성공할 수 있는 404와 달리, 올바르게 동작하는 클라이언트는 요청을 재시도하지 않습니다.

흔한 사용 사례로는 만료된 프로모션, 더 이상 사용되지 않는 API 엔드포인트, 영구적으로 제거된 보관 콘텐츠가 있습니다.

SEO 영향

Google 같은 검색 엔진은 410 응답 상태를 가진 URL을 색인하지 않습니다. 이전에 색인된 URL은 검색 결과에서 제거됩니다. 이 코드를 반환하는 페이지는 크롤 예산을 낭비하지 않습니다. Google은 404와 410을 동일하게 처리합니다. 둘 다 같은 속도로 콘텐츠를 색인에서 제거합니다. 410으로 응답하는 대신 오류 내용을 담은 200을 반환하거나 삭제된 URL을 홈페이지로 리다이렉트하면 소프트 404가 만들어지며, 이는 크롤 예산을 낭비하고 사이트의 서버 신호에 대한 신뢰를 떨어뜨립니다.

예시

클라이언트가 리소스를 요청하고, 프로모션이 종료되어 해당 콘텐츠를 더 이상 제공할 수 없으므로 서버는 410 Gone으로 응답합니다.

요청

GET /holiday-promotion-Jan-2021.pdf HTTP/1.1
Host: example.com

응답

HTTP/1.1 410 Gone
Content-Type: text/html
Content-Length: 133

<html>
  <head>
    <title>Promotion Expired</title>
  </head>
  <body>
   <p>The promotional period has ended.</p>
  </body>
</html>

해결 방법

410이 예상치 못하게 나타나면 서버 설정 파일에 의도치 않은 규칙이 없는지 확인하세요. Apache에서는 httpd.conf와 .htaccess에서 G 플래그가 붙은 RewriteRule 항목이나 Redirect gone 지시문을 찾아보세요. nginx에서는 서버 설정의 location 블록 안에 return 410이 있는지 확인하세요. CMS 플러그인이나 최근 업그레이드가 경고 없이 410 규칙을 추가하기도 합니다. 최근 설치한 플러그인을 비활성화해 원인을 좁혀 보세요.

제거가 의도된 것이라면 사이트맵에서 해당 URL을 제외하도록 갱신하고, 그 리소스를 가리키는 내부 링크를 제거하세요.

WordPress에서는 Redirection이나 Yoast SEO 같은 플러그인이 서버 파일을 직접 편집하지 않고도 관리자 화면에서 410 응답을 관리해 줍니다.

제거가 의도하지 않은 것이라면 리소스나 그 대체물을 복구하고 200을 반환하세요. 대체 페이지가 다른 URL에 존재한다면 410보다 301 리다이렉트가 더 적절합니다.

코드 참고

.NET

HttpStatusCode.Gone

Rust

http::StatusCode::GONE

Rails

:gone

Go

http.StatusGone

Symfony

Response::HTTP_GONE

Python3.5+

http.HTTPStatus.GONE

Java

java.net.HttpURLConnection.HTTP_GONE

Apache HttpComponents Core

org.apache.hc.core5.http.HttpStatus.SC_GONE

Angular

@angular/common/http/HttpStatusCode.Gone