로그인처리1 - 쿠키,세션(2)

JIWOO YUN·2024년 2월 29일
0

SpringMVC2

목록 보기
18/26
post-custom-banner

서블릿 http 세션 사용하기

  • 세션의 개념은 대부분의 웹 애플리케이션에 필요하다.
  • 서블릿은 세션을 위해 HttpSession이라는 기능을 제공해준다.
  • 세션을 일정시간 사용하지 않을 경우 해당 세션을 삭제하는 기능도 제공

HttpSession

  • 서블릿이 제공하는 HttpSession을 생성시
    • 쿠키 이름 : JSESSIONID
    • 값 : 추정 불가능한 랜덤값부여

SessionConst

public interface SessionConst {
    String LOGIN_MEMBER = "loginMember";
}

HttpSession에 데이터를 보관하고 조회할 때 같은 이름이 중복되어 사용되기 떄문에 상수를 하나 정의.

서블릿 http Session 사용코드로 변환

@PostMapping("/login")
public String loginV3(@Valid @ModelAttribute("loginForm")LoginForm loginForm, BindingResult bindingResult,
                      HttpServletRequest request){

    if(bindingResult.hasErrors()){
        return "login/loginForm";
    }

    Member loginMember = loginService.login(loginForm.getLoginId(), loginForm.getPassword());

    if(loginMember == null){
        bindingResult.reject("loginFail","아이디 또는 비밀번호가 맞지않습니다.");
        return "login/loginForm";

    }


    //로그인 성공 처리
    
    //세션있으면 세션반환 ,없으면 신규 생성
    HttpSession session = request.getSession();

    session.setAttribute(SessionConst.LOGIN_MEMBER,loginMember);
    return "redirect:/";
}

request.getSession(true)

  • 세션이 있으면 기존 세션을 반환
  • 세션이 없으면 새로운 세션을 생성해서 반환

request.getSession(false)

  • 세션이 있으면 기존 세션을 반환
  • 세션이 없으면 새로운 세션을 생성하지 않음 -> null 반환

로그아웃부분에서 세션 제거

    @PostMapping("/logout")
    public String logoutV3(HttpServletRequest request){
        HttpSession session = request.getSession(false);

        if(session != null){
            session.invalidate();
        }
        return "redirect:/";
    }
  • 로그 아웃부분은 세션이 없는 경우 새로 생성할 필요가없기 때문에 false로 진행
  • session.invalidate() -> 세션 제거

HomeLogin 부분도 HttpSession 사용으로 변경

@GetMapping("/")
public String homeLoginV3(HttpServletRequest request, Model model){


    HttpSession session = request.getSession(false);
    if(session == null){
        return "home";
    }

    Member loginMember = (Member)session.getAttribute(SessionConst.LOGIN_MEMBER);

    model.addAttribute("member",loginMember);

    //로그인 된 사용자 전용 홈
    return "loginHome";

}
  • 로그인의 경우에도 무조건 세션이 만들어질 필요가 없기 때문에 false로 진행한다
    • 로그인을 하지 않아도 의미없는 세션이 만들어지는 것을 방지
    • 세션도 메모리를 먹기 때문에 불필요한 세션을 만들면 메모리 낭비로 이어진다.

@SessionAttribute

  • 스프링이 세션을 더 편리하게 사용할 수있도록 @SessionAttribute를 지원함.
@GetMapping("/")
public String homeLoginV3Spring(@SessionAttribute(name = SessionConst.LOGIN_MEMBER,required = false)
                                    Member loginMember,
                                Model model){

    if(loginMember == null){
        return "home";
    }
    model.addAttribute("member",loginMember);

    //로그인 된 사용자 전용 홈
    return "loginHome";
}

근데 했을때 jsessionid가 url에 있을 때 404 오류가 발생한다.

jsessionid가 url에 있을때 404에러 - 인프런 (inflearn.com)

  • 스프링에서 url 매핑 전략이 변경되어서 문제가 발생한것

  • server:
      servlet:
        session:
          tracking-modes: cookie

yml파일인 경우 현재와 같이 설정을 해줘야한다.

TrackingModes

  • ;jsessionid = 가 생기는 이유
  • 서버에서 클라이언트에 세션을 유지하기 위해서 쿠키를 생성해야하는데 클라이언트가 쿠키 생성을 허용여부가 불확실한 경우 ;jsessionid = 를 붙여서 세션을 유지하기 떄문에.
profile
열심히하자
post-custom-banner

0개의 댓글