스프링/4. 스프링 MVC-2

46. 쿠키를 이용한 로그인 구현.

sdafdq 2023. 9. 5. 01:30

쿠키에 대해선 잘 모르겠다면

https://qwefdg3.tistory.com/204

 

여기를 참고하도록 하자.

 

여튼 논리자체는,

 

쿠키는 영속성 쿠키, 세션 쿠키 이렇게 두가지 종류가 있는데,

영속성 쿠키는 우리가 날짜 (expire 될 날짜) 를 정해주는 것으로, 웹브라우저를 꺼도 쿠키가 지정한 시간만큼 유지가 된다.

세션쿠키는 웹브라우저를 종료하면 그냥 사라진다.

 

그러므로, 로그인에는 세션쿠키가 더 알맞다.

 

 

@Slf4j
@Controller
@RequiredArgsConstructor
public class LoginContoller {
    private final LoginService loginService;

    @GetMapping("/login")
    public String loginForm(@ModelAttribute LoginForm form){
        return "login/loginForm";
    }

    @PostMapping("/login")
    public String login(@Validated @ModelAttribute LoginForm loginForm, BindingResult bindingResult, HttpServletResponse response){
        if(bindingResult.hasErrors()){
            return "login/loginForm";
        }

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

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

        Cookie idCookie = new Cookie("memberId", String.valueOf(loginMember.getId()));
        response.addCookie(idCookie);
        return "redirect:/";
    }

    @PostMapping("/logout")
    public String logout(HttpServletResponse response){
        expireCookie(response, "memberId");
        return "redirect:/";
    }

    private void expireCookie(HttpServletResponse response, String cookieName){
        Cookie cookie = new Cookie(cookieName, null);
        cookie.setMaxAge(0);
        response.addCookie(cookie);
    }
}

loginId를 통해 repository에서 member를 찾았다면,

쿠키를 만든다. memberId라는 key로, 값은 찾은 member의 id로 한다.

 

이 id는 loginId가 아닌 우리가 관리하기 위한 id이다.

 

여튼 그렇게 응답에 쿠키를 추가 해준다. 따로 expire에 대한 값을 주지 않았으므로 세션 쿠키가 된다.

 

로그아웃은 더 간단하다.

 

로그아웃 버튼을 누르면 Post로 /logout으로 요청하고,

 

expireCookie로 같은 쿠키 key로 

setMaxAge(0) 영속성을 (MaxAge같은 경우는 남은 시간, 초) 0으로 줘서 바로 끝내버린다.

그럼 쿠키가 사라진다.

 

 

둘 다 홈으로 리다이렉트 하게끔 해 놨는데,

 

 

@Slf4j
@Controller
@RequiredArgsConstructor
public class HomeController {

    private final MemberRepository memberRepository;
//    @GetMapping("/")
//    public String home() {
//        return "home";
//    }

    @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";
    }

}

아예 로그인 후 템플릿을 따로 만들었다. 확실히 그게 더 편해 보일듯도 싶다.

 

쿠키가 있고, 들어왔어도 그 들어온 쿠키에 관한 값을 memberRepository가 가지고 있을 때만 로그인 후 홈 화면으로 이동시킨다.

 

 

 

 

쿠키를 주는 것은 서버에서 주는 것이다.

서버에서 세션쿠키를 준다. 그러면 클라이언트 입장에서는 웹브라우저를 종료하기 전 까지 그 쿠키가 유지된다.

 

그 전까지는 계속해서 이 웹사이트의 하위나 (위에 안내한 쿠키에 관한 정보를 기입해놓은 링크를 들어가 보자. 도메인의 하위나 그런 것에 대한 설정까지도 할 수 있다.) 이 도메인에 들어가면 클라이언트는 계속 서버로 쿠키를 헤더에 포함해서 보내게 되어있다.

 

서버는 그 쿠키를 읽고 DB에서 회원 정보를 가져와서 활용하면 된다.

'스프링 > 4. 스프링 MVC-2' 카테고리의 다른 글

48. 서버 세션  (0) 2023.09.05
47. 쿠키의 보안문제  (0) 2023.09.05
45. 로그인 구현  (0) 2023.09.05
44. 멤버 회원가입 구현  (0) 2023.09.04
43. 도메인과 표현 분리  (0) 2023.09.04