kakasoo

Nest.js POST 메서드에서의 Redirect ( GET이 아닌 메서드에서의 ) 본문

프로그래밍/NestJS

Nest.js POST 메서드에서의 Redirect ( GET이 아닌 메서드에서의 )

카카수(kakasoo) 2022. 6. 19. 16:35
반응형

300-399: 리다이렉션 상태 코드

리다이렉션 상태 코드는 클라이언트가 관심있어 하는 리소스에 대한 다른 위치를 사용하라고 말해주거나, 리소스 대신 다른 대안 응답을 제공한다.

리소스가 옮겨졌다면 어디서 찾을 수 있는지 알려주기 위해 리다이렉션 상태 코드와 Location 헤더를 보낼 수 있다. 이는 브라우저가 사용자를 귀찮게 하지 않고, 알아서 새 위치로 가게 해준다.

이런 특성으로, 리다이렉션 상태 코드 중 일부는 로컬의 복사본이 원래 서버와 비교했을 때 유효한지, 또는 최신의 파일이 맞는지 비교하는 데에 쓰인다.

이 때에는 If-Modified-Since 헤더에 특정 날짜를 보내 그 날짜를 기준으로 파일의 수정이 생겼는지 체크할 수 있다. 이 경우 304의 상태 코드가 돌아온다.

일반적으로, HEAD가 아닌 다른 메소드에 대해 리다이렉션 상태 코드를 포함한 응답을 해야 한다면, 링크와 그 링크에 대한 설명을 포함시키는 것은 좋은 습관이다.

  • 상태코드 300 사유 구절 Multiple Choices :클라이언트가 어떤 것을 선택하는지 (협상)에 대해서는 추후 설명한다.
  • 클라이언트가 동시에 여러 리소스를 가리키는 요청을 하는 경우, 그 리소스의 목록과 함께 반환한다. 사용자는 목록에서 하나를 선택할 수 있다. 어떤 하나의 서버가 영어와 프랑스어로 되어 있는 경우 등에 사용한다.
  • 상태코드 301 사유 구절 Moved Permanently : 요청한 URL이 옮겨 졌을 때 사용한다. Location 헤더에 URL을 담아서 보내줘야 한다.
  • 상태코드 302 사유 구절 Found : 301과 같으나, 임시로 가리키는 URL을 보내준다.
  • 상태코드 303 사유 구절 See Other : 사용자에게, 다른 URL에서 찾아야 한다고 암시해주는 상태 코드다.
  • 상태코드 304 사유 구절 Not Modified : 변동사항이 없음을 말한다. 200과 동일하게, 엔터티 본문을 전달하는 본분을 잊어서는 안 된다.
  • 상태코드 305 사유 구절 Use Proxy : 리소스가 프락시를 통해서 접근해야 함을 말한다.
  • 상태코드 306 사유 구절 (사용되지 않는다.)
  • 상태코드 307 사유 구절 Temporary Redirect : 301과 유사하나, 임시로 가리키기 위한 URL을 보내준다.
  • 302, 303, 307이 코드가 매우 유사한데, 이에 대한 내용은 버전에서 비롯되었다.

 

Redirect는 HEAD, GET에서만 가능한 것 아닌가?

@Post('products/legacy')
async registProduct(@Res() response: Response) {
    response.redirect(HttpStatus.PERMANENT_REDIRECT, '/products');
}

원래 HTTP 메서드와 상태 코드에서, HEAD, GET 요청만 redirect 하게끔 되어 있다고 배웠었다. 그런데 찾아보니, POST와 PUT을 위한 상태 코드가 존재했다. 안타깝게도, Nest.js에서의 redirect는 약간의 결함이 존재한다. 다행히도 Res() 데코레이터로 response를 꺼낸 다음 Express와 같이 redirect를 작성해주는 방법이 있었다. 이 때, 상태코드로는 308번을 사용해야 한다. 과거 내가 정리한 내용에서는 308번이 없었는데, 그 당시에 없던 것은 아니고 이 참에 내가 새로 배운 상태 코드다. ( 엄밀히 말하면 301이 POST에서 GET으로 메서드 이동을 허용하기 때문에, Nest.js에서는 자동적으로 GET 메서드로 redirect된다. ) 이 상태 코드를 사용하면 경로와 Req의 데이터 뿐만 아니라 메서드까지 개발자가 원하는 것으로 지정할 수 있게 된다.

반응형