μ λ§ κ°λ¨νκ² Cookie
λ§μ μ΄μ©ν΄μ λ‘κ·ΈμΈ μ²λ¦¬λ κ°λ₯ν©λλ€.
νμ§λ§ 보μμμ μ λ§ λ§μ μ·¨μ½μ μ΄ λ°μν©λλ€. Cookie
λ₯Ό λ‘κ·ΈμΈμ μ΄μ©νλ€λ κ²μ μ¬μ©μμ κΆνμ κ·Έλλ‘ κ³΅κ°νλ κ²κ³Ό κ°μ΅λλ€.
Cookie
λ νμ·¨ κ°λ₯νκ³ λ³μ‘°κ° κ°λ₯νκΈ° λλ¬Έμ΄μ§μ.
μ΄λ° μ΄μ λ‘ λ³΄μμ μ΄μλ₯Ό ν΄κ²°ν΄μΌ ν©λλ€.
μΈμ
μ Cookie
μ κΈ°λ°ν©λλ€. κ²°κ΅ μΏ ν€λ₯Ό μ¬μ©νλ κ²μ΄μ§μ.
νμ§λ§ κ²°μ μ μΌλ‘ λ€λ₯Έ κ²μ μλ―Έμλ μ 보λ₯Ό Cookie
μ체μ μ μ₯νμ§ μλλ€λ κ² μ
λλ€.
Cookie
μλ μλ²μ μλ―Έμλ μ 보과 맀νμ μν μΆμ λΆκ°λ₯ν λμκ° μ μ₯λμ΄ ν΄λΌμ΄μΈνΈμκ² μ λ¬λ©λλ€.
μλ²λ ν΄λΌμ΄μΈνΈλ‘λΆν° λ°μ Cookie
μ λμκ°μ μλ²μΈ‘ μΈμ
μ μ₯μμ 맀ννμ¬ μ€μ μλ―Έμλ κ°μ μ¬μ©νκ² λλ κ² μ
λλ€.
μΈμ
μ μ₯μλ₯Ό μν Map
μ μμ±ν©λλ€. μΈμ
μ μν ν΄λμ€λ μ€νλ§ λΉμΌλ‘ λ±λ‘ν κ²μ΄κΈ° λλ¬Έμ μ±κΈν€μ
λλ€. λ©ν°μ°λ λ νκ²½μμ race conditionλ¬Έμ λ₯Ό λ°©μ§νκΈ° μν΄ ConcurrentHashMap
μ μ¬μ©ν©λλ€.
Map
μ key
κ°μΌλ‘λ λμ(UUID
)κ° μ μ₯λ κ²μ΄κ³ value
μλ μ€μ μλ―Έμλ μ λ³΄κ° μ μ₯λ κ²μ
λλ€.
private Map<String, Object> sessionMap = new ConcurrentHashMap<>();
private final String MY_SESSION_NAME = "mySessionName";
UUID
λ₯Ό μΈμ
μ μ₯μμ key
κ°μΌλ‘ νκ³ λ§€κ°λ³μλ‘ λ°μ μλ―Έμλ λ°μ΄ν°λ₯Ό μΈμ
μ μ₯μμ value
λ‘ μ μ₯ν©λλ€.
μ¬μ©μμκ² μλ΅ν΄μ€ Cookie
μλ μμ λ¬Έμμ΄ μμλ₯Ό key
κ°μΌλ‘ νκ³ μΈμ
μ μ₯μμ 맀νλ UUID
λ₯Ό key
κ°μΌλ‘ μ§μ νμ¬ μλ΅κ°μ²΄ (HttpServletResponse
)μ λ΄μμ€λλ€.
public void createSession(HttpServletResponse response, Object value) {
String sessionKey = UUID.randomUUID().toString();
sessionMap.put(sessionKey, value);
Cookie cookie = new Cookie(MY_SESSION_NAME, sessionKey);
response.addCookie(cookie);
}
ν΄λΌμ΄μΈνΈλ‘λΆν° λ°μ μμ²μμ Cookie
λ₯Ό νμ±ν©λλ€.
νμ±λ Cookie
μμ value
(μΈμ
μ μ₯μkey
)λ‘ μΈμ
μ μ₯μλ₯Ό μ‘°ννμ¬ μ€μ κ°μ λ°μ΄ν°λ₯Ό λ°μμ΅λλ€.
public Object getSession(HttpServletRequest request) {
if (request.getSession() == null) return null;
Cookie requestCookie = Arrays.stream(request.getCookies())
.filter(cookie -> cookie.getName().equals(MY_SESSION_NAME))
.findAny()
.orElse(null);
if (requestCookie == null) return null;
return sessionMap.get(requestCookie.getValue());
}
μΈμ
μ λ§λ£μν¨λ€λ κ²μ μΈμ
μ μ₯μμμ μ€μ κ°μ μμ ν΄μ£Όλ κ² μ
λλ€.
ν΄λΌμ΄μΈνΈ μΈ‘μ μ¬μ ν Cookie
λ λ¨μμκ² μ§λ§ μΈμ
μ μ₯μμ μλ key
κ°μ΄λ―λ‘ μλ―Έ μλ Cookie
μ΄κΈ° λλ¬Έμ λ¬Έμ μμ΅λλ€.
public void expireCookie(HttpServletRequest request) {
Cookie requestCookie = Arrays.stream(request.getCookies())
.filter(cookie -> cookie.getName().equals(MY_SESSION_NAME))
.findAny()
.orElse(null);
if (requestCookie != null) sessionMap.remove(requestCookie.getValue());
}
컨νΈλ‘€λ¬λ‘ λ‘κ·ΈμΈ μμ²μ΄ μμ λ μΈμ
μ λ‘κ·ΈμΈ μ 보λ₯Ό μ μ₯ν΄μ£Όλ λΆλΆμ
λλ€. request
κ°μ²΄λ₯Ό ν΅ν΄ session
μ μμ±νκ±°λ κΈ°μ‘΄μ μΈμ
μ κ°μ Έμ΅λλ€.
νμ session
μ setAttribute
λ©μλλ₯Ό μ΄μ©ν΄ μ€μ κ°μ μ μ₯ν©λλ€.
μ΄λ Cookie
λ₯Ό μμ±νλλ° κΈ°λ³ΈμΌλ‘ Cookie
μ μ΄λ¦μ JSESSIONID
κ° λκ³ κ°μ μΆμ λΆκ°λ₯ν λμλ‘ μ€μ λ©λλ€.
HttpSession session = request.getSession(true);
session.setAttribute("SESSION-KEY", member);
getSession()
λ©μλλ false
μ κ²½μ° μΈμ
μ΄ μλ κ²½μ° μΈμ
μ λ°μμ€κ³ μλ κ²½μ° null
μ λ°νν©λλ€. true
μ κ²½μ° μΈμ
μ΄ μλ κ²½μ° μ κ·λ‘ μΈμ
μ μμ±ν©λλ€.
session
μ΄ null
μ΄ μλλΌλ©΄ invalidate()
λ©μλλ₯Ό μ΄μ©ν΄μ μΈμ
μ μ κ±°ν©λλ€.
HttpSession session = request.getSession(false);
if (session != null) {
session.invalidate(); // μΈμ
μ κ±°
}
@SessionAttribute
λ₯Ό μ΄μ©ν΄ μΈμ
μ κ°μ κ°μ²΄λ‘ λ°μΈλ© ν μ μμ΅λλ€.
μλ§μ key
κ°μ μ§μ νμ¬ κ°μ²΄μ κ°μ λ°μΈλ©ν©λλ€. required
μμ±μ μ΄μ©ν΄ νμ μ¬λΆλ₯Ό μ§μ ν μλ μμ΅λλ€.
λ‘κ·ΈμΈ μ²λ¦¬μ μΈμ
μ ν΅ν΄ λ°μμ¨ Member
κ°μ²΄κ° null
μ΄ μλλΌλ©΄ λ‘κ·ΈμΈ μ±κ³΅μ νμ΄μ§
λ‘ null
μ΄λΌλ©΄ λ€μ λ‘κ·ΈμΈ νμ΄μ§
λ‘ λΆκΈ°μν€λ κ²μ΄ κ°λ₯ν©λλ€.
public String home(
@SessionAttribute(name="SESSION-KEY", required = false) Member member) {
...
}
μΈνλ° κΉμνλμ μ€νλ§ MVC 2νΈ μ μκ°νκ³ μ 리ν λ΄μ©μ λλ€.