본문 바로가기
SPRING

로그인시 사용하는 HttpServletRequest와 HttpSession

by brilliant-growth 2023. 11. 13.

Http프로토콜은

-연결상태유지X

-요청단위로 Connection

-이전페이지에서 수집한 데이터를 다음페이지까지 사용X

-다음페이지에서도 이전페이지의 데이터를 유지하기 위해선 어딘가 저장해놓고 유지시켜야함

-저장소: HttpServletRequest,HttpSession,ServletContext

-저장: setAttribute(name,value)

-추출: getAttribute(name)

-삭제: removeAttribute(name)

-각 저장소의 차이점: 메모리에서 살아 있는 기간이 다름

 

 

HttpSession

생성: 클라이언트 최초 접속시

제거: 클라이언트 접속 종료시

클라이언트가 접속 중인 동안에만 존재

●로그인/로그아웃 장바구니 등

 

HttpServletRequest

생성: 클라이언트가 요청시

삭제: 서버가 응답시

Request중인 동안에만 존재

●요청 재지정

 

@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을 받아 그대로 사용한다

다시 로그인부분에서 새로운 요청이 들어오면 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형식으로 로그인 정보를 저장한다(setAttribute)

3.서블릿 컨테이너는 현 요청에서 세션을 사용하고 있으면 ,HttpRespnse의 쿠키에 세션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  세션을 유지하기 위한 세션 유지시간을 초 단위로 설정한다. 

 

 

출쳐)

https://kimfk567.tistory.com/19?category=998239