로그인 구현

꿀이·2022년 1월 23일
0

로그인 처리

indext.html 에서 넘겨받은 loginId & password 를 이용해서 멤버 객체를 DB에서 가져온다. 이후 쿠키를 설정하고 "/mainPage" 로 모델과 함께 넘겨주자!

우선은 쿠키로 로그인 상태를 유지하고 조금 있다가 세션을 적용해보자

    @PostMapping("/login")
    public String login(@ModelAttribute LoginForm loginForm, Model model , HttpServletResponse response) {
        Member loginMember = memberRepository.findByLoginId(loginForm.getLoginId(), loginForm.getPassword());

        //쿠키에 시간 정보를 주지 않으면 세션 쿠키(브라우저 종료시 모두 종료)
        Cookie idCookie = new Cookie("memberId", String.valueOf(loginMember.getId()));
        response.addCookie(idCookie);

        model.addAttribute("member", loginMember);
        return "/mainPage";
    }

잠깐 근데 이거 검증하는것좀 한번 해보자, @Valid, BindingResult 를 사용해보자, 두개를 사용하면 사용자가 잘못입력을 했을때 오류화면을 띄워주는게 아니라 홈으로 다시 보내줄 수 있다.

원래 오류가 발생하면 아래코드를 실행하지 않고 튕겨져서 나가는데, BindingResult를 사용하면 오류를 안고 아래 코드를 실행한다. 그래서 만약 에러가 있다면 홈화면으로 보내주겠다!! 이런걸 조건문을 걸어줄 수 있다.

    public String login(@Valid @ModelAttribute LoginForm loginForm,
                        BindingResult result,
                        Model model,
                        HttpServletResponse response) {
        if (result.hasErrors()) {
            return "members/loginMemberForm";
        }

DB에 회원이 존재하지 않아도 로그인 화면으로 다시 보내줄거다.

        Member loginMember = memberRepository.findByLoginId(loginForm.getLoginId(), loginForm.getPassword());
        
        if (loginMember == null) {
            return "members/loginMemberForm";
        }

세션 적용

쿠키에 회원ID 를 포함시키면 조작등으로 인해서 개인정보등이 유출될 수 있다. 이를 위해서 세션을 도입해볼까?!

웹브라우저에서 회원 정보를 서버로 전달하면 서버쪽에서 회원정보를 repository에서 가져온 후에 Map<> 등에다가 키값으로 랜덤한 값을 생성하고, 찾은 회원객체와 함께 맵에 넣어준다. 이후 클라이언트에 응답을 할 때 쿠키에 이 랜덤한 키값을 넘겨준다.

세션 생성

로그인이 성공했을때 세션을 생성해주고 sessionId 와 회원객체를 매핑시켜준다. -> 지금은 객체를 매핑시켜줬는데, 나중에는 id값만 매핑을 시켜줘야 할까?

현재는 메모리상에서 세션을 관리하기 때문에 대량의 접속자가 접속을 한다면 메모리가 터질 수도 있다. 지금이야 멤버 객체가 가지고 있는정보가 몇개 없어서 문제는 안되겠지만... 나중에 점점 많아진다면..?

로그인 상태에 따라 구분

로그인 여부에 따라 layout 왼쪽 menu 부분에 login폼을 띄워 줄지, 로그인 정보를 띄워 줄지 결정이 되는데 우선은 다음과 같이 세션정보를 가져와서 어떤 view를 띄워줄지 결정하자.

근데 이게 이렇게 하는게 맞는지는 모르겠다. 여러 서비스를 이용할때마다 처리해야 하는 화면을 두개씩 만들어야 하나? 아니면 아예 로그인이 안되면 서비스 이용을 못하게 막아야 하나?(이건 싫은데...) layout을 보통 어떻게 구성하고 뿌려주는지 한번 찾아봐야겠다.


필터, 인터셉트?

가나다라마바사 아자차카타파하

profile
내게 맞는 옷을 찾는중🔎

0개의 댓글