본문 바로가기
Java

[Java] 세션(HttpSession) 구현 / 세션은 HTTP 쿠키를 기반으로 동작

by bkuk 2023. 3. 21.

  • 클라이언트와 서버 간에 주고 받을 고유한 아이디 생성. 고유한 아이디는 쉽게 예측할 수 없어야 하며, 예측하기 쉬우면 쿠키 값을 조작해 다른 사용자처럼 속일 수 있음.
  • 위에서 생성한 고유 아이디의 세션을 클라이언트 마다 무조건 하나를 배정받게 된다.
  • 이를 확인하는 방법으로는, 클라이언트의 요청 헤더를 확인 후 JSESSIONID라는 Key에 대응하는 Value가 없다면 응답 헤더의 쿠키로 담아서 전달한다.
if( request.getCookies().getCookies("JSESSIONID") == null) {
    response.addHeader("Set-Cookie", "JSESSIONID=" + UUID.randomUUID());
}

 

  • 모든 클라이언트에게 전달한 세션 값을 서버측에서 관리할 수 있는 클래스를 생성한다.
  • 이 클래스는 모든 세션을 매번 생성하는게 아닌, 한번 생성하면 재사용할 수 있어야 함으로 static으로 Map을 구현했다.
public class HttpSessions {
	public static Map<String, HttpSession> sessions = new HashMap<>();
	public static HttpSession getSession(String id) {
		HttpSession session = sessions.get(id);
		if( session == null ) {
			session = new HttpSession(id);
			sessions.put(id, session);
			return session;
		}
		return session;
	}
	public static void removeSession( String id ) {
		sessions.remove(id);
	}
}

 

  • 각 클라이언트별 세션을 담당할 HttpSession 클래스이다.
  • 상태 데이터를 저장할 Map<String, Object>을 구현했다.
public class HttpSession {
	private String id;
	private Map<String, Object> attribute = new HashMap<>(); 
	
	public HttpSession(String id) {
		this.id = id;
	}
	public String getId() {
		return id;
	}
	public void setAttribute( String name, Object value ) {
		attribute.put(name, value);
	}
	public Object getAttribute( String name ) {
		return attribute.get(name);
	}
	public void removeAttribute( String name ) {
		attribute.remove(name);
	}
	public void invalidate() {
		HttpSessions.removeSession(id);
	}
	
}

 

 

따라서, 세션은 HTTP 쿠키를 기반으로 동작한다는 것을 꼭 기억하자.

댓글