일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 세션타임아웃설정
- http
- hikaricp
- Could not find or load main class worker.org.gradle.process.internal.worker.GradleWorkerMain
- Expires
- 프록시 캐시 서버
- 쿠키생명주기
- supportParameter
- 조건부요청
- no cache
- 300
- 서블릿http세션
- etag
- 쿠키보안문제
- 검증헤더
- must revalidate
- 캐시
- HTTP API
- 인증체크
- HTTP상태코드
- 프록시객체
- resolveArgument
- 양쪽 모두 값 설정
- www-Authenticate
- Not Modified
- gradle오류
- max age
- UrlResource
- 세션만들어보기
- 서블릿필터
- Today
- Total
복습을 위한
3xx 일시적리다이렉션, PRG 본문
영구리다이렉션과 다르게 검색엔진에서 url을 변경하면안된다. 다음에 어떻게 될 지 모르기 때문이다.
302 303은 비슷한데 실무에선302를 사용한다. 별 문제는 없다.
PRG패턴을 알아보자. 상품을 주문하고 주문하기 버튼을 누른다고 하자. 그럼 post메서드로 서버로 내 데이터가 넘어갈 것이다. 자 그런상태에서 결과가 남아있다. 거기서 웹브라우져를 새로고침하면 어떻게 될까? post데이터가 한번 더 들어가서 서버에 중복주문이 들어갈 수도 있다. 요청했던 것을 새로고침해서 새로고침도 post요청이 또 되버리는 것이다, 이것을 해결해야한다.! PRG 사용 전부터 보자.
주문데이터가 요청이 와서 딱 저장이 됐다. 근데 클라이언트에서의 마지막 요청이 무엇이었나? 주문이었다. 실수로 새로고침누르면 마지막 요청을 또다시 보내는 것이다. 그냥 화면을 갱신하고 싶었던 것 뿐인 의도와 다르게 post가 한 번 더 들어가서 주문이 계속들어간다. 물론 이건 서버에서 잘 막아야하긴한다. 그래도 클라이언트차원에서 막아줘야한다.
그래서 PRG를 사용한다.
새로고침해도 GET으로 결과화면을 조회하는 것이다. 결과 화면만 GET으로 다시 요청하는 것이다.
PRG패턴을 사용하는 경우이다. 맨 앞 주문완료를 똑같이 했다 하지만 이번엔 서버에서 응답을 200코드 주지않고 302나 303을 준다. 새로운 URL 리소스를 Location헤더에 넣어서 말이다. 클라이언트는 응답을 받고 GET으로 바꾼 뒤 다시 요청한다. 이번엔 주문 DB를 또 쌓는 것이 아니라 서버에서 리소스정보를 조회해서 비로소 주문완료 HTML화면과 200번대 성공을 넘겨준다. 이 다음 고객이 실수로 새로고침을 해도 다시 5번 GET요청이 반복되는 것 뿐이다. 이렇게 중복주문이 해결된다.
URL이 이미 POST에서 GET으로 바뀌었으므로 새로고침을 해도 GET결과 화면만 조회된다. 이 패턴을 사용하면 많은 오류가 줄어든다. 실무에서 아주 많이 사용한다.
304는 뒤에서 자세히 말하겠다. 캐시를 목적으로 사용한다. 어떤 사진이미지가 있다고하자. 클라이언트가 '캐시(임시저장데이터) 만료된 것 같은데 서버 니가 다시 좀 보내줘라'하면 서버가 '그냥 써도돼 아직, 데이터 안줄거야 니 캐시에 있는 거 갖다써' 이러면 네트워크 다운로드 용량이 많이 줄 것이다. 이미지자체를 보낼 필요가 없으니깐. 따라서 클라이언트는 캐시를 재사용한다.
참고
'http 상태코드' 카테고리의 다른 글
4XX, 5XX (0) | 2024.01.14 |
---|---|
3xx - 리다이렉션 영구 리다이렉션 (1) | 2024.01.11 |
http상태코드, 2xx (0) | 2024.01.11 |