- 클라이언트와 서버 간에 주고 받을 고유한 아이디 생성. 고유한 아이디는 쉽게 예측할 수 없어야 하며, 예측하기 쉬우면 쿠키 값을 조작해 다른 사용자처럼 속일 수 있음.
- 위에서 생성한 고유 아이디의 세션을 클라이언트 마다 무조건 하나를 배정받게 된다.
- 이를 확인하는 방법으로는, 클라이언트의 요청 헤더를 확인 후 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 쿠키를 기반으로 동작한다는 것을 꼭 기억하자.
'Java' 카테고리의 다른 글
[Java] MVC 프레임워크 구현 (0) | 2023.03.21 |
---|---|
[Java] static 블록 / 초기화 블럭 (0) | 2023.03.21 |
[Java] 다형성을 활용해 클라이언트 요청 URL에 대한 분기 처리를 제거 (0) | 2023.03.20 |
[Java] 응답 데이터를 처리하는 로직을 HttpResponse 클래스로 분리 및 리팩토링 (0) | 2023.03.19 |
[Java] 요청 데이터 처리 로직을 HttpRequest 클래스로 분리 및 리팩토링 (0) | 2023.03.19 |
댓글