리다이렉트 사용 (Redirect)

yuzu sim's avatar
Jan 25, 2024
리다이렉트 사용 (Redirect)

리다이렉트란?

웹 페이지에서 "다른 페이지로 바로 가!"라고 명령을 내리는 것이라고 생각하자... 클라이언트가 특정 URL에 접근했을 때, 서버는 클라이언트에게 다른 URL로 이동하라는 상태 코드와 함께 응답. (302) 클라이언트는 이 상태 코드를 받으면 새로운 URL로 재요청을 보내고, 새로운 URL로 이동하게 된다. [ 리다이렉트는 주로 아래와 같은 경우에 사용된다 ] 1. 로그인 후에 사용자를 회원 전용 페이지로 이동시키는 경우 2. 웹 사이트의 URL이 변경되어 이전 URL을 새로운 URL로 자동으로 이동시키는 경우 3. 외부 사이트로 이동시키는 경우
notion image
메인 페이지를 그리지 않더라도(html 코드를 작성하지 않더라도) [ resp.sendRedirect("/main"); ] 이 코드를 사용하면 메인 페이지로 넘겨줄 것이다. (/join을 하면 /main으로 넘겨줄 것) 즉, http 요청이 2번 일어남 (회원가입하면 메인페이지로 넘어감)
💡
상태코드 200 = 정상 상태코드 300번대 (ex.302( = 리다이렉션 (니가 요청한게 아닌걸 돌려줄게)
 

1. 과정

→ 브라우저가 페이지를 요청
→ 서버가 응답
리다이렉션을 지시하기 위해 헤더에 Location 키를 사용
그 값으로 '/main'을 전달
→ 브라우저가 응답을 받음
헤더확인) HTTP 상태 코드 : 302
임시적인 리다이렉션이 일어났음을 알림
→ 브라우저는 302 상태 코드를 확인
헤더의 Location 값을 확인하여 새로운 주소로 이동해야 함을 확인
브라우저가 302를 보고 로케이션에 정보를 담아준 것을 확인
→ 브라우저는 새로운 주소로 재요청
→ 해당 주소에 대한 서버의 응답을 받음
💡
300번대에는 다양한 리다이렉션 상태 코드
 

2. 장점

  • 또 안 만들어도 됨
  • 있는 것을 재사용할 수 있음
package com.example.userapp.user; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.BufferedReader; import java.io.IOException; @WebServlet("/join") public class JoinServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setHeader("Content-type", "text/html; charset=utf-8"); //헤더에 바디를 설명 // username=ssar&password=1234&email=ssar@nate.com // BufferedReader br = req.getReader(); // String requestBody = ""; // while(true){ // String line = br.readLine(); // // if(line == null) break; // // requestBody = requestBody + line; // } // System.out.println(requestBody); // 1. 파싱 쉽게 하기 -> 커퍼에 키값을 찾아줌 String username = req.getParameter("username"); String password = req.getParameter("password"); String email = req.getParameter("email"); System.out.println("username : " + username); System.out.println("password : " + password); System.out.println("email : " + email); // 2. 유효성 검사(1000줄 정도 됨...) if(username.length() < 3 || username.length() > 10) { // 필터링으로 사용 resp.getWriter().println("<h1>username 글자수가 3~10 사이여야 합니다."); } // 3. DB연결 -> DAO에 연결하기 위함 // 4. DAO의 insert 메서드를 회출 // 5. 메인 페이지 그리기 // 6. 리다이렉트 : 내가 요청한 주소를 자기 안에 있는 다른 것을 응답해주는 것 resp.sendRedirect("/main"); // 톰캣이 만들어준 메서드 } }
notion image
 
  • 프로토콜에 없는 정도 같이 담기 → 응답 없음
  • HTTP 상태 코드 : 302
package com.example.userapp.user; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.BufferedReader; import java.io.IOException; @WebServlet("/join") public class JoinServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setHeader("Content-type", "text/html; charset=utf-8"); //헤더에 바디를 설명 // username=ssar&password=1234&email=ssar@nate.com // BufferedReader br = req.getReader(); // String requestBody = ""; // while(true){ // String line = br.readLine(); // // if(line == null) break; // // requestBody = requestBody + line; // } // System.out.println(requestBody); // 1. 파싱 쉽게 하기 -> 커퍼에 키값을 찾아줌 String username = req.getParameter("username"); String password = req.getParameter("password"); String email = req.getParameter("email"); System.out.println("username : " + username); System.out.println("password : " + password); System.out.println("email : " + email); // 2. 유효성 검사(1000줄 정도 됨...) if(username.length() < 3 || username.length() > 10) { // 필터링으로 사용 resp.getWriter().println("<h1>username 글자수가 3~10 사이여야 합니다."); } // 3. DB연결 -> DAO에 연결하기 위함 // 4. DAO의 insert 메서드를 회출 // 5. 메인 페이지 그리기 // 6. 리다이렉트 : 내가 요청한 주소를 자기 안에 있는 다른 것을 응답해주는 것 //resp.sendRedirect("/main"); // 톰캣이 만들어준 메서드 resp.setStatus(302); resp.setHeader("Location", "/main"); // 헤더에 정보 담기 resp.setHeader("clock", "12pm"); // 프로토콜이 없어서 안뜸 } }
 

리다이렉트 원리

리다이렉트는 주로 HTTP 응답(리스폰스) 헤더를 통해 이루어진다.
notion image
notion image
Status Code도 프로토콜이라 302 (300번대)가 적혀 있으면 "요청한 리소스가 다른 위치에 있으니 그곳으로 이동해!"라는 의미를 전달한다. 리다이렉션을 위해 HTTP Response Header에는 "Location"이라는게 필요하다. Location에는 클라이언트가 이동해야 할 새로운 URL이 포함되어있다. 예를 들어, "Location: /main"과 같이 설정하면 클라이언트는 "/main"이라는 URL로 이동하게 되는 것.
💡
* 리다이렉션을 하면 아까봤듯이 있는 동일한 코드를 재사용 할 수 있어서 좋다. * 리다이렉션=리다이렉트… 정도로만 알고 넘어가자. 개념은 비슷하다는 듯
💡
APP을 만들 때는 리다이렉션과 같은 기능을 직접 구현해야한다. Response Header에 상태 코드(Status Code)를 추가하려면 키값이 어떻게 돼? <내가 구현; (브라우저는 되어 있는데ㅠㅠ)
 
 

리다이렉트 코드

notion image

[ 1번 ]

resp.sendRedirect("/내가 이동하려는 uri");

[ 2번 ]

resp.setStatus(302); resp.setHeader("Location", "/내가 이동하려는 uri");
💡
1번을 쓰면 코드 1줄로 해결 2번을 쓰면 코드 2줄로 해결
 

 
Share article

Coding_study