-
로그인 페이지 만들기스프링/스프링 MVC 패턴 2023. 2. 28. 15:34
회원 가입 페이지를 만들었으니 이제 로그인을 할 수 있는 페이지를 만들 것이다. 로그인 페이지만 만드는 것이고, 로그인이 성공하면 로그인 성공 페이지로 이동하고 실패하면 에러를 출력하는 페이지이다.
우선 도메인에 LoginService 클래스를 만들었다.
@Service @RequiredArgsConstructor public class LoginService { private final MemberRepository memberRepository; /** * @return null이면 로그인 실패 */ public Member login(String loginId, String password) { return memberRepository.findByLoginId(loginId) .filter(m -> m.getPassword().equals(password)) .orElse(null); } }
람다식을 활용하여 로그인 메서드가 id와 password를 만들어서 일치하면 그 일치한 값을 retrun 하고 일치하지 않으면 null을 return한다.
LoginForm.class
@Data public class LoginForm { @NotEmpty private String loginId; @NotEmpty private String password; }
로그인 아이디와 패스워드를 받아오는 객체 폼이다.
@Slf4j @Controller @RequiredArgsConstructor public class LoginController { private final LoginService loginService; @GetMapping("/login") public String loginForm(@ModelAttribute("loginForm") LoginForm form) { return "login/loginForm"; } @PostMapping("/login") public String login(@Valid @ModelAttribute LoginForm form, BindingResult bindingResult, HttpServletResponse response) { if (bindingResult.hasErrors()) { return "login/loginForm"; } Member loginMember = loginService.login(form.getLoginId(), form.getPassword()); if (loginMember == null) { bindingResult.reject("loginFail", "아이디 또는 비밀번호가 맞지 않습니다."); return "login/loginForm"; } //로그인 성공 처리 //쿠키에 시간 정보를 주지 않으면 세션 쿠키(브라우저 종료시 모두 종료) Cookie idCookie = new Cookie("memberId", String.valueOf(loginMember.getId())); response.addCookie(idCookie); return "redirect:/"; //로그인이 되면 홈으로 보내기 }
로그인 컨트롤러인데 Get방식으로는 loginForm을 보여주고 login을 하는 동작은 Post 방식이 처리한다.
아이디가 입력이 되지 않거나 아이디, 비밀번호가 다르면 로그인 폼으로 보내주며 로그인이 성공하면 쿠키를 만들어서 홈으로 리다이렉트 한다.
homeController
@GetMapping("/") public String homeLogin(@CookieValue(name = "memberId", required = false) Long memberId, Model model) { if (memberId == null) { return "home"; } //로그인 Member loginMember = memberRepository.findById(memberId); if (loginMember == null) { return "home"; } model.addAttribute("member", loginMember); return "loginHome"; }
홈 컨트롤러도 이전에는 그냥 home으로 return만 해줬는데 수정을 좀 했다.
@CookieValue 애노테이션을 파라미터에 넣으면 쿠키를 받아올 수 있다. 이때, false도 받아준 이유는 실패해서 돌아올 때에도 이 메서드를 실행해야하기 때문이다.
아이디가 없거나 아이디가 다를 때에는 home.html을 실행시키고, 로그인이 잘 되었을 때에는 loginHome.html을 실행시킨다.
로그인이 완료되었을 때의 홈 화면
LoginController 아래에 추가
@PostMapping("/logout") public String logout(HttpServletResponse response) { Cookie cookie = new Cookie("memberId", null); cookie.setMaxAge(0); response.addCookie(cookie); return "redirect:/"; }
LoginController에 logout을 해주는 코드도 추가해주었다.
로그아웃을 하는 방법은 새로운 쿠키를 만들어서 MaxAge를 0으로 설정해주는 것이다.
로그아웃을 누르면 맨 처음과 같은 화면으로 돌아가게 된다.
하지만 이런 쿠키 사용 방식은 보안 등의 문제가 있기때문에 세션을 이용하는 것이 필요하다.
세션을 사용하면
- 쿠키 값을 변조해서 예상 불가능한 복잡한 세션 Id를 사용함.
- 쿠키에 보관하는 정보는 클라이언트 해킹시 해킹 당할 가능성이 있지만 세션 Id가 해킹당해도 여기에는 중요한 정보가 없다.
- 해커가 토큰을 털어가도 시간이 지나면 사용할 수 없도록 서버에서 세션의 만료시간을 짧게 유지한다.
'스프링 > 스프링 MVC 패턴' 카테고리의 다른 글
서블릿 필터 (0) 2023.03.01 서블릿 Http 세션 (0) 2023.02.28 상품 등록 전 로그인하기 - 회원가입 페이지 만들기 (0) 2023.02.28 등록과 수정의 검증 분리 - V4 (0) 2023.02.25 상품 수정 검증, 검증 groups - V3 (0) 2023.02.25