[Web] 세션을 이용한 웹 페이지 연동 기능

2024. 8. 19. 18:25자바 웹 개발/세션 쿠키 필터 리스너

세션도 웹 페이지 사이의 공유 정보를 서버에 저장해두고 페이지를 매개한다는 점에서 쿠키와 같다. 하지만, 쿠키는 클라이언트에 저장되어 노출이 쉬운 반면에 세션은 서버 메모리에 저장된다. 따라서 보안이 요구되는 정보는 세션을 이용하는 것이 좋다. 세션은 각 브라우저당 한 개가 생성된다. 다만, 서버에 부하를 줄 수 있다는 단점이 있다. 

 

세션 기능 실행 과정

브라우저가 서버에 최초 접속하면 세션 객체를 생성한 후 세션 객체에 대한 세션 id를 브라우저에 전송한다. 브라우저는 이 세션 id를 세션 쿠키에 저장한다. 쿠키 이름은 jsessionId이다. 재접속하여 세션 쿠키에 저장된 세션 id를 다시 서버로 전송하면 서버는 전송된 세션 id를 이용해 세션 객체에 접근하여 작업을 수행한다. 

 

과정은 다음과 같다. 

1. 브라우저로 사이트에 접속한다. 

2. 서버에 접속한 브라우저에 대한 세션 객체를 생성한다.

3. 서버는 생성된 세션 id를 클라이언트 브라우저에 응답한다. 

4. 브라우저는 서버로부터 받은 세션 id를 브라우저가 사용하는 메모리의 세션 쿠키에 저장한다.

5. 브라우저가 재접속하면 브라우저는 세션 쿠키에 저장된 세션 id를 서버에 전달한다. 

6. 서버는 전송된 세션 id를 이용해 해당 세션에 접근하여 작업을 수행한다. 

 

즉, 서버는 브라우저에 저장된 세션 id와 그 값을 통해 브라우저를 구분하여 작업을 수행한다. 

 

세션 API의 특징과 기능

세션을 이용하려면 HttpSession 클래스 객체를 생성해서 사용해야 한다. HttpSession 객체는 HttpServletRequest의 getSession() 메서드를 호출해서 생성한다. 

 

getSession() : 기존의 세션 객체가 존재하면 반환하고, 없으면 생성한다. 

getSession(true) : 기존의 세션 객체가 존재하면 반환하고, 없으면 새로 생성합니다. 

getSession(false) : 기존의 세션 객체가 존재하면 반환하고, 없으면 null을 반환한다. 

 

HttpSession 클래스 메서드는 다음과 같다. 

반환타입 메서드 설명
Object getAttribute(String name) 속성 이름이 name인 경우 속성 값을 object 타입으로 반환한다. 없으면 null을 반환
Enumeration getAttributeNames() 세션 속성 이름들을 Enumeration 객체 타입으로 반환한다. 
long getCreationTime() 1970년 1월 1일 0시 0초를 기준으로 현재 세션이 생성된 시간까지 경과한 시간을 계산하여 1/1000초 값으로 반환한다. 
String getId() 세션에 할당된 고유 식별자를 String 타입으로 반환한다. 
int getMaxInactiveInterval() 현재 생성된 세션을 유지하기 위해 설정된 세션 유지 시간을 int 타입으로 반환한다.
void invalidate() 현재 생성된 세션을 소멸한다. 
boolean isNew() 최초로 생성된 세션인지 기존에 생성되어 있었던 세션인지 판별합니다.
void removeAttribute(String name) 세션 속성 이름이 name인 속성을 제거합니다.
void setAttribute(String name, Object value) 세션 속성 이름이 name인 속성에 속성 값으로 value를 할당한다. 
void  setMaxInactiveInterval(int interval) 세션 유지하기 위한 세션 유지 시간을 초 단위로 설정한다. 
long getLastAccessedTime() 세션 객체에 가장 최근에 접근한 시간을 가져와서 반환한다. 

 

세션 API 이용하여 세션 생성하기 

@WebServlet("/sess")
public class SessionTest extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.setContentType("text/html;charset=utf-8");
		PrintWriter out = resp.getWriter();
		HttpSession session = req.getSession();
		out.println("세션 아이디: " + session.getId() + "<br>");
		out.println("최초 세션 생성 시각: " + new Date(session.getCreationTime()) + "<br>");
		out.println("최근 세션 접근 시각: " + new Date(session.getLastAccessedTime()) + "<br>");
		out.println("세션 유효 시간: " + session.getMaxInactiveInterval() + "<br>");
		if(session.isNew()) {
			out.print("새 세션이 만들어졌습니다.");
		}
		
	}
	
}

 

getSession 메서드를 호출하여 세션이 없으면 새로 생성하고, 세션이 있으면 기존 세션을 가져온다. 

 

Date(long date) : 밀리초 시간값을 이용해서 date 객체를 생성한다. 

https://docs.oracle.com/javase/8/docs/api/java/sql/Date.html

 

Date (Java Platform SE 8 )

A thin wrapper around a millisecond value that allows JDBC to identify this as an SQL DATE value. A milliseconds value represents the number of milliseconds that have passed since January 1, 1970 00:00:00.000 GMT. To conform with the definition of SQL DATE

docs.oracle.com

 

https://docs.oracle.com/javaee/7/api/javax/servlet/http/HttpSession.html

 

HttpSession (Java(TM) EE 7 Specification APIs)

Provides a way to identify a user across more than one page request or visit to a Web site and to store information about that user. The servlet container uses this interface to create a session between an HTTP client and an HTTP server. The session persis

docs.oracle.com

getMaxInactiveInterval로 유효 시간을 가져올 수 있다. 따로 설정하지 않으면 기본 시간은 30분이다. 

 

재접속 시 "새 세션이 만들어졌습니다"가 뜨지않는다.