쿠폰(쿠키)을 손님에게 맡기고 손님이 관리하는 경우, 손님이 쿠폰을 조작 할 가능성이 있다. -> 보안에 취약
해결법 - 사장님이 쿠폰 저장소(세션 저장소)를 만들어 그 쿠폰의 내용을 저장해 놓는다.
하지만, 사장님은 손님이 올 때 마다 A손님이 왔는지, B손님이 왔는지 매 번 구분을 할 수 없가 없다. -> 고객 식별 불가
해결법 - 고객 식별을 쿠키로 한다.
ex)
최초 접속일 경우(쿠키가 없을 경우) 세션ID(쿠키)를 지급, 세션ID에 대한 저장소를 만듦
두번째 접속일 경우(쿠키가 있는 경우) 세션ID 확인 후, 해당 저장소를 확인 후 체크함
public void setSession(String name, long value) {
HttpSession session = req.getSession();
session.setAttribute(name, value);
}
public long getSessionAsLong(String name, long defaultValue) {
try {
long value = (long) req.getSession().getAttribute(name);
return value;
} catch (Exception e) {
return defaultValue;
}
}
private String getSessionAsStr(String name, String defaultValue) {
try {
String value = (String) req.getSession().getAttribute(name);
if (value == null) return defaultValue;
return value;
} catch (Exception e) {
return defaultValue;
}
}
public boolean removeSession(String name) {
HttpSession session = req.getSession();
if (session.getAttribute(name) == null) return false;
session.removeAttribute(name);
return true;
}
// 디버깅용 함수
public String getSessionDebugContents() {
HttpSession session = req.getSession();
StringBuilder sb = new StringBuilder("Session content:\n");
Enumeration<String> attributeNames = session.getAttributeNames();
while (attributeNames.hasMoreElements()) {
String attributeName = attributeNames.nextElement();
Object attributeValue = session.getAttribute(attributeName);
sb.append(String.format("%s: %s\n", attributeName, attributeValue));
}
return sb.toString();
}