ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 로그인 페이지 만들기
    스프링/스프링 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가 해킹당해도 여기에는 중요한 정보가 없다.
    • 해커가 토큰을 털어가도 시간이 지나면 사용할 수 없도록 서버에서 세션의 만료시간을 짧게 유지한다.
Designed by Tistory.