본문 바로가기

카테고리 없음

로그인 처리하기 - 서블릿 http 세션1

이전에는 직접 세션을 만들어 보았다.

이번에는 서블릿이 제공하는 HttpSession을 이용해보자

기본적인 동작 방식은 동일하다.

추가적으로 이번에는 세션 만료 기간을 적용할 수 있다.

 

한 번 코드로 살펴보자

 

상수 생성

계속해서 세션 key로 사용할 것이고 따로 클래스를 만들지 않을 것이기 때문에 interface로 생성을 한다.

package hello.login.web;

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

 

계속해서 세션에 대해서 공부하고 있지만 헷갈릴 수 있으니 Controller의 역할을 먼저 정리하고 가보겠다.

주목해서 봐야하는 컨트롤러는 2가지이다.

HomeController와 LoginController

 

HomeController의 역할

1. 사용자가 home 화면에 진입했을 때, session의 유무를 확인한다.

2. 로그인 정보를 가진 session이 존재한다면 loginHome 화면을 보여준다. (로그아웃이 보이는 화면)

3. 로그인 정보를 가진 session이 존재하지 않는다면 기본 home 화면을 보여준다. (회원가입, 로그인이 보이는 화면)

 

LoginController의 역할

1.  로그인 정보를 가진 session이 존재한다면 홈으로 이동

2. 로그인 정보를 가진 session이 존재하지 않을 때 로그인 화면으로 이동

3. 사용자가 정확한 아이디와 패스워드를 발행했는지 확인

4. 세션 발행

 

이 내용을 숙지하고 다시 컨트롤러 코드를 살펴보자

 

HomeController.java

사용자가 로그인 정보에 대한 세션 유무에 따라 view를 따르게 rendering 해주는 역할을 하고 있다.

세션 정보를 불러오는 부분을 주목해서 살펴보자.

 

HomeController.java 코드이다.

@GetMapping("/")
public String loginHomeV3(HttpServletRequest request,
    Model model) {
    HttpSession session = request.getSession(false);

    if (session == null) {
        return "home";
    }

    // 세션에 회원 데이터가 없으면 Home
    Member member = (Member) session.getAttribute(SessionConst.LOGIN_MEMBER);
    if (member == null) {
        return "home";
    }

    // 세션이 유지되면 로그인으로 이동
    model.addAttribute("member", member);
    return "loginHome";
}

 

아래에서 보는 것과 같이 한줄로 사용자의 세션 정보를 불러올 수 있다.

 

getSession 메서드의 기본은 true로 되어있다.

true, false는 어떻게 다를까

true: session이 존재하지 않으면 session을 만들겠다

false: session이 존재하지 않으면 null을 반환하겠다.

 

기본적으로 session은 서버의 리소스를 잡아먹는 기능이다.

HomeController에서는 session의 존재여부를 확인하는 작업만 진행할 것이기 때문에 옵션을 false로 변경하면서 session을 따로 생성하지 않도록 한다.

HttpSession session = request.getSession(false);

 

앞에서 클라이언트의 세션정보를 받아왔다면 이번에는 로그인에 관련된 세션정보가 존재하는지 확인하는 차례이다.

아래 코드 한줄로 로그인 세션을 받아온다.

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

 

HomeController는 @SessionAttribute를 이용해서 더 간단히 변경할 수 있다.

@GetMapping("/")
public String loginHomeV3Spring(@SessionAttribute(name = SessionConst.LOGIN_MEMBER, required = false) Member member,
    Model model) {

    if (member == null) {
        return "home";
    }

    // 세션이 유지되면 로그인으로 이동
    model.addAttribute("member", member);
    return "loginHome";
}

 

LoginController.java

아이디와 패스워드 검증 역할을 하고, 정확한 아이디와 패스워드를 입력하였다면 세션 발행을 하는 것이 주 목적이다.

이번에는 세션 발행에 대한 부분만 살펴보자.

 

@PostMapping("/login")
public String loginV3(
    @Valid @ModelAttribute LoginForm form,
    BindingResult bindingResult,
    HttpServletRequest request
) {
    if (bindingResult.hasErrors()) {
        return "login/loginForm";
    }

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

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

    // 로그인 성공 처리 TODO
    // 세션이 있으면 있는 세션 반환, 없으면 신규 세션을 생성
    HttpSession session = request.getSession();
    // 세션에 로그인 회원 정보 보관
    session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember);

    return "redirect:/";
}

 

 

LoginController.java

로그인에 관련된 메서드에 관한 코드이다.

@PostMapping("/login")
public String loginV3(
    @Valid @ModelAttribute LoginForm form,
    BindingResult bindingResult,
    HttpServletRequest request
) {
    if (bindingResult.hasErrors()) {
        return "login/loginForm";
    }

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

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

    // 로그인 성공 처리 TODO
    // 세션이 있으면 있는 세션 반환, 없으면 신규 세션을 생성
    HttpSession session = request.getSession();
    // 세션에 로그인 회원 정보 보관
    session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember);

    return "redirect:/";
}

 

HomeController와는 다르게 이번에는 세션이 존재하지 않으면 세션을 만들겠다는 true 옵션을 사용하였다.

request.getSession에서 default는 true이다.

이번에는 발행한 세션에 로그인 정보를 저장을 할 예정이기 때문이다.

// 세션이 있으면 있는 세션 반환, 없으면 신규 세션을 생성
HttpSession session = request.getSession();
// 세션에 로그인 회원 정보 보관
session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember);

 

 

 

세션 유지 시간 변경 (60초가 최저)

server.servlet.session.timeout=60