티스토리 뷰

HTTP

클라이언트와 서버가 통신 할 때 이용하는 프로토콜인 HTTP비상태 프로토콜(stateless Protocol)이다. 즉, 클라이언트-서버 간의 요청-응답이 이루어졌을 때, 서버는 클라이언트에 관한 어떠한 상태정보도 저장하지 않는다. 

 

이러한 특징은 서버가 클라이언트와의 연결을 유지하는데 소모되는 자원낭비를 줄일 수 있지만, 로그인 상태 유지, 장바구니와 같이, 연결정보를 유지해야 하는 기능을 구현하는데 어려움이 있다. 이를 해결하기 위한 두 가지 방법으로 세션쿠키가 있다.

 

세션서버에서 사용자 정보를 관리하는 반면, 쿠키클라이언트가 사용자 정보를 관리한다. 쿠키를 이용하면 서버의 부하를 줄일 수 있지만, 보안적인 측면에서 취약할 수 있기 때문에 주로 장바구니, 팝업 보지않음과 같은 민감하지 않은 정보를 담는데 사용된다.

 

 

Controller에서 세션 활용하기

HttpServletRequest 또는 HttpSession을 이용해 세션을 가져올 수 있다. 

HttpServletRequest

@RequestMapping(value = "/login", method = RequestMethod.POST)
public String memLogin(Member member, HttpServletRequest request) {

    Member mem = service.memberSearch(member);	

    HttpSession session = request.getSession();
    session.setAttribute("member", mem);	

    return "/member/loginOk";
}

로그인 요청(/login)이 들어오면 커맨드객체(Member)HttpServletRequest가 인자로 들어온다.

getSession() 메소드를 통해 요청에 대한 세션을 가져올 수 있다. 이후 setAttribute를 이용해 "memeber"라는 name에 커맨드 객체에서 정보를 추가한다.

 

HttpSession

@RequestMapping(value = "/login", method = RequestMethod.POST)
public String memLogin(Member member, HttpSession session) {

    Member mem = service.memberSearch(member);

    session.setAttribute("member", mem);

    return "/member/loginOk";
}

HttpSession을 이용하면 getSession 메소드를 이용하지 않아도 바로 세션을 다룰 수 있다. HttpServletRequest와 세션 객체를 얻어오는 방법외에 거의 차이가 없다.

 

세션 삭제

session.invalidate();

로그아웃 또는 회원탈퇴시 사용한다.

 

 

세션 주요 메소드

  • getId() : 세션 ID 반환
  • setAttribute() : 세션 객체에 속성 저장
  • getAttribute() : 세션 객체에 저장된 속성 반환
  • removeAttribute() : 세션 객체에 저장된 속성 제거
  • setMaxInactiveinterval() : 세션 객체 유지시간 설정
  • getMaxInactiveinterval() : 세션 객체 유지시간 반환
  • invalidate() : 세션 객체의 정보 삭제

 

Controller에서 쿠키(Cookie) 활용하기

사용자의 접속을 제한하거나 사용자에 따라 컨텐츠를 제공하기 원할 때, 웹 사이트를 통해 사용자를 확인(식별)할 필요가 있을 때 쿠키를 이용할 수 있다. 서버쿠키를 만들어 클라이언트에 보내면 클라이언트는 이후 요청(Request)을 보낼 때 헤더에 쿠키를 함께 보낸다. 서버는 쿠키를 참조해 사용자를 식별할 수 있다.

 

쿠키는 도메인(웹 페이지)당 최대 20개를 가질 수 있으며 하나의 쿠키는 최대 4KB까지 저장할 수 있다.

 

쿠키 생성

@RequestMapping("/main")
public String mallMain(Mall mall, HttpServletResponse response){

    Cookie genderCookie = new Cookie("gender", mall.getGender()); 

    if(mall.isCookieDel()) { 	   //쿠키를 삭제하는 옵션 체크여부
        genderCookie.setMaxAge(0); 
        mall.setGender(null);
    } else {
        genderCookie.setMaxAge(60*60*24*30); //s * m * h * d = 한 달
    }
    response.addCookie(genderCookie);

    return "/mall/main";
}

쿠키를 보내기 위해 HttpServletResponse 객체가 필요하며, new 연산자를 통해 쿠키를 생성할 수 있다. 인자로는 ("쿠키이름", 값) 이 매핑되며 setMaxAge() 메서드를 통해 쿠키의 기한(초)을 설정해준 뒤 addCookie()메소드로 응답에 담아 보내면 된다.

만약 쿠키를 제거하고 싶다면 setMaxAge() 값을 0으로 지정한다. 

 

쿠키 가져오기

@RequestMapping("/index")
public String mallIndex(Mall mall, 
        @CookieValue(value="gender", required=false) Cookie genderCookie, 
        HttpServletRequest request) {

    if(genderCookie != null) 
        mall.setGender(genderCookie.getValue());

    return "/mall/index";
}

@CookieValue 어노테이션을 통해 gender 이름을 가진 쿠키를 가져올 수 있다. required=false를 지정해주면 쿠키가 존재하지 않는 경우 익셉션을 방지할 수 있다. 

 

request.getCookies() 메소드를 이용해 쿠키들을 배열에 모두 담아온 뒤, 반복문과 getName()메서드를 통해 gender라는 이름을 가진 쿠키를 찾았을 때 동작하는 코드를 사용할 수도 있다.

 

 

 

 

출처 : [인프런] 자바 스프링 프레임워크(renew ver.) - 신입 프로그래머를 위한 강좌

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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
글 보관함