Mytly 01: redirect 시 location header가 protocol prefix를 갖지 않을 때 발생하는 문제

Ho Saint·2023년 5월 3일
0

문제

단축 URL을 path variable로 받으면 연결된 원본 URL로 리다이렉트를 해주는 엔드포인트를 구현하는 중에 다음과 같은 문제가 발생했다.

기대: Original Url 페이지로 리다이렉트
실제: 해당 엔드포인트의 경로 아래 Original Url이 붙어서 (/api/v1/urls/thoughtful-arch-8c2.notion.site/_URL-c7f57136e2744ff8872eaf973069bdfe) 리다이렉트

서버에는 urls/thoughtful-arch-8c2.notion.site/_URL-c7f57136e2744ff8872eaf973069bdfe 리소스가 없어서 Whitelabel Error Page를 출력하게 된다.

원인

위와 같이 Original Url이 https protocol prefix(https://)를 갖고 있을 때는 기대했던 대로 Original Url 페이지로 제대로 리다이렉트되는 것을 볼 수 있다.

해당 엔드포인트는 301 Moved Permanently와 함께 Location 헤더로 Original Url을 응답한다.
이 때 Orginal Url이 Protocol Prefix를 갖지 않는다면 브라우저는 이 Url을 절대경로가 아닌 서버 내의 상대경로로 인식하여 /api/v1/urls/{Original-Url}로 리다이렉트하게 된다.

대처

우리는 웹페이지에 대한 URL 단축 서비스를 제공하려고 하기 때문에 Original Url은 http prefix(http://) 혹은 https prefix(https://)를 가져야 한다.

이에 대해 클라이언트에서 Original Url을 입력받을 때 정해진 protocol prefix를 갖는지 유효성 검증을 하는 것과 서버에서 Original Url을 저장할 때 임의로 prefix를 붙여주는 방법을 생각할 수 있다.

이 중 서버에서는 유효성 검증만 수행하는 것이 적절하다 생각하여 이 쪽을 선택했다.

위와 같은 Custom Validator를 작성 후

단축 URL 생성 시 Request Body를 바인딩받는 dto 클래스에 @ValidOriginalUrl 어노테이션을 통해 URL 유효성 검증을 수행하도록 했다.

추가

OriginalUrlValidator에 OriginalUrl이 protocol-domain-path 형태로 이루어져 있는지와 public domain을 갖는지 검증하는 로직 추가

profile
열정보다 시스템. 실수를 막을 수 있는 프로세스.

0개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN