세션(session)

뫄뫄(ahk)·2022년 8월 19일
0

Spring

목록 보기
18/18

세션이란?

a collection of related HTTP transactions made by one browser to one server

  • 관련이 있지만 서로 독립적인 요청, 응답들을 하나로 묶은 것이 세션이다.
  • 관련된 요청과 응답이란 하나의 브라우저와 하나의 서버 사이에서 이루어진것을 의미한다.
  • HTTP요청은 stateless라서 각각이 독립적인 요청이다. 따라서 서버에서는 모든 요청이 관련없는, 새로운 요청이다.

요청, 응답들을 묶을 때는 브라우저에 저장되는 쿠키를 사용한다.
세션의 사용과정을 들여다보면,
1. 브라우저에서 서버에 첫 요청을 보내면
2. 서버는 세션 저장소를 생성하고 고유한 sessionID를 쿠키에 담아(또는 url에 붙여) 응답헤더로 보낸다.
3. 브라우저는 자신이 가지고 있는 쿠키들 중에 저장된 path와 domain이 요청을 보낼 서버의 것과 일치하는 쿠키가 있다면 요청에 그 쿠키를 담아서 보낸다.
4. 서버는 돌아온 쿠키의 sessionID를 통해 브라우저를 식별한다.
5. 그 sessionID를 통해 세션저장소를 사용할 수 있다.

세션 객체 얻기

HttpSession session = request.getSession();
session.setAttribute("id","asdf");

세션의 종료

세션을 수동으로 종료하기 위해서는 아래와 같은 메서드를 사용할 수 있다.
두 번째 메서드는 예약종료가 가능하다.
시간 설정은 초단위.

session.invalidate();
session.setMaxInactiveInterval(60*60); 

세션을 자동으로 종료할 수 있다. 세션은 브라우저마다 생성되므로 서버에 부담이 되기 때문에 자동 종료를 설정해서 최대한 자원의 낭비를 막는 것이좋다. 시간의 설정은 분단위.

<session-config>
	<sesssion-timeout>30</session-timeout>
</session-config>

쿠키와 세션의 비교

  • 쿠키는 브라우저에 저장되어 서버에 부담을 주지 않고 서버 다중화에 유리하다. 하지만 저장되는 장소가 브라우저니까 서버보다 보안에 불리하다.

  • 세션은 서버에 저장되어 세션이 많아질 수록(=접속자가 많아질 수록) 서버에 부담이 되고 브라우저에 저장되는 쿠키보다 보안에 유리하다. 그러나 서버가 여러대인 경우 요청이 여러 서버에 분산되어 동기화가 필요하기 때문에 서버 다중화에 불리하다.

브라우저에서 쿠키를 허용하지 않으면 어떻게될까?

  • 브라우저가 첫 요청을 보낼 때 서버는
  1. 모든 url에 sessionID를 같이 붙여 보내고(<c:url ... />이 자동추가)
  2. 브라우저에 sessionID를 쿠키에 담아 응답 헤더로 보낸다.

브라우저가 쿠키를 허용하지 않을 수 있어서 위의 두 가지 방법으로 sessionID를 보낸다.
(쿠키를 허용하지 않으면 url때문에 응답양이 많아진다.)

  • <c:url ... />이 모든 url에 sessionID를 자동추가 해주는데, 만약 이 태그를 사용하지 않고 url을 하드코딩했다면.. 브라우저의 모든 요청이 서버측에는 새로운 요청이되어 server는 매번 session객체를 새로 생성하는 사태가 벌어진다.
profile
NONONONONONOYes!

0개의 댓글