개발(~국비)/Spring
6.로그인세션
까만밀가루
2022. 11. 29. 09:01
로그인 처리하기 - 쿠키 사용
쿠키
- 영속 쿠키 : 만료 날짜를 입력하면 해당 날짜까지 유지
- 세션 쿠키 : 만료 날짜를 생략하면 브라우저 종료시까지만 유지
LoginController
// @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());
log.info("login? {}", loginMember);
if (loginMember == null) {
bindingResult.reject("loginFail", "아이디 또는 비밀번호가 맞지 않습니다.");
return "login/loginForm";
}
//로그인 성공 처리 TODO
//쿠키에 시간 정보를 주지 않으면 세션 쿠키(브라우저 종료시 모두 종료)
Cookie idCookie = new Cookie("memberId", String.valueOf(loginMember.getId()));
response.addCookie(idCookie);
return "redirect:/";
}
// @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";
}
쿠키를 생성하여 @Cookievalue를 이용하여 쿠키 조회
로그아웃시엔 세션 쿠키이므로 웹 브라우저 종료시 종료, 서버에서 해당 쿠키의 종료 날짜를 0으로 지정
이러한 쿠키는 임의로 변경할 수 있으며, 보관된 정보를 훔쳐갈 수 있고 한번 훔쳐가면 평생 사용할 수 있는 보안 문제를 가지고 있다.
로그인 처리하기 - 세션 동작 방식
클라이언트와 서버는 쿠키로 연결되어야 하며 세션 ID만 쿠키게 담아서 전달한다.
이때 회원과 관련된 정보는 전혀 클라이언트에 전달하지 않으며 세션 ID만 쿠키를 통해 클라이언트에 전달
세션 직접 만들기
세션 생성
- sessionId 생성(임의의 추정 불가능한 랜덤 값)
- 세션 저장소에 sessionId와 보관할 값 저장
- sessionId로 응답 쿠키를 생성해서 클라이언트에 저장
세션 조회
- 클라이언트가 요청한 sessionId 쿠키의 값으로 세션 저장소에 보관한 값 조회
세션 만료
- 클라이언트가 요청한 sessionId 쿠키의 값으로 세션 저장소에 보관한 sessionId와 값 제거