우리네 장
HTTP redirect에 대해서...! 본문
서비스에서 gateway 도메인으로 접근 시, 특정 endpoint 도메인으로 리다이렉트 시켜주는 alb 구성을 지켜보다가,
redirect에 대한 이해가 조금 부족한 듯 싶어 정리해본다.
Http Status Code
http 프로토콜에 정의된 상태 코드 중 리다이렉트를 의미하는 상태코드는,
301과 302 그리고 308 이 있다.
브라우저에서는 해당 상태 코드에 대해서 리다이렉트가 되도록 처리가 되어있어서, 사용자는 네트워크 탭을 열어서 확인하지 않는 이상 알아채긴 힘들다.
그래서 나도 자동으로 위 상태코드가 나오면 자동으로 리다이렉트가 처리되는 거라고 생각했다...ㅎ
일단 상태 코드 특징에 대해서 먼저 알아보면,
301 과 302
해당 코드가 나오면 웹 브라우저나 spring의 restTemplate에서 리다이렉트 처리를 해준다.
그런데 이때 원 요청의 메소드와 상관 없이 GET으로 리다이렉트를 해준다.
그래서 이 경우 사용자의 의도와는 다르게 method가 변경되고 request Body가 사라지는 현상을 마주할 수 있다..
( 실제로 AWS 이관 작업에서 ALB를 통해 도메인을 요청할 때, 해당 현상이 발생했었다 )
307 과 308
그러나 308 상태코드는 기존의 요청 메소드를 유지해준다. 임의의 도메인으로 리다이렉트 되어 요청이 넘어가게 되도 정보가 바뀌지 않는다는 의미이다. 그래서 POST로 요청을 할 경우 라다이렉트가 필요하다면 308을 사용하는 것을 권장 한다. 이 상태코드도 코드 값에 따라서 처리를 해주는 주체가 필요하다. 위에서 언급한 것처럼 웹 브라우저나 restTemplate 처럼...!
308 상태코드를 Permanent Redirect 라고 한다는데 이 의미가 많이 중요한가 싶긴 하다..
리다이렉트를 시키기 위해서는 헤더 값에 "Location"이라는 목적지 값이 필요하다.
예를 들면,
이렇게 리다이렉트 시키겠다! 하면 응답에 위 헤더가 있어야 목적지를 파악할 수 있다. ( 필수필수 )
만약 리다이렉트가 정상적으로 되지 않는다고 하면 location값이 잘 들어가 있는지 확인을 해주어야 한다.
보통 서버 장비에서 특정 서비스의 API와 통신이 잘 되는지 확인을 하기 위해서,
curl 명령어를 많이 사용한다. 포트 번호를 명시 할 수 있는 telnet은 보안상 사용하기가 어렵다..
그래서 대신 curl 명령어 + telnet schema를 사용하는 방법도 있다. 이렇게 하면 포트 지정이 가능한데 필요하다면 따로 구글링 해보는 것으로...!
쨋든 위와 같이 curl 명령어로 API 통신을 테스트 할 때, 나는 정상적인 통신이라면 200이 뜨고 응답 결과가 나와야 한다고 생각했다.
그런데 curl로 테스트 시에는 리다이렉트를 시키라는 응답 까지만 보인다고 한다.
그래서 최종 응답에 대해서는 확인하기 힘들다고..
아래와 같이 뜨면 리다이렉트가 정상적으로 되고 있음을 의미한다.
그리고 restTemplate 사용 시 주의할 점이 있다.
Content-Type 헤더와 응답으로 받을 객체 타입을 잘 맞춰야 한다는 것...?
Content-Type 헤더가 html/text로 지정되어 있고 + exchange를 통해 받을 응답의 타입이 ObjectNode 였을 때,
타입 변환의 문제로 에러가 발생했었다.
RESTful API에서는 보통 Content-Type 헤더를 application/json으로 지정하여 문제가 없을 듯 하나,
혹시나 몰라서 적어본다!
'작업 > 이니스프리' 카테고리의 다른 글
[ Tomcat ] XML 파일에 톰캣 환경변수 값 사용하는 방법 (0) | 2022.10.11 |
---|