로그인, 로그아웃 과정
로그인 과정
- 아이디, 비밀번호 일치 여부 확인
- 불일치 시 로그인 화면 페이지로 이동
- 일치 시 세션 생성 및 저장
- 세션 유지 시 메인 페이지(home.html)로 이동
로그아웃 과정
- 세션 제거
- 세션 유지 확인
서블릿 세션 적용
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)
'개발진행목록 > 게시판 서비스' 카테고리의 다른 글
[JPA로 게시판 만들기] Spring Interceptor를 사용한 인증 체크 (0) | 2025.03.04 |
---|---|
[JPA로 게시판 만들기] 지연로딩 적용 (0) | 2025.02.05 |
[JPA로 게시판 만들기] API 개발 (0) | 2025.02.05 |
[JPA로 게시판 만들기] 테스트 코드 작성 (0) | 2025.01.23 |
[JPA로 게시판 만들기] TDD, BDD 란 (1) | 2025.01.23 |