세션쿠키를 사용하면 브라우저가 종료되기 전까지 웹브라우저에 쿠키정보가 남아있어서 한번 로그인 한 후에는 로그아웃 후에 추가적인 정보입력없이 바로 로그인 할 수 있다.
@GetMapping("/login")
public String loginForm(@ModelAttribute("loginForm") LoginForm form) {
return "login/loginForm";
}
@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());
if (loginMember == null) {
bindingResult.reject("loginFail", "아이디 또는 비밀번호가 맞지 않습니다.");
return "login/loginForm";
}
//로그인 성공 처리 TODO
//쿠키에 시간 정보를 주지 않으면 세션 쿠키(브라우저 종료시 모두 종료)
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);
}
하지만 보안상 큰 문제가 있는데,
1. 쿠키 값은 임의로 변경할 수 있다.
=> 클라이언트가 쿠키를 강제로 변경하면 다른 사용자가 된다
2. 쿠키에 보관된 정보는 훔쳐갈 수 있다.
=> 쿠키에 개인정보나 신용카드 정보가 있다면?
=> 해커가 쿠키를 훔쳐가서 그 쿠키로 악의적인 요청을 계속 시도할 수 있다.
대안
1. 쿠키에 중요한 값을 노출하지 않고, 사용자 별로 예측 불가능한 토큰(랜덤 값)을 노출하고, 서버에서 토큰과 사용자 id를 매핑해서 인식한다. 그리고 서버에서 토큰을 관리한다.
2. 토큰은 해커가 임의의 값을 넣어도 찾을 수 없도록 예상 불가능 해야 한다.
3. 해커가 토큰을 털어가도 시간이 지나면 사용할 수 없도록 서버에서 해당 토큰의 만료시간을 짧게(예:30분)유지한다. 또는 해킹이 의심되는 경우 서버에서 해당 토큰을 강제로 제거하면 된다.
그래서 대안책으로 나온 것이 세션인데, 세션은 서버에 중요한 정보를 보관하고 연결을 유지하는 방법이다.
회원과 관련된 정보는 전혀 클라이언트에 전달하지 않고, 오직 추정 불가능한 세션 ID만 쿠키를 통해 클라이언트에 전달한다.
'Languages | Frameworks > Spring' 카테고리의 다른 글
[Spring] 세션 타임아웃 (0) | 2022.06.02 |
---|---|
[Spring] jsessionid를 url에 노출안시키기(쿠키를 통해서만 세션 유지) (0) | 2022.06.02 |
[Java] 순서대로 저장, 출력하는 HashMap - LinkedHashMap (0) | 2022.05.02 |
[SpringBoot] RestApi 구현하기 위한 List<Map> 사용 (0) | 2022.05.02 |
[SpringBoot] mybatis resultType HashMap Null값 받기 (0) | 2022.05.02 |