Skip to content

Latest commit

ย 

History

History
105 lines (80 loc) ยท 4.13 KB

session_01.md

File metadata and controls

105 lines (80 loc) ยท 4.13 KB

๋กœ๊ทธ์ธ - ์„ธ์…˜(Session)

์ฟ ํ‚ค(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๊ฐ€ ๋‹ด๊ธด ์ฟ ํ‚ค๋ฅผ ๋ฐœ๊ธ‰ํ•˜์—ฌ ์‚ฌ์šฉ์ž์˜ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•œ๋‹ค.

์ดํ›„ ์„ธ์…˜ ์ €์žฅ์†Œ์— ํšŒ์› ์ •๋ณด๊ฐ€ ์—†๋‹ค๋ฉด, ์ฟ ํ‚ค๋‚˜ ์„ธ์…˜์ด ์—†๋Š” ๊ฒƒ ์ด๋ฏ€๋กœ ๋กœ๊ทธ์ธ ๋˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.


Reference