1. Session이란
클라이언트 별로 서버에 저장되는 정보.
사용자 컴퓨터에 저장되던 쿠키와 다르게 서버에 저장된다.
서버가 종료되거나 유효기간이 지나면 사라진다.
1-1. 세션 이용 방법
웹 클라이언트가 서버에게 요청을 보내면 서버는 클라이언트를 식별하는 session id를 생성한다.
서버는 session id로 key와 value를 저장하는 Httpsession을 생성하고, session id를 저장하고있는 쿠키를 생성하여 클라이언트한테 전송한다.
클라이언트는 서버 측에 요청을 보낼 때, session id를 가지고 있는 쿠키를 전송한다.
서버는 쿠키의 session id로 Httpsession을찾는다.
javax.servlet.http.HttpSession으로 세션 데이터를 다룰 수 있다.
1-2. 세션 생성 및 얻기
HttpSession session = reuqest.getSession();
HttpSession session = request.getSession(ture);
requset의 getSession()메서드는 서버에 생성된 세션이 있다면 세션을 반환하고, 없다면 세 세션을 생성하여 반환한다.
(인수가 default가 true)
새롭게 생성된 세션인지는 HttpSession의 isNew() 메서드로 알 수 있다.
HttpSession session = request.getSession(false);
requst의 getSession()메서드의 피라미터로 false를 전달하면 이미 생성된 세션이 있을 때 그 세션을 반환하고 없으면 null을 반환한다.
1-3. 세션에 값 저장하기
setAttribute(String name, Object value)
setAttribute는 name,value 쌍으로 객체 Object를 저장하는 메서드다.
session.setAttribute(이름, 값)
이렇게 사용할 수 있다.
1-4. 세션 값 조회하기
getAttribute(String name)
getAttribute 메서드로 세선에 저장된 값을 조회할 수 있다.
리턴 타입은 Object이므로 형변환이 필요하다.
메서드 setAttribute에 이용한 name을 알고 있으면 다음과 같이 조회할 수 있다.
String value = (String)session.getAttribute("name");
1-5. 세션 값 삭제하기
removeAttribute(String name);
removeAttribute 메서드로 name값에 해당하는 세션 정보를 삭제할 수 있다.
invalidate();
invalidate로 모든 세션을 한 번에 삭제할 수 있다.
1-6. 세션 유지 시간 설정하기
기본적으로 세션은 30분 유지된다.
세션 유지 시간은 서버에 접속한 후 서버에 요청을 하지 않는 최대 시간을 말한다.
30분 이상 서버에 전혀 반응을 보이지 않으면, 세션이 자동을 끊어진다.
이 세션 유지 시간은 web.xml 파일에서 설정할 수 있다.
1-7. 예제는 하단에 정리함.
2. Cookie와 Session을 사용하는 이유
HTTP프로토콜의 특징이자 약점을 보완하기 위해 사용한다.
먼저 http프로토콜의 특징이자 약점을 살펴보자.
2-1. HTTP프로토콜의 특징과 약점
1. Connectionless. Protocol 비연결지향
클라이언트가 서버에 요청했을때, 그 요청에 맞는 응답을 보낸 후 연결을 끊는 처리방식.
2. Stateless Protocol (상태정보 유지안함)
클라이언트의 상태정보를 가지지 않는 서버처리방식.
클라이언트와 첫번째 통신에서 데이터를 주고받았다 해도, 두번째 통신에서 이전데이터를 유지하지 않는다.
BUT, 실제로는 데이터유지가 필요한 경우가 많다.
정보가 유지되지 않으면 매번 페이지 이동시 마다 로그인을 해야하거나 장바구니에서 상품을 선택했는데 구매페이지에서 상품의 정보가 사라지거나 하는 경우가 발생할 것이다.
이 때문에 Stateful 경우를 대처하기 위해서 쿠키와 세션을 사용한다.
서버와 클라이언트 통신 시 통신이 연속적으로 이어지지 않고 한번 통신 후 끊어지게 된다. 따라서 서버는 클라이언트가 누구인지 계속 인증을 해야하는데 이는 매우 귀찮고 번거로운 일이기도 하고 웹페이지의 로딩을 느리게한다.
이러한 문제점을 해결하는 방법이 쿠키와 세션이다.
즉, 클라이언트와 서버 통신시 정보를 유지하기 위해 사용하는 것이 쿠키와 세션이다.
2-2. 쿠키와 세션 차이점
세션이 쿠키에 비해 보안이 높지만 쿠키를 사용하는 이유는 세션은 서버에 저장되어
서버자원을 사용하기 때문에 사용자가 많을 경우 소모되는 자원이 상당하다.
이러한 자원관리 차언에서 쿠키와 세션을 적절히 병행사용하여 서버지원의 낭비를 줄이고
웹사이트의 속도를 높일 수 있다.
더욱 자세한 세션과 쿠키내용을 알고싶다면 하단의 링크를 참고하자.
(1-7. 예제) Spring MVC에서 Session 사용 방법
Spring MVC에서 @SessionAttribyue와 @ModeAttribute 애노테이션으로 세션에 값을 저장하고 가져오는 방법을 아래 예제들로 이해해보자.
@SessionAttribyue 파라미터로 지정된 일므과 같이 이름이 @ModeAttribute에 지정되어 있으면 @ModeAttribute가 설정된 메서드가 반환되는 값을 그 세선에 저장한다.
1)컨트롤러 클래스 위에 @SessionAttribute를 선언하고, @ModeAttribute는 메서드 위에 선언한다.
@Controller
@SessionAttribute("user")
public class LoginController{
@ModeAttribute("user")
public User setUserFrom() {
return new User();
}
}
이 예제를 보면,
@SessionAttribute의 파라미터로 저장된 일므은 user이다 @ModeAttribute의 파라미터로 지정된 이름 역시 user이다.
둘의 이름이 같으므로, setUserFrom 메소드가 반환하는 User 객체는 user라는 일므의 세션에 저장된다.
위 코드는 새 객체를 반환하여 저장시키므로 해당 세션 값을 초기화하는 목적으로 사용할 수 있다.
2)SessionAttributes를 컨트롤러 클래스를 위에 선언하고 메서드 파라미터로 @ModeAttribute를 불러온다.
@Controller
@SessionAttribute("user") {
@PostMapping("/dologin")
public String doLogin(@ModelAttribute("user") User user, Model model) {
...
}
}
@SessionAttribute이름과 @ModeAttribute의 이름은 같다.
클라이언트로부터 전송받은 user같이 그 세션에 저장된다.
#메소드에 @SessionAttribute가 있을경우 피라미터로 지정된 이름으로 등록된 세션 정보를 읽어와 변수에 할당한다.
@GetMapping("/info")
public String userInfo(@SessionAttribute("user") User user {
...
return "user";
}
@)@SessionStatus @SessionAttribute에 의해 저장된 오브젝트를 제거할 수 있다.
SessionStatus는 컨트롤러 메서드의 파라미터로 사용할 수 있느 스프링 내장 타입니다.
@Controller
@SessionAttributes("user")
public class UserController {
@RequestMapping(value="/user/add", method=RequestMethod.POST)
public String submit(@ModelAttribute("user") User user, SessionStatus sessionStatus) {
...
sessionStatus.setComplete();
...
}
}
SessionStatus의 setComplete 메서드로 user라는 이름의 세션 값을 제거한다.
5)Spring MVC의 form tag라이브러리 사용하기
<form:form action="login" method="post" modelAttribute="user">
Email : <form:input path="email" /><br>
Password : <form:password path="password" /><br>
<button type="submit">Login</button>
</form:form>
modeAttribute 속성으로 지정된 이름의 객체를 세션에서 읽어와, form 태그로 설정된 태그에 값을 설정한다.
참고한 블로그
'개발공부 > Server' 카테고리의 다른 글
[aws] 데이터베이스 RDS만들고 mysql과 연결하기 (0) | 2021.12.20 |
---|---|
Get과 Post방식 (0) | 2021.09.14 |
[서버] WEB과 WAS를 알아보자. (0) | 2021.03.01 |
댓글