최근에 서블릿 JSP 를 사용한 MVC 패턴을 사용하면서, redirection 과 forword 의 개념이 헷갈려 애를 먹었던 기억이 있다.. 때문에 오늘 리다이렉션을 한번 정리하고자 한다.
리다이렉션
먼저 리다이렉션은 HTTP 300번대 상태코드로 요청을 완료하기 위해서 유저에게 추가적인 조치가 필요한 상태를 말한다.
말로 하면 이해가 어렵기 때문에 그림과 함께 설명해 보도록 하겠다!
첫번째, 클라이언트가 서버에 요청을 보내게 되면, 서버는 300번대 리다이렉션 상태코드를 반환하게 된다.
두번째, 이때 서버는 Location을 통해서 새로 이동해야 할 위치를 알려주게 되고,
세번째, 클라이언트는 서버에게 받은 위치 정보를 참고해, 새로운 URL 로 접근하게 되는 것이다!
(후,, 최대한 쉽게 설명해보려 했다,,)
redirect vs forward
여기서 내가 헷갈렸던 부분이 나오는데, 서블릿 코드 중에 .forword() 메서드를 통해서 JSP 파일로 이동할 때가 있고, .redirect() 메서드를 통해서 이동할 때가 있다는 것이다.
두 메서드의 차이점은 리다이렉트는 위의 설명처럼, 실제 클라이언트에 응답이 나갔다가, 클라이언트가 redirect 경로로 다시 요청하는 것이고(따라서 클라이언트가 인지할 수 있고, URL 경로도 변경된다),
반면에 포워드는 서버 내부에서 일어나는 호출이기 때문에, 클라이언트가 전혀 인지하지 못한다는 것이다!!!!!
(휴,, 아주 속이다 시원한 설명이었다,,)
다시 리다이렉션 설명으로 돌아와 보다 세부적으로 설명해보도록 하겠다.
리다이렉션은 종류가 3개로 나뉘는데 그 종류는 다음과 같다.
첫번째, 영구 리다이렉션 - 특정 리소스의 URI 이 영구적으로 이동
두번째, 일시 리다이렉션 - 일시적인 변경
세번째, 특수 리다이렉션
먼저 영구 리다이렉션은 301, 308 상태 코드가 있다.
- 영구 리다이렉션은 URI가 영구적으로 이동하기 때문에, 원래의 URL을 사용하지 않고, 검색 엔진 등에서도 변경을 인지한다.
- 301 : 리다이렉트 요청시 요청 메서드가 GET 으로 변하고 본문이 제거될 수 있음
=> 대부분의 경우가 그렇고 아닐수도 있다..
- 308 : 301과 기능은 같지만 리다이렉트시 요청 메서드와 본문을 유지한다.
두번째로, 일시적인 리다이렉션에는 302, 307, 303 상태 코드가 있다.
- 리소스의 URI 가 일시적으로 변경되어, 검색 엔진 등에서 URL을 변경하면 안된다.
- 302 : 리다이렉트 요청시 요청 메서드가 GET 으로 변하고 본문이 제거될 수 있음
=> 301과 마찬가지로 변경될수도 아닐수도 있다.
- 307 : 302와 기능은 같지만, 리다이렉트시 요청메서드와 본문을 유지한다.
- 303 : 302와 기능은 같지만, 리다이렉트시 요청메서드가 GET으로 변한다.
PRG
일시적인 리다이렉션의 예시로는, PRG(post/redirect/get) 이 있다.
그 과정은 다음과 같다.
- 주문 과정이 있을 때 POST로 주문 후에 새로 고침으로 인한 중복 주문을 방지하기 위함이다.
- POST 로 주문 후에 주문 결과 화면을 GET 메서드로 리다이렉트 한다.
- 새로고침을 해도 결과 화면을 GET 으로 조회 한다.
- 중복 주문 대신에 결과 화면만 GET 으로 다시 요청한다.
그렇다면 일시적인 리다이렉션에서는 어떤 메서드를 사용해야 할까?
- 307, 303을 권장하지만 현실적으로 이미 많은 애플리케이션 라이브러리들이 302를 기본값으로 사용한다
- 때문에 자동 리다이렉션시에 GET으로 변해도 되면 그냥 302를 사용해도 큰 문제 없음
마지막으로 기타 리다이렉션에는 300, 304 번이 있다.
- 일단 300번은 거의 사용하지 않기 때문에 PASS~
- 304 : 캐시를 목적으로 사용하고, 클라이언트에게 리소스가 수정되지 않았음을 알려준다. 따라서 클라이언트는 로컬PC에 저장된 캐시를 재사용한다. (캐시로 리다이렉트 한다.)
304 응답은 응답에 메시지 바디를 포함하면 안된다. (로컬 캐시를 사용해야 하므로)
조건부 GET, HEAD 요청시 사용한다.
이렇게 리다이렉션 설명을 마무리하겠다!
'CS > 네트워크' 카테고리의 다른 글
JWT(Json Web Token) (0) | 2022.06.27 |
---|---|
세션과 토큰 (0) | 2022.06.27 |
컴퓨터는 인터넷에서 어떻게 통신할까? (0) | 2022.05.30 |
포트 포워딩 (0) | 2022.04.16 |
왜 서버 구축에는 리눅스를 사용할까? (0) | 2022.04.13 |