세션 - SpringBoot

Jiwon Park·2023년 5월 18일
0

http 요청 응답시 데이터는 유지 되지 않는다.
쿠키를 사용 하면 데이터를 유지할 수 있지만 쿠키 값은 임의로 조작이 가능해 보안에 취약하다.
이에 대한 대안으로 세션이 있다. 세션은 서버의 세션 저장소에 추정하기 힘든 임의의 세션 ID와 value를 보관한다. 세션 ID(JSESSIONID)만 쿠키에 담아서 응답하며, 이외의 정보는 전달하지 않는다.
*세션은 메모리를 생성하므로 꼭 필요할때만 쓰도록 한다.

public final class SessionConst { // 상속 불가

    public static final String LOGIN_MEMBER = "loginMember"; 
    private SessionConst(){} // 객체 생성 불가
}
	
    /* 
    request.getSession(true) // default
    세션이 있으면 기존 세션을 반환한다.
    세션이 없으면 새로운 세션을 생성해서 반환한다.
    request.getSession(false)
    세션이 있으면 기존 세션을 반환한다.
    세션이 없으면 새로운 세션을 생성하지 않는다. null 을 반환한다.
    */
    
    @PostMapping("/login")
    public String login2(@Validated @ModelAttribute LoginForm form, BindingResult bindingResult, HttpServletRequest request){
        if(bindingResult.hasErrors()){
            return "login/loginForm";
        }
        Member loginMember = loginService.login(form.getLoginId(), form.getPassword());

        log.info("login? {}", loginMember);

        if(loginMember == null){
            bindingResult.reject("loginFail", "아이디 또는 비밀번호가 맞지 않습니다.");
            return "login/loginForm";
        }
        //로그인 성공 처리
        HttpSession session = request.getSession();
        session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember);

        return "redirect:/";
    }
    
    @PostMapping("/logout")
    public String logout2(HttpServletRequest request){
        HttpSession session = request.getSession(false); // 세션 생성x 
        if(session!=null){
            session.invalidate(); // 세션 제거
        }
        return "redirect:/";
    }
 @GetMapping("/")
    public String homeLoginSpring(@SessionAttribute(name = SessionConst.LOGIN_MEMBER, required = false) Member loginMember, Model model){
		
      /*
        HttpSession session = request.getSession(false);
        if(session == null){
            return "home";
        }

        Member loginMember = (Member) session.getAttribute(SessionConst.LOGIN_MEMBER); 
      */
        
        //로그인
        if(loginMember == null){
            return "home";
        }

        model.addAttribute("member", loginMember);
        return "loginHome";
    }

로그인을 처음 시도하면 URL이 JSESSIONID를 포함한다.
이것은 웹 브라우저가 쿠키를 지원하지 않을 때 쿠키 대신 URL을 통해서 세션을 유지하는 방법이다.
이 방법을 사용하려면 URL에 이 값을 계속 포함해서 전달해야 한다. 서버 입장에서 웹 브라우저가 쿠키를 지원하는지 하지 않는지 최초에는 판단하지 못하므로 쿠키 값도 전달하고, URL에 jsessionid 도 함께 전달한다.
URL 전달 방식을 끄고 항상 쿠키를 통해서만 세션을 유지하고 싶으면 다음 옵션을 넣어주면 된다.

//application.properties

server.servlet.session.tracking-modes=cookie

이렇게 하면 URL에 JSESSIONID 가 노출되지 않는다.

타임리프, JSP와 같은 템플릿 엔진을 통해서 링크를 걸면 JSESSIONID 를 URL에 자동으로 포함해준다.

[jsp] <c:url 태그를 사용해야 하는 이유


세션 타임아웃 설정

server.servlet.session.timeout=60 //60초(application.properties)

or

session.setMaxInactiveInterval(60); //60초(java)
profile
안녕하세요

0개의 댓글