Contents
Session 직접 만들기
   Apr 8, 2023     3 min read

세션 직접 만들기

⚓️서론

세션을 직접 만들면서 세션에 대한 동작과 간단한 원리를 이해하고 넘어가자.

기존에 쿠키와 세션는 간단하게 개념을 익혔다.

  • 쿠키는 클라이언트(브라우저)에서 저장하여 동일한 서버 재요청 시 저장된 데이터를 함께 전송한다.
  • 세션은 서버측에서 세션을 만들어 저장하여 동일한 요청 시 저장된 데이터를 함께 클라이언트(브라우저)에 전송한다.

간단히 알고 있었다.

이번 계기로 세션에 대해서 더 자세히 알아보자.


  • loginController
public String homeLoginV2(HttpServletRequest request, Model model) {
    Member member = (Member) sessionManager.getSession(request);

    //세션 관리자에 저장된 회원 정보 조회
    if (member == null) {
        return "home";
}

    //로그인
    model.addAttribute("member", member);
    return "loginHome";
}

SessionManager 를 만들어서 세션을 생성, 조회, 만료 할 수 있게 만들어 준다.

/**
 * 세션 관리
 */
@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를 생성하고, 값을 세션에 저장
    String sessionId = UUID.randomUUID().toString(); // UUID 만들기
    sessionStore.put(sessionId, value);

    //쿠키 생성
    Cookie mySessionCookie = new Cookie(SESSION_COOKIE_NAME, sessionId); // Cookie(String name, String value)
    response.addCookie(mySessionCookie); // response에 쿠키를 넣어준다.
}

/**
* 세션 조회
*/
public Object getSession(HttpServletRequest request) {
    /*
    Cookie[] cookies = request.getCookies();
    if (cookies == null) {
        return null;
    }

    for (Cookie cookie : cookies) {
        if (cookie.getName().equals(SESSION_COOKIE_NAME)) {
             return sessionStore.get(cookie.getValue());
    }
}
    return null;
    */

        // 위코드를 리펙토링한 코드
    Cookie sessionCookie = findCookie(request, SESSION_COOKIE_NAME);
        if (sessionCookie == null) {
            return null;
        }
        return sessionStore.get(sessionCookie.getValue());
    }

/**
* 세션 만료
*/
public void expire(HttpServletRequest request) {
    Cookie sessionCookie = findCookie(request, SESSION_COOKIE_NAME);
        if (sessionCookie != null) {
            sessionStore.remove(sessionCookie.getValue());
        }
    }

public Cookie findCookie(HttpServletRequest request, String cookieName) {
    if (request.getCookies() == null) {
        return null;
    }

    return Arrays.stream(request.getCookies()) // 배열을 스트림으로 바꿔준다.
            .filter(cookie -> cookie.getName().equals(cookieName)) //  Loop를 돌리면서 쿠키가 같은지 확인
            .findAny()
            .orElse(null);
    }
}
  • HomeContoller
@GetMapping("/")
public String homeLoginV2(HttpServletRequest request, Model model) {

    //세션 관리자에 저장된 회원 정보 조회
    Member member = (Member) sessionManager.getSession(request);

    //로그인
    if (member == null) {
        return "home";
    }

    model.addAttribute("member", member);
    return "loginHome";
}
  • 결과 Untitled