์ฟ ํค(Cookie)
๋ ์น ๋ธ๋ผ์ฐ์ ์์ ์ฌ์ฉ์์ ์ํ๋ฅผ ์ ์งํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ์์ ๋ฐ์ดํฐ ์กฐ๊ฐ์ด๋ค.
์ฃผ๋ก ํด๋ผ์ด์ธํธ์ ์ ์ฅ๋์ด ์๋ฒ์ ์์ฒญํ ๋ ๋ง๋ค ํจ๊ป ์ ์ก๋๋ ํน์ง์ด ์์๋ค.
์ฟ ํค๋ง ์ฌ์ฉ
ํด์ ๋ก๊ทธ์ธ ํ๋ก์ธ์ค๋ฅผ ๊ตฌํํ ํ ์๋ ์์ง๋ง, ์ด๋ ์ฌ๊ฐํ ๋ณด์ ๋ฌธ์
๋ฅผ ์ด๋ํ๋ค.
์ฟ ํค
๋ ํด๋ผ์ด์ธํธ์ ์ ๋ณด๊ฐ ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ ์์๋ก ๊ฐ์ ๋ณ๊ฒฝ๋์ด ์์ฒญํ ์ ์๋ค.
๋ํ ๋ฐ๋ก ์ํธํ ๋์ง ์์ ์ ๋ณด
์ด๊ธฐ ๋๋ฌธ์ ๋ณด์์ ์ทจ์ฝํ๋ฉฐ, ํด์ปค๋ ์ฟ ํค๋ฅผ ํ์ทจํ์ฌ ์
์์ ์ธ ์์ฒญ
์ ๋ฌด์ ํ ์๋ํ ์ ์๋ค.
๋ฐ๋ผ์ ๋ก๊ทธ์ธ ํ๋ก์ธ์ค๋ฅผ ๊ตฌํํ ๋๋ ์ค์ํ ์ ๋ณด๋ ์๋ฒ์ ์ ์ฅํ๊ณ
ํด๋ผ์ด์ธํธ์ ์๋ฒ๋ฅผ ์ฐ๊ฒฐํ๋ ๊ฐ์ ์ถ์ ๋ถ๊ฐ๋ฅํ ์์์ ์๋ณ์๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
์ธ์
(Session)
์ ์ฟ ํค
์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฌ์ฉ์์ ์ํ๋ฅผ ์ ์งํ๋ ๊ธฐ์ ์ด๋ค.
๋ค๋ง ์ธ์
์ ์ธ์
ID
๋ผ๋ ๊ณ ์ ํ ์๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์๋ฅผ ์๋ณํ๊ณ , ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ์๋ฒ์ ์ ์ฅํ๋ค.
์ฟ ํค
์ ์ฌ์ฉ๋๋ ์ ๋ณด๋ฅผ ์ธ์
ID
๋ก ๋์ฒดํ๊ณ , ํด๋ผ์ด์ธํธ๋ ์์ฒญ์ ์ธ์
ID
์ฟ ํค๋ฅผ ์ ๋ฌํ๋ค.
์ํธํ๋ ์๋ณ์๋ฅผ ์ฌ์ฉํด์ ์๋ฒ์์ ์ฌ์ฉ์๋ฅผ ๋งค์นญ
ํ๊ธฐ ๋๋ฌธ์ ๋น๊ต์ ๋ณด์์ ๋ ์์ ํ๋ค๋ ์ฅ์ ์ด ์๋ค.
@Component
public class SessionManager {
public static final String SESSION_COOKIE_NAME = "mySessionId";
private Map<String, Object> sessionStore = new ConcurrentHashMap<>();
public void createSession(Object value, HttpServletResponse response) {
//์ธ์
id๋ฅผ ์์ฑํ๊ณ , ์ธ์
id์ ์ ์ ์ ๋ณด๋ฅผ ์ ์ฅ
String sessionId = UUID.randomUUID().toString();
sessionStore.put(sessionId, value);
//์ฟ ํค๋ฅผ ์์ฑํด์ ์ธ์
id๋ฅผ ์ ๋ฌ
Cookie mySessionCookie = new Cookie(SESSION_COOKIE_NAME, sessionId);
response.addCookie(mySessionCookie);
}
}
@Component
public class SessionManager {
public static final String SESSION_COOKIE_NAME = "mySessionId";
private Map<String, Object> sessionStore = new ConcurrentHashMap<>();
public Object getSession(HttpServletRequest request) {
Cookie sessionCookie = findCookie(request, SESSION_COOKIE_NAME);
if (sessionCookie == null) {
return null;
}
//์ธ์
id๋ก ์ ์ ๋ฅผ ์กฐํ
return sessionStore.get(sessionCookie.getValue());
}
private Cookie findCookie(HttpServletRequest request, String cookieName) {
//HTTP ์์ฒญ ์ฟ ํค๊ฐ ์๋ค๋ฉด null ๋ฐํ
if (request.getCookies() == null) {
return null;
}
return Arrays.stream(request.getCookies())
.filter(cookie -> cookie.getName().equals(cookieName))
.findAny()
.orElse(null);
}
}
@Component
public class SessionManager {
public static final String SESSION_COOKIE_NAME = "mySessionId";
private Map<String, Object> sessionStore = new ConcurrentHashMap<>();
public void expire(HttpServletRequest request) {
//HTTP ์์ฒญ ์ฟ ํค๋ฅผ ์กฐํํ๊ณ ์ ์ฅ์์์ ์ ์ ์ ๋ณด๋ฅผ ์ญ์
Cookie sessionCookie = findCookie(request, SESSION_COOKIE_NAME);
if (sessionCookie != null) {
sessionStore.remove(sessionCookie.getValue());
}-
}
}
sessionId : ์ ์ ์ ๋ณด
๋ก ์ด๋ฃจ์ด์ง ์ธ์
์ ์ฅ์๋ฅผ ์์ฑํ๊ณ
๋ก๊ทธ์ธ ์ ํด๋ผ์ด์ธํธ์๊ฒ sessionId
๊ฐ ๋ด๊ธด ์ฟ ํค๋ฅผ ๋ฐ๊ธํ์ฌ ์ฌ์ฉ์์ ์ํ๋ฅผ ์ ์งํ๋ค.
์ดํ ์ธ์ ์ ์ฅ์์ ํ์ ์ ๋ณด๊ฐ ์๋ค๋ฉด, ์ฟ ํค๋ ์ธ์ ์ด ์๋ ๊ฒ ์ด๋ฏ๋ก ๋ก๊ทธ์ธ ๋์ง ์์ ๊ฒ์ผ๋ก ์ฒ๋ฆฌํ๋ค.