머리말
웹 페이지를 생성하다 보면 흔하게 접할 수 있는 기술 중 하나가 리디렉션(Redirection)이다. 리디렉션은 현재의 웹 페이지를 다른 웹 페이지로 강제 이동할 수 있는 기술을 의미한다. 물론 경우에 따라서 사용자에게 페이지 이동에 대한 의사를 묻는 방법도 존재하지만, 기술적으로는 해당 코드를 만나는 순간 강제 이동이다. 이러한 리디렉션에는 HTTP 상태 코드가 존재하는데 301/302 코드가 바로 리디렉션에 해당하는 코드 값이다. 본 포스팅에서는 리디렉션의 코드 값이 어떤 의미인지 소개하며 각 코드를 비교해서 설명하도록 한다. 리디렉션에 대한 자세한 개념 설명은 아래의 관련 포스팅을 참고하면 좋을 것 같다.
HTTP 상태 코드의 개념
HTTP 상태 코드는 코드 별로 다양하게 존재한다. 일반적으로 쉽게 만날 수 있는 404 상태 코드는 페이지를 찾을 수 없는 상황을 의미하고 500번대의 상태 코드는 웹 서버가 정상적인 서비스를 유지할 수 없음을 의미한다. 다양한 상태 코드 중 본 포스팅에서는 301, 302 상태 코드에 대해서 알아보도록 한다.
해당 코드값들은 웹 서버가 클라이언트에게 요청에 대한 응답 값을 전달하는 목적으로 생성한 메시지다. 클라이언트는 웹 서버로부터 받은 HTTP 상태 코드를 해석하여 해당 요청에 대한 결과를 이해하고 처리할 수 있도록 약속된 코드 값이다. 클라이언트 요청에 대한 처리 결과를 보다 명확하게 전달하기 위해 사용되는 상태 코드는, 클라이언트의 요청이 성공적으로 완료되었는지, 리디렉션 되었는지, 클라이언트 오류가 발생했는지, 서버 오류가 발생했는지 등을 알 수 있기 때문에 필수적인 요소다. 상태 코드의 영역 별 의미는 아래와 같이 정리할 수 있다.
- 1xx (Informational): 요청이 받아들여졌으며 처리가 계속 진행 중임을 의미한다.
- 2xx (Successful): 요청이 성공적으로 처리되었음을 의미한다.
- 3xx (Redirection): 추가 조치가 필요하며, 클라이언트는 리디렉션을 따라야 함을 의미한다.
- 4xx (Client Error): 클라이언트의 요청이 잘못되었거나 처리할 수 없음을 의미한다.
- 5xx (Server Error): 서버에서 요청을 처리하는 중에 오류가 발생했음을 의미한다.
클라이언트를 위해 탄생한 HTTP 상태 코드를 리디렉션 할 때 구분을 짓고 신경을 써야 하는 이유는 바로 검색 엔진 때문이다. 검색 엔진도 웹 페이지에 접근하는 클라이언트 중 하나다. 검색 엔진은 웹 페이지에 접근해서 페이지의 상품성 및 품질을 기계적으로 검사하고 랭킹 한다. 때문에 코드 값에 따라 의미를 다르게 해석할 수 있으며 해당 코드로 인해 다른 결과가 발생할 수 있으니, 가급적 코드의 의미에 알맞게 사용하는 것이 자신의 웹 페이지에 유리할 수 있다.
리디렉션 301/302 상태 코드
HTTP 상태 코드 301은 요청한 자원이 새로운 URL로 영구적으로 이동되었음을 의미한다. 이 경우 검색 엔진과 브라우저는 요청한 자원을 새로운 URL로 기억하며 해당 자원에 대한 모든 요청을 새로운 URL로 자동 전송한다. 영구 리디렉션은 주로 웹 페이지의 URL을 영구적으로 변경하거나 사이트를 새로운 도메인으로 이전할 때 사용된다. 301 상태 코드는 주로 서버 레벨에서 수행할 수 있으며 클라이언트 레벨은 301 리다이렉션이 불가능하다. 관련된 설명은 상단에 게시한 포스팅을 참고하면 어렵지 않게 이해할 수 있다.
HTTP 상태 코드 302는 요청한 자원이 일시적으로 다른 URL에 위치하고 있음을 의미한다. 검색 엔진을 포함한 클라이언트에게 기존 URL을 사용하여 자원에 접근하며 임시적으로 다른 곳으로 리디렉션 되었음을 알리는 것이다. 임시 리디렉션은 주로 사용자가 로그인이나 인증을 해야 하는 경우에 잠시 동안 다른 페이지로 리디렉션 하는 용도로 사용될 수 있다. 예를 들어 로그인 페이지로 리디렉션 되어 로그인을 완료하면 원래 페이지로 다시 돌아가는 경우에 사용할 수 있다. 302 상태 코드는 서버/클라이언트 레벨에서 모두 수행할 수 있지만, 일반적으로 서버 레벨의 코드를 수정할 수 없는 경우에만 클라이언트 레벨에서 302 리디렉션을 수행한다.
301과 302 상태 코드의 차이점은 리디렉션의 영구성이다. 301은 영구적이기 때문에 검색 엔진은 새로운 URL을 색인할 것으로 기대할 수 있다. 또한 사용자의 브라우저는 새로운 URL로 캐시를 업데이트한다. 반면에 302는 임시적이므로 검색 엔진은 기존의 URL을 계속 색인하며 브라우저는 캐시를 변경하지 않는 차이점이 있다.
기타 상태 코드
리디렉션과 관련한 상태 코드 중 301, 302 코드만 알고 있어도 블로그를 운용하는데 큰 무리가 없다. 하지만 300번대 상태 코드 중 다양한 코드 값이 있어서 아래와 같이 간략히 소개한다. 추가로 영구 리디렉션과 관련한 308 코드에 대해서도 301 코드와 비교해서 설명했으니 참고하면 좋을 것 같다.
- 300 (Multiple Choices): 클라이언트가 선택할 수 있는 여러 리소스가 존재함을 의미한다.
- 301 (Moved Permanently): 요청한 리소스가 새로운 URL로 영구적으로 이동되었음을 의미한다.
- 302 (Found): 요청한 리소스가 일시적으로 다른 URL에 위치하고 있음을 의미한다.
- 303 (See Other): 요청한 리소스를 새로운 URL에서 얻을 수 있음을 의미한다.
- 307 (Temporary Redirect): 요청한 리소스가 일시적으로 다른 URL에 위치하고 있음을 의미한다.
- 308 (Permanent Redirect): 요청한 리소스가 새로운 URL로 영구적으로 이동되었음을 의미한다.
위와 같이 다양한 리디렉션의 상태 코드를 확인할 수 있는데, 가장 궁금할만한 내용은 301 코드와 308 코드에 대한 차이점이다. 두 상태 코드 모두 영구적인 리디렉션을 의미하는데 차이점은 분명히 존재한다. 308 코드는 HTTP/1.1에서 도입된 상태 코드로써 301 코드와 기능적으로 유사하지만, HTTP 메서드는 새로운 URL로 변경되지 않았음을 의미한다. HTTP 메서드란 GET/POST/PUT/DELETE/PATCH 등의 HTTP 메서드를 의미하며, 그 외 모든 URL 요청을 변경된 주소로 요청하는 기능은 301 상태 코드와 동일하다는 차이점이 있다.
꼬리말
상태 코드에 따른 다양한 의미에 대해서 설명했다. 간략히 정리하자면, 일시적인 도메인 이동을 제외하고는 301 리디렉션이 검색엔진이나 클라이언트에게 월등히 좋은 경험을 제공한다. 하지만, 지구상에 존재하는 모든 웹 소스 중 서버를 직접 수정해서 301 리디렉션을 구현할 페이지는 생각보다 많지 않다. 이러한 사실을 검색 엔진도 알고 있으며, 각종 브라우저도 충분히 고려하고 있다. 때문에 웹 소스의 최종 목적지까지 도달하기 위해 수많은 리디렉션을 남용하는 경우를 제외하고는 어느 정도 허용되지 않을까 싶은 생각이다. 리디렉션 상태 코드에 대한 설명은 이로써 마무리를 짓도록 하며, 시간이 기회가 되면 리디렉션에 대한 SEO 관련 글을 다뤄볼 예정이다.
소중한 댓글 (0)