다잘하고싶어

[Spring] 로그인구현2_쿠키 활용 본문

이론학습/SRPING

[Spring] 로그인구현2_쿠키 활용

챙영잉 2022. 10. 7. 15:18

쿠키 

서버에서 로그인에 성공하면 HTTP 응답에 쿠키를 담아서 브라우저로 전달함.

로그인폼에서 아이디랑 비밀번호를 입력 후 로그인 버튼을 클릭하면

클라이언트(웹브라우저)에서 서버로 전송된다.

서버에서는 회원저장소 안에 회원정보가 존재하는 지를 확인하고, 정보가 존재하면 로그인 성공시킨다(비밀번호도 맞아야함)

이때, 존재하면 쿠키를 만들어서 웹 브라우저에 전달해준다.

즉, 로그인 성공처리과정에서 쿠키를 만들어서 클라이언트에게 전달해줘야한다는 의미.

 

웹브라우저는 내부의 쿠키저장소라는 곳에서 쿠키를 들고 있는다. 예를 들어 멤버아이디를 넘겨줬다면,(memberId = 1)

 

이후 웹브라우저는 다른 페이지에 접근할 경우, 전송할 때 항상 쿠키를 포함해서 전송한다. (memberId = 1)

  - 로그인 아이디 아니라 클래스 상의 아이디

 

쿠키의 종류: 영속쿠키, 세션쿠키

- 영속쿠키 : 만료 날짜를 입력하면 해당 날짜까지 유지

- 세션쿠키 : 만료 날짜를 생략하면 브라우저 종료시까지만 유지

 

브라우저 종료시에 로그아웃이 되길 원하므로 세션쿠키를 사용하도록 한다.

 

쿠키 만들기

loginMember.getLoginId()는 Long 인데, new Cookie( ) 안에는 String 이 들어가야하므로 에러남.

 

생성한 쿠키를 서버에서 http 응답으로 보낼 때 response에 넣어주어야한다.

따라서 아래와 같이 HttpServletResponse를 추가해준다.

 

//쿠키에 시간정보를 주지 않으면 세션쿠기(브라우저 종료시 모두 종료)
Cookie idCookie = new Cookie("memberId", String.valueOf(loginMember.getLoginId()));
//생성한 쿠키를 서버에서 http 응답으로 보낼 때 response에 넣어주어야한다.
//따라서 httpServlet Response 가 필요.
response.addCookie(idCookie);
return "redirect:/";

 

실행한 후 로그인 하고 나면 

 

쿠키가 생성된 것을 확인할 수 있다. Set-Cookie: memberId =1

 

 

이후 다른 페이지로 이동하더라도 RequestHeader를 보면 Cookie 가 존재하는 것을 확인할 수 있다.

 

Application 에 Cookies에서도 확인 가능함.

 

 

쿠키를 활용한 로그인 정보 표시

새로운 홈 화면_HomeController

 

 

 

@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"; //로그인 사용사 전용 홈


    }

}

 

쿠키를 받는 여러가지 방식 , 여기서는 스프링이 제공하는 방식을 사용
required = false -> 로그인 안 한 사용자도 들어오게 하도록 위함

 

로그아웃 

쿠키를 날리면 됨.

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

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

cookie.setMaxAge(0); 쿠키의 시간을 0으로 설정 -> 쿠키 종료 됨.

 

 

쿠키만으로 로그인 로그아웃을 구현할 수 있다.

그러나 쿠키를 사용하지 않는 이유?

 

https://22chaechae.tistory.com/14

 

 

 

 

 

 


 

Reference:

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-2/dashboard

 

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 - 인프런 | 강의

웹 애플리케이션 개발에 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. MVC 2편에서는 MVC 1편의 핵심 원리와 구조 위에 실무 웹 개발에 필요한 모든 활용 기술들을 학습할 수 있

www.inflearn.com

강의 듣고 내용 정리중