ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring MVC - Cookie를 이용한 로그인 처리와 문제점
    Spring/Spring MVC 2022. 2. 8. 18:20
    반응형

     

     

     

     

    Cookie를 이용한 로그인 처리와 문제점

     

    웹 페이지 화면

     

    메인 페이지

     

     

    회원 가입 페이지

     

    로그인 페이지


     

     

     

    Cookie를 이용한 로그인 처리

     로그인의 상태를 페이를 요청할 때마다 쿼리 파라미터로 전달하여 유지하는 것은 매우 어렵고 번거로운 작업이 된다. 쿼리 파라미터를 통해 로그인의 상태 정보를 전달하는 것이 아닌 Cookie를 이용하면 로그인 상태 정보를 쉽게 전달할 수 있다.

     

     

    1. 로그인 요청 시 회원의 정보와 일치하면 쿠키 생성
          - 중요한 정보를 쿠키에 담지 않고 회원을 식별할 수 있는 key값을 전달
          - 클라이언트에서 해당 쿠키 정보를 저장


    2. 페이지 요청 시 쿠키 정보를 전달하여 서버에서 전달받은 쿠키 정보로 회원 저장소에
      저장되어 있는 회원을 확인 
           - 페이지 요청할 때마다 쿠키 정보를 서버에 전달
           - 쿠키 정보로 로그인 상태 유지

     


     

    Cookie의 종류

     

    • 영속 쿠키 : 만료 날짜를 입력하면 해당 날짜까지 유지
    • 세션 쿠키 : 만료 날짜를 생략하면 브라우저 종료할 때까지 유지
                     (브라우저 종료 시 로그아웃이 돼야 하므로 로그인에 사용)

     

     

    Cookie 생성 - 로그인

     

    Cookie idCookie = new Cookie("memberId", String.valueOf(loginMember.getId()));
    response.addCookie(idCookie);

     

    • 로그인에 성공하면 쿠키를 생성하고 HttpServletResponse에 담는다. 
    • 클라이언트는 생성된 쿠키를 응답 메시지로 받아 서버에 요청할 때마다 쿠키 정보를 전달한다.

     

    페이지 요청

     

    • 로그인 후 요청한 페이지는 쿠키 정보를 이용해 로그인 상태를 확인한다
    • @CookieValue 애노테이션을 이용해 쿠키를 사용할 수 있다.
          - 처음 페이지 요청할 때는 쿠키 정보가 없기 때문에 required = false로 설정해 준다.
    • 로그인 쿠키(memberId)가 없는 사용자와
      회원 저장소에 저장되어있지 않은 로그인 쿠키를 가지고 있는 사용자는 기존 home으로 보낸다.
    • 정상적인 로그인 쿠키를 가지고 있는 사용자는 loginHome으로 보낸다.

     

    @GetMapping("/")
    public String homeLogin(@CookieValue(name = "memberId", required = false) Long memberId, Model model) {
    
        // 페이지를 처음으로 요청 시
        if (memberId == null) {
            return "home";
        }
    
        // 쿠키에 저장된 회원 정보가 회원 저장소에 없을 시
        Member loginMember = memberRepository.findById(memberId);
        if (loginMember == null) {
            return "home";
        }
    	
        // 로그인 상태일 때
        model.addAttribute("member", loginMember);
        return "loginHome";
    }

     

    Cookie 삭제 - 로그 아웃

     

    • 쿠키가 삭제되는 경우는 다음 2가지가 있다.
           - 세션 쿠키이므로 웹 브라우저 종료 시 삭제
           - 서버에서 해당 쿠키의 종료 날짜를 0으로 지정 ( setMaxAge(0) )

     

    @PostMapping("logout")
    public String logout(HttpServletResponse response) {
        expireCookie(response, "memberId");
        return "redirect:/";
    }
    private void expireCookie(HttpServletResponse response, String cookieName) {
        Cookie cookie = new Cookie(cookieName, null);
        cookie.setMaxAge(0);
        response.addCookie(cookie);
    }

    쿠키를 새로 생성하는 이유
          - 사용자 브라우저에 저장되어있는 쿠키를 만료시키기 위한 방법
          - 사용자 브라우저에 저장되어있는 쿠키와 같은 key값(name)을 보내 저장되어 있던 쿠키를
            덮어쓰게 하기 위해 새로 생성한다.
          - 서버에서 새로 쿠키를 만들어 덮어쓰게 하는 방법 외에는 사용자 브라우저에
            저장된 쿠키를 제어할 수 있는 방법이 없다


     

     

    Cookie를 이용한 로그인의 문제

     쿠키를 사용한 로그인 처리는 심각한 보안 문제가 발생한다. 어떻게 문제가 발생하는지 알아보자.

     

    보안 문제

     

    • 임의로 변경이 가능한 쿠키 값
          - 클라이언트 쪽에서 임의로 쿠키 값을 변경하여 서버에 전달할 수 있다.
          - 즉 쿠키 값을 변경하여 다른 사용자로 로그인이 가능하다.

    • 쿠키에 보관된 정보는 훔쳐갈 수 있다.
          - 중요 정보(개인 정보, 신용카드 정보 등)의 노출 위험
          - 로컬 PC에서 쿠키 정보를 빼돌리거나 네트워크 전송 구간에서 빼돌릴 수 있다
    • 해커가 쿠키를 한번 훔쳐가면 평생 사용이 가능
          - 한번 쿠키를 빼돌리면 해당 정보가 바뀌지 않는 이상 계속 악용이 가능하다

     

    대안

     

    • 쿠키에 중요한 값(회원 정보를 특정할 수 있는 값)을 노출하지 않고 사용자 별로 예측 불가능한
      임의의 토큰(랜덤 값)을 이용하여 서버에서 토큰과 사용자 id를 매핑하여 인식
    • 서버에서 토큰을 관리하여 보안 강화
    • 토큰의 만료시간을 설정하여 토큰 정보가 누출이 돼도 이후에 사용 못하도록 한다.
    • 해킹이 의심되는 경우 서버에서 해당 토큰을 강제로 제거

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    반응형

    댓글

Designed by Tistory.