본문 바로가기
개발진행목록/게시판 서비스

[JPA로 게시판 만들기] Session을 사용한 로그인, 로그아웃

by o3oppp 2025. 2. 19.
로그인, 로그아웃 과정

로그인 과정

  1. 아이디, 비밀번호 일치 여부 확인
  2. 불일치 시 로그인 화면 페이지로 이동
  3. 일치 시 세션 생성 및 저장
  4. 세션 유지 시 메인 페이지(home.html)로 이동

로그아웃 과정

  1. 세션 제거
  2. 세션 유지 확인

서블릿 세션 적용

HomeController.java

@Controller
@RequiredArgsConstructor
public class HomeController {

    private final MemberRepository memberRepository;

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

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

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

        // 세션에 회원 데이터가 없으면 home
        if(loginMember == null){
            return "main";
        }

        // 세션이 유지되면 로그인으로 이동
        model.addAttribute("member", loginMember);
        return "home";
    }
}
  • 세션을 조회 후 세션에 회원 데이터가 있으면 home.html로, 없으면 main.html로 이동
  • request.getSession(true / false) : 세션이 있으면 기존 세션을 반환
    • true : Default 값으로, 세션이 없으면 새로운 세션을 생성해서 반환
    • false : 세션이 없으면 새로운 세션을 생성하지 않고 null을 반환
  • request.getAttributes() : 로그인 시점에 세션에 보관한 객체를 찾음

LoginController.java

@Controller
@RequiredArgsConstructor
public class LoginController {

    private final LoginService loginService;

    @GetMapping("/login")
    public String loginForm(Model model){
        model.addAttribute("loginForm", new LoginForm());
        return "login/loginForm";
    }

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

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

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

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

        // 로그인 성공 처리
        // 세션이 있으면 세션 반환, 없으면 신규 세션 생성
        HttpSession session = request.getSession();
        session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember);
        return "redirect:/";
    }

    @PostMapping("/logout")
    public String logout(HttpServletRequest request, HttpServletResponse response){
        HttpSession session = request.getSession(false);
        if(session != null){
            session.invalidate();
        }
        return "redirect:/";
    }
}
  • session.setAttribute(String name, Object value) : 세션에 값 저장
  • session.invalidate() : 세션을 제거

스프링 세션 사용

HomeController.java

@Controller
@RequiredArgsConstructor
public class HomeController {

    private final MemberRepository memberRepository;

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

        // 세션에 회원 데이터가 없으면 home
        if(loginMember == null){
            return "main";
        }

        // 세션이 유지되면 로그인으로 이동
        model.addAttribute("member", loginMember);
        return "home";
    }
}
  • @SessionAttribute(name="세션이름", required=false) type name : 스프링에서 세션을 더욱 편하게 사용할 수 있도록 도와주는 어노테이션
    • 해당 기능은 세션을 생성하지는 않음
    • 세션을 찾고, 세션에 들어있는 데이터를 조회하는 번거로운 과정을 편리하게 처리

세션 관련 메서드
HttpSession session = request.getSession(false);

session.getId(); // 세션ID (UUID 값)
session.getMaxInactiveInterval(); //세션 유효시간
session.getCreationTime(); //세션 생성 일시
session.getLastAccessedTime(); //최근 접근 일시
session.isNew(); //이번 요청에서 생성된 값인지, 이전에 생성된 값을 조회한것인지 확인

세션 타임아웃 설정

application.yml

server:
  servlet:
    session:
      timeout: 60
  • 초 단위
  • Defalut : session.getMaxInactiveInterval()의 결과와 동일하게 1800(s)