홈페이지를 구현하는 중, 로그인 시에 사용하는 HttpServletRequest와 HttpSession에 대해 궁금해졌다.
일단 Http프로토콜은
-연결상태유지X
-요청단위로 Connection
-이전 페이지에서 수집한 데이터를 다음페이지에서 사용X
-다음 페이지에서도 이전 페이지의 데이터를 유지하기 위해선 어딘가 저장해놓고 유지시켜놓아야함
-저장소 : HttpServletRequest , HttpSession, ServletContext
-저장 :setAttribute(name,value)
-추출 : getAttribute(name)
-삭제:removeAttribute(name)
-각 저장소의 차이점: 메모리에서 살아있는 기간이 다름
HttpSession | HttpServletRequest |
생성 : Client 최초 접속 시 제거 : Client 접속 종료 시 Client가 접속 중인 동안에만 존재 |
생성 : Client가 요청 시 삭제 : Server가 응답 시 Request 중인 동안에만 존재 |
로그인/로그아웃 장바구니 등 |
*요청 재지정 |
평소 Http프로토콜에 대해 모르더라도 간단한 게시판이라도 구현해본 사람은 쉽게 이해할 수 있을 것이라고 생각한다.
아래는 HttpServletRequest로 세션을 연결하는 방법과 HttpSession으로 로그아웃하는 방법이다.
@RequestMapping(value="/login",method=RequestMethod.POST)
public String login(MemberVO vo, HttpServletRequest req, RedirectAttributes rttr) throws Exception{
logger.info("post login");
HttpSession session = req.getSession(); //값을 받고
MemberVO login = service.login(vo);
if(login == null) {
session.setAttribute("memeber", null);
rttr.addFlashAttribute("msg", false);
}else {
session.setAttribute("member", login); //set으로 세션생성
}
return "redirect:/";
}
@RequestMapping(value="logout", method=RequestMethod.GET)
public String logout(HttpSession session) throws Exception{
session.invalidate();
return "redirect:/";
}
스프링에서, 컨트롤러의 로그인과 로그아웃 부분이다.
HttpServletRequest 오브젝트의 set,getSession 메소드를 통해 세션을 만들었다.
HttpServletRequest는 파라미터를 HttpServletRequest -> getSession으로 받고 set을 통해 세션을 얻는다.
HttpSession은 클라이언트의 최초 요성시 생성되고, 클라이언트당 한개가 생성되고
파라미터로 HttpSession을 받아 그대로 사용한다.
로그아웃 부분에서는
HttpSession 객체를 무효화하는 invalidate()가 호출되어 HttpSession 객체가 삭제된 후,
다시 로그인 부분에서 새로운 요청이 들어오면 Session 객체가 새로 생성된다.
그리고 HttpSession은 Spring이나 라이브러리에서 만드는게 아니라,
Servlet Contatiner에서 만든다. 서블릿 컨테이너란 무엇이냐?쉽게말해 톰켓과 같은 WAS이다.
HttpSession은 서블릿 컨테이너에서 생성한 인스턴스이다.
스프링에선 세션을 주입해야 할 때, 내부적으로 Servlet Container에게 Session을 달라고 한다.
위의 login 메소드가 호출될때 즉시 세션이 요청 / 생성되고
Tomcat의 경우 이 SessionID를 JSESSIONID라는 키의 쿠키로 생성/전달한다.
그 후 로그인 이후의 플로우처럼 세션을 유지하기 위해서는
- 서버의 로그인로직에서 로그인이 성공하면 발급받은 SessionId를 클라이언트에게 돌려주고,
- 클라이언트는 이후 요청을 할 때, 서버로부터 받았던 SessionId를 함께 넘겨준다.
- Servlet Container에서는 Request에 SessionId가 있으면 Session을 새로 발급하지 않고 전달받은 SessionId와 매핑되는 기존의 Session을 할당해준다.
1.브라우저(클라이언트,뷰)에서 로그인요청(로그인 정보와 함께)
2.서버에서 로그인 정보가 일치하면 세션을 생성해주고, 그 세션에 key-value형식으로 로그인 정보를 저장한다.(setAttrubute)
3.서블릿 컨테이너는 현 요청에서 세션을 사용하고 있으면,HttpResponse의 쿠키에 세션ID를 넣어준다.
4.브라우저는 쿠키에 담긴 정보를 그대로 다음 요청의 쿠키에 넣어준다. value값과 매칭되는 기존의 세션을 연결해준다.
주요 세션메소드
메소드 이름 | 리턴 타입 | 설명 |
getAttribute(String name) | java.lang.Object | 세션 속성명이 name인 속성의 값을 Object 타입으로 리턴한다. 해당 되는 속성명이 없을 경우에는 null 값을 리턴한다. |
getAttributeNames() | java.util.Enumeration | 세션 속성의 이름들을 Enumeration 객체 타입으로 리턴한다. |
getCreationTime() | long | 1970년 1월 1일 0시 0초를 기준으로 하여 현재 세션이 생성된 시간까지 경과한 시간을 계산하여 1/1000초 값으로 리턴한다. |
getId() | java.lang.String | 세션에 할당된 고유 식별자를 String 타입으로 리턴한다. |
getMaxInactiveInterval() | int | 현재 생성된 세션을 유지하기 위해 설정된 세션 유지시간을 int형으로 리턴한다. |
invalidate() | void | 현재 생성된 세션을 무효화 시킨다. |
removeAttribute(String.name) | void | 세션 속성명이 name인 속성을 제거한다. |
setAttribute(String name, Object value) | void | 세션 속성명이 name인 속성에 속성값으로 value를 할당한다. |
setMaxInactiveInterval(int interval) | void | 세션을 유지하기 위한 세션 유지시간을 초 단위로 설정한다. |
'SPRING > Spring' 카테고리의 다른 글
[스프링]HTTP프로토콜과 URI를 통한 요청 (0) | 2021.09.08 |
---|---|
DataAccessException 란? -Spring 예외처리 (0) | 2021.08.12 |
UriComponents과 URLEncoding (0) | 2021.07.31 |
AOP를 이용한 트랜잭션 구현 중 트랜잭션이 먹지 않는 현상과 메모리누수경고(Memory leak)=(톰캣구동안됨) 404에러 해결 (0) | 2021.07.21 |
스프링 게시글 글쓰기 및 수정, ModelAttribute와 RedirectAttributes의 사용 (0) | 2021.07.20 |