포스트

Day71 Java프로그래밍 기초(HTTP)

Web 보관소

1. Web 보관소의 종류

  • ServletContext : 웹 애플리케이션이 실행되는 동안 모든 서블릿과 JSP가 공유할 수 있는 저장 공간
  • HttpSession : 각 사용자가 웹 애플리케이션에 접속할 때마다 생성되는 사용자별 세션
  • ServletRequest : 클라이언트가 서버에 요청을 보낼 때 해당 요청과 관련된 정보를 저장하고 전달하는 객체

image

2. Web 보관소에 값 저장하기

1) ServletContext

  • 애플리케이션이 시작될 때 생성되고 종료될 때까지 유지된다.
  • 모든 사용자와 요청에 대해 공유한다.
  • 주로 애플리케이션 수준의 설정 정보, 데이터베이스 연결 정보 등을 저장한다.

    1
    2
    
      ServletContext ctx = getServletContext();
      ctx.setAttribute("key","value");
    

2) HttpSession

  • 사용자별로 생성되고, 각 사용자는 고유한 세션 ID를 가진다.
  • 세션은 일정 시간 동안 유지되며, 세션 만료 시간이 지나거나 사용자가 로그아웃하면 삭제된다.
  • 주로 사용자 인증 정보나 개인화된 정보를 저장한다.

    1
    2
    
      HttpSession session = request.getSession();
      session.setAttribute("key","value");
    

3) ServletRequest

  • HTTP 요청마다 새로운 ServletRequest 객체가 생성된다.
  • 요청에 관련된 데이터(예: 폼 데이터, 쿼리 스트링 파라미터)를 저장하고 관리한다.
  • 다른 서블릿이나 JSP로 요청을 전달할 때, 데이터를 함께 전달하는 데 사용할 수 있다.

    1
    
      request.setAttribute("key","value");
    

3. Web보관소에서 값 꺼내기

  • 각 보관소를 호출 한뒤 getAttribute("key")를 호출하면 된다.
  • forward 와 include 해서 다른 Servlet에 위임하여도 모두 호출 가능하다.

    1
    2
    3
    
      String value = (String) ctx.getAttribute("key")
      String value = (String) session.getAttribute("key")
      String value = (String) request.getAttribute("key")
    

    image

Cookie

1. 쿠키의 정의

  • 웹서버가 웹브라우저에게 맡기는 데이터이다.
  • 응답할 때 응답 헤더에 포함시켜 보낸다.
  • 웹브라우저는 응답헤더로 받은 쿠키 데이터를 보관하고 있다가 지정된 URL을 요청할 때 요청 헤더에 포함시켜 웹 서버에게 쿠키를 다시 보낸다.

2. 클라이언트에 쿠키 보내기

  • 클라이언트가 요청한 Servlet에서 쿠키이름과 값으로 생성한다.
  • 쿠키의 유효기간을 설정하지 않으면 웹브라우저가 종료될 때 까지 유지된다. 웹브라우저를 종료하면 유효기간이 지정되지 않은 쿠키는 모두 삭제된다.
  • 쿠키의 사용범위를 지정하지 않으면 현재 경로에 한정한다.
  • 쿠키를 보낼 때의 URL이 /ex10/s1 이라면, 웹브라우저는 /ex10/* 경로를 요청할 때만 웹서버에게 쿠키를 보낸다.
  • 값은 반드시 문자열이어야 한다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    Cookie c1 = new Cookie("name", "hong");
    Cookie c2 = new Cookie("age", "20");
    Cookie c3 = new Cookie("working", "true");
    // => 또한 값은 반드시 ISO-8859-1 이어야 한다.
    //    만약 UTF-8을 보내고 싶다면 URL 인코딩 같은 기법을 사용하여
    //    ASCII 코드화시켜 보내야 한다.
    Cookie c4 = new Cookie("name2", "홍길동");
    Cookie c5 = new Cookie("name3", URLEncoder.encode("홍길동", "UTF-8"));
    // 쿠키를 응답 헤더에 포함시키기
    response.addCookie(c1);
    response.addCookie(c2);
    response.addCookie(c3);
    response.addCookie(c4);
    response.addCookie(c5);
    

    image

3. 서버에 쿠키 받기

  • 쿠키를 배열로 한번에 받아서 추출해야한다.
  • 쿠키가 없을 때의 return값은 null이기 때문에 사용전에 유효성 검증을 해야한다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    Cookie[] cookies = request.getCookies();
      
    response.setContentType("text/plain;charset=UTF-8");
    PrintWriter out = response.getWriter();
      
    if (cookies != null) {
      for (Cookie c : cookies) {
        // 쿠키 값이 'URL 인코딩'한 값이라면
        // 개발자가 직접 디코딩 해서 사용해야 한다.
        // 쿠키 값에 대해서는 서버가 자동으로 디코딩 해주지 않는다.
        out.printf("%s=%s,%s\n",
            c.getName(),
            c.getValue(),
            URLDecoder.decode(c.getValue(), "UTF-8"));
      }
    }
    

    image

4. 쿠키 유효기간 설정하기

  • 유효기간을 설정하지 않으면 웹브라우저가 실행되는 동안에만 웹서버에게 쿠키를 보낸다.
  • 웹 브라우저는 메모리에 쿠키를 보관한다.
  • 유효기간을 설정하면 웹브라우저를 종료해도 삭제되지 않는다. 단 유효기간이 지나면 웹서버에 보내지 않고 삭제한다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    Cookie c1 = new Cookie("v1", "aaa");
    Cookie c2 = new Cookie("v2", "bbb");
    c2.setMaxAge(30); // 쿠키를 보낸 이후 30초 동안만 유효
      
    Cookie c3 = new Cookie("v3", "ccc");
    c3.setMaxAge(60); // 쿠키를 보낸 이후 60초 동안만 유효
      
    response.addCookie(c1);
    response.addCookie(c2);
    response.addCookie(c3);
    

    image

5. 쿠키 사용범위 설정하기

  • 쿠키의 사용 범위를 지정하지 않으면 쿠키를 발행한 URL 범위에 한정된다. 같은 URL로 요청할 때만 쿠키를 보낸다.
  • 쿠키를 /ex10/s21에서 발행햇다면 클라이언트가 쿠키를 보내는 범위는 /ex10/*이다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    Cookie c1 = new Cookie("v1", "aaa");
      
    Cookie c2 = new Cookie("v2", "bbb");
    c2.setPath("/ex10/a");
      
    Cookie c3 = new Cookie("v3", "ccc");
    c3.setPath("/");
      
    response.addCookie(c1);
    response.addCookie(c2);
    response.addCookie(c3);
    

    image

6. 세션 생성

  • 클라이언트가 접속하면 웹 서버는 그 클라이언트를 위한 고유 번호를 발급(쿠키 이용)한다.
  • 웹 브라우저는 세션 아이디를 쿠키에 보관해 두었다가 서버에 요청할 때 마다 세션 아이디를 보낸다.
  • 새 세션을 생성할 때 세션 아이디를 발급한다.
  • 세션이 없거나 유효기간이 지난 경우, request.getSesssion()을 호출하면 생성한다.

    image

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.