22.03.23-쿠키,세션 그리고 로그인, 로그아웃

로그인 홈 페이지 만들기

  • 기존 홈에 있던 로그인, 회원가입 버튼이 로그아웃, 상품관리 버튼으로 변경되어야 함
  • 세션, 쿠키 개념이 도입돼야 함
  • 로그아웃 - 세션만료를 이용해야 함

쿠키 ,,, 핵심 : 쿠키엔 중요 정보를 담지 않아야 한다

  • 쿠키는 보안상 문제가 있다 -> 세션 사용

  • 쿠키에 중요한 값을 노출하지 않고, 사용자 별로 예측 불가능한 임의의 토큰(랜덤 값)을 노출하고, 서버에서 토큰과 사용자 id를 매핑해서 인식한다. 그리고 서버에서 토큰을 관리한다.

  • 토큰은 해커가 임의의 값을 넣어도 찾을 수 없도록 예상 불가능 해야 한다.

  • 해커가 토큰을 털어가도 시간이 지나면 사용할 수 없도록 서버에서 해당 토큰의 만료시간을 짧게(예: 30분) 유지한다. 또는 해킹이 의심되는 경우 서버에서 해당 토큰을 강제로 제거하면 된다.

세션

  • UUID 생성으로 만들어진 랜덤값을 세션ID로 사용하여 쿠키게 담아서 전달함

세션을 직접 만들어서 하는 건 생략, 서블릿에서 지원하는 세션 사용하기

//request에서 세션 가져오기
HttpSession session = request.getSession();

//세션에 로그인 회원 정보 담기
session.setAttribute(SessionConst.MY_SESSION, loginMember);
하나의 세션에 여러 값을 저장할 수 있다.

세션 옵션 true/false

request.getSession(true)
세션이 있으면 기존 세션을 반환한다.
세션이 없으면 새로운 세션을 생성해서 반환한다.

request.getSession(false)
세션이 있으면 기존 세션을 반환한다.
세션이 없으면 새로운 세션을 생성하지 않는다. null 을 반환한다.

로그아웃

@GetMapping("/logout")
    public String logout(HttpServletRequest request){
        HttpSession session = request.getSession(false);
        if (session != null){
            session.invalidate();
        }
        return "redirect:/";
    }

session.invalidate();

수정사항

login 메서드 수정

  • LoginService 에서 login 메서드 로직 중 Boolean -> Member로 수정
  • Member로 받아야 LoginController에서 session에 담을 수 있다.
  • session.setAtrribute(SessionConst.MY_SESSION, loginMember)
  • loginMember를 담아야 하는 이유는 로그인 후 홈 화면(loginHome.html)에서 멤버 정보를 활용하기 위함(***님 환영합니다.. 등등)

TrackingModes - 첫 로그인 오류발생시 해결방법

  • 로그인을 처음 시도하면 URL이 다음과 같이 jsessionid 를 포함하고 있는 것을 확인할 수 있다
http://localhost:8080/;jsessionid=F59911518B921DF62D09F0DF8F83F872
  • 이것은 웹 브라우저가 쿠키를 지원하지 않을 때 쿠키 대신 URL을 통해서 세션을 유지하는 방법이다
  • URL에 세션 아이디를 포함하고 싶지 않다면 아래 코드를 application.properties에 추가하면 된다.

server.servlet.session.tracking-modes=cookie

좋은 웹페이지 즐겨찾기