상세 컨텐츠

본문 제목

[JAVA] 세션(Session)이란(동작원리)

카테고리 없음

by 개발성훈 2020. 8. 10. 14:06

본문

세션은 클라이언트 별로 서버에 저장되는 정보이다.

사용자 컴퓨터에 저장되던 쿠키와 다르게 서버에 저장되므로, 비교적 보안이 필요한 데이터는 쿠키보다 세션에 저장한다.

 

서버가 종료되거나 유효기간이 지나면 사라진다.

 

1.세션 이용 방법

 

웹 클라이언트가 서버에게 요청을 보내면 서버는 클라이언트를 식별하는 session id를 생성한다.

서버는 session id로 key와 value를 저장하는 Httpsession을 생성하고, session id를 저장하고있는 쿠키를 생성하여 클라이언트한테 전송한다.

 

클라이언트는 서버 측에 요청을 보낼 때, session id를 가지고 있는 쿠키를 전송한다.

 

서버는 쿠키의 session id로 Httpsession을찾는다.

 

javax.servlet.http.HttpSession으로 세션 데이터를 다룰 수 있다.

 

1)세션 생성 및 얻기 

HttpSession session = reuqest.getSession();
HttpSession session = request.getSession(ture);

requset의 getSession()메서드는 서버에 생성된 세션이 있다면 세션을 반환하고, 없다면 세 세션을 생성하여 반환한다.

(인수가 default가 true)

 

새롭게 생성된 세션인지는 HttpSession의 isNew() 메서드로 알 수 있다.

 

HttpSession session = request.getSession(false);

requst의 getSession()메서드의 피라미터로 false를 전달하면 이미 생성된 세션이 있을 때 그 세션을 반환하고 없으면 null을 반환한다.

 

2) 세션에 값 저장하기

 

setAttribute(String name, Object value)

setAttribute는 name,value 쌍으로 객체 Object를 저장하는 메서드다.

 

session.setAttribute(이름, 값)

이렇게 사용할 수 있다.

 

3) 세션 값 조회하기 

getAttribute(String name)

getAttribute 메서드로 세선에 저장된 값을 조회할 수 있다.

리턴 타입은 Object이므로 형변환이 필요하다.

메서드 setAttribute에 이용한 name을 알고 있으면 다음과 같이 조회할 수 있다.

 

String value = (String)session.getAttribute("name");

 

4) 세션 값 삭제하기

 

removeAttribute(String name);

removeAttribute 메서드로 name값에 해당하는 세션 정보를 삭제할 수 있다.

invalidate();

invalidate로 모든 세션을 한 번에 삭제할 수 있다.

 

5) 세션 유지 시간 설정하기

 

기본적으로 세션은 30분 유지된다.

 

세션 유지 시간은 서버에 접속한 후 서버에 요청을 하지 않는 최대 시간을 말한다.

 

30분 이상 서버에 전혀 반응을 보이지 않으면, 세션이 자동을 끊어진다.

이 세션 유지 시간은 web.xml 파일에서 설정할 수 있다.

 

2.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 태그로 설정된 태그에 값을 설정한다.