기능 | method |
---|---|
생성 | Cookie cookie = new Cookie(String name, String value) |
값 변경/ 얻기 | cookie.setValue(String value) / String value = cookie.getValue() |
사용 도메인지정/ 얻기 | cookie.setDomain(String domain) / String domain = cookie.getDomain() |
값 범위지정/ 얻기 | cookie.setPath(String path) / String path = cookie.getPath() |
유효기간/ 얻기 | cookie.setMaxAge(int expiry) / int expiry = cookie.getMaxAge() |
쿠키 삭제 | cookie.setMaxAge(0) |
쿠키 전송 | response.addCookie(cookie) |
쿠키값 얻기 | Cookie cookies[] = request.getCookies() |
LoginService
@Service
@RequiredArgsConstructor
public class LoginService{
private final MemberRepository memberRepository;
public Member login(String loginId, String password){
return memberRepository.findByLoginId(loginId)
.filter(m -> m.getPassword().equals(password)
.orElse(null);
}
}
LoginController
@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") 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:/";
}
@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);
}
}
로그인성공시 서버에서 쿠키를 생성하고 HTTP헤더에 넣어 응답하는 것을 확인할 수 있다.
새로고침후 클라이언트가 다음 요청할 때 쿠키를 함께 보내는것을 확인할 수 있다
대안
기능 | method |
---|---|
생성 | HttpSession session = request.getSession() |
값 저장 | session.setAttribute(String name, Object value) |
값 얻기 | Object obj = session.getAttribute(String name) |
값 제거 | session.removeAttribute(String name) 특정이름의 속성제거, |
session.invalidate() binding되어 있는 모든 속성제거 | |
유효기간/ 얻기 | cookie.setMaxAge(int expiry) / int expiry = cookie.getMaxAge() |
생성시간 | long ct = session.getCreationTime() |
마지막 접근 시간 | long lat = session.getLastAccessedTime() |
LoginController
@PostMapping("/login")
public String login3(@Valid @ModelAttribute("loginForm") LoginForm form, BindingResult bindingResult, HttpServletRequest request){
if(bindingResult.hasErrors()){
return "login/loginForm";
}
Member loginMember = loginService.login(form.getLoginId(), form.getPassword());
if(loginMember == null){
bindingResult.reject("loginFail", "아이디 또는 비밀번호가 맞지 않습니다.");
return "login/loginForm";
}
//로그인 성공 처리
//세션이 있으면 있는 세션 반환, 없으면 신규 세션을 생성
HttpSession session = request.getSession();
//세션에 로그인 회원 정보 보관
session.setAttribute("loginMember", loginMember);
return "redirect:/";
}
@PostMapping("/logout")
public String logout3(HttpServletRequest request){
HttpSession session = request.getSession(false);
if(session!=null){
session.invalidate();
}
return "redirect:/";
}
로그인성공 시 서버에서 쿠키 이름이 JSESSIONID이고 값은 추정 불가능한 랜덤 값의 쿠키를 생성하여 응답한다.
새로고침후 클라이언트가 다음 요청할 때 세션이 만든 쿠키를 함께 보내는것을 확인할 수 있다