1 minute read

로그인 처리 - 쿠키, 세션

  • 쿠키(Cookie) 이용한 로그인/로그아웃 처리
    • 서버에서 로그인이 성공하면 클라이언트(브라우저)는 서버로 앞으로의 모든 HTTP 응답에 쿠키를 계속 담아서 보내줌.
    • 큰 보안상 문제
      • 쿠키 값은 마음대로 변경 가능. → 다른 사용자가 보임.
      • 쿠키에 보관된 정보 그대로 노출 가능성.
    • 대안
      • 예측 불가능한 랜덤 토큰을 생성하여 쿠키 값으로 넣어준다.
      • 해커가 재사용 못하게 쿠키 만료시간을 짧게 유지한다.
      • “세션(Session)” 사용하면 해결 가능.
  • 세션(Session)
    • 중요한 정보는 모두 서버에 저장하고, 클라이언트와는 추정 불가능한 식별자 값으로 연결해야 해야 하는데, 이러한 방법을 세션이라 한다.
    • 즉, 서버에서 세션 저장소를 만들고 임의의 랜덤 값을 key값으로 부여하여 관리.
    • 클라이언트에게는 이 복잡한 sessionId 값을 쿠키 정보로 넘긴다. 따라서, 쿠키가 털리더라도 중요한 값은 존재하지 않음.

      notion_pic

  • HttpSession(서블릿에서 제공)
    • @SessionAttribute 어노테이션으로 →
      • 세션 유무 확인.
      • 객체에 세션 정보 확인해 자동으로 바인딩.

        ex) @SessionAttribute(name = SessionConst.*LOGIN_MEMBER*, required = false) Member loginMember

    • 세션 쿠키 생성

        // 로그인 성공 처리 -> 세션 쿠키 생성
        HttpSession session = request.getSession();
        session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember);
      
    • 로그아웃 → 세션 저장소 정보 삭제

        // 세션 가져오고, 없으면 새로 생성은X
        HttpSession session = request.getSession(false);
        if (session != null) {
            session.invalidate();
        }
      
    • 세션 타임아웃
      • HttpSession → 기본적으로 last accessed time으로부터 1800초(30분) 후에 타임아웃 되게 설정되어 있음.
      • Last Accessed time은 Http Request가 올때마다 계속 초기화 되므로 합리적인 정책이라 보여짐.
      • 세션은 메모리를 사용하므로 타임아웃 설정이 안되어있거나 너무 길게 설정되어 있으면 장애가 날 수 있음.

Updated: