쿼리 파라미터를 계속 유지하며 로그인 상태를 유지하는 것은 어렵고 번거로움
➡️ 쿠키를 사용하여 로그인 상태를 유지
서버에서 로그인에 성공하면 HTTP 응답에 쿠키를 담아서 브라우저에 전달
-> 브라우저는 앞으로 해당 쿠키를 지속해서 보냄
브라우저 종료 시에는 로그아웃이 되어야 하므로 세션 쿠키 사용
(쿠키에 만료 날짜를 생략하면 세션 쿠키)
@PostMapping("/login")
public String login(//... , HttpServletResponse response) {
// 쿠키 생성
Cookie 쿠키변수 = new Cookie(string name,string value);
// 생성한 쿠키를 response에 담아 전달
response.addCookie(쿠키변수);
//...
//ex)
//Cookie idCookie = new Cookie("userId", String.valueOf(User.getId()));
//response.addCookie(idCookie);
//return "redirect:/";
}
@PostMapping("/logout")
public String logout(HttpServletResponse response) {
expireCookie(response,"userId");
return "redirect:/";
}
private void expireCookie(HttpServletResponse response, String cookieName) {
// 응답 쿠키 생성
Cookie cookie = new Cookie(cookieName, null);
// 즉시 종료
cookie.setMaxAge(0);
response.addCookie(cookie);
}
쿠키 값은 임의로 변경이 가능함
클라이언트가 쿠키를 강제로 변경한다면 다른 사용자가 됨
쿠키에 보관된 정보는 보안에 취약
쿠키에 보관된 정보는 훔쳐갈 수 있음
쿠키는 웹 브라우저에도 보관되고, 네트워크 요청마다 클라이언트에서 서버로 전달됨
-> 탈취 가능한 경로가 많음
만약 쿠키에 중요한 정보를 저장하고 있다면 문제가 발생할 것
탈취한 쿠키로 악의적인 요청을 계속 시도할 수 있음
해커가 쿠키를 훔쳐간다면 그 쿠키를 평생 사용할 수 있음
토큰 사용
쿠키에 중요한 값 노출 X, 사용자 별로 예측 불가능한 임의의 토큰을 노출
-> 서버에서는 토큰과 사용자 id를 매핑해서 인식, 토큰은 서버에서 관리
(토큰은 해커가 임의의 값을 넣어도 찾을 수 없도록 예상 불가능해야 함)
토큰을 탈취당하더라도 시간이 지나면 사용할 수 없도록 설정
토큰의 만료 시간을 짧게 유지
혹은 해킹 의심되는 경우엔 서버에서 토큰 강제 삭제
쿠키에 중요한 정보를 보관하는 것은 여러가지 보안 이슈가 존재
쿠키의 보안 문제를 해결하기 위해선 중요한 정보를 서버에 저장해야 함
➕ 클라이언트와 서버는 추정 불가능한 임의의 식별자 값으로 연결해야 함
Id, Password 입력하여 로그인 요청
Id와 Password가 일치 여부 확인
추정 불가능한 세션 ID(토큰)를 생성하여 key값으로 사용, value로 회원 객체 저장
(세션 저장소)
세션 ID 생성하는데 JAVA 제공 UUID 사용
String sessionId = UUID.randomUUID().toString();
UUID는 추정이 불가능
Cookie: mySessionId=zz0101xx-bab9-4b92-9b32-dadb280f4b61
세션 ID를 응답 쿠키로 전달
클라이언트는 쿠키 저장소에 세션 ID 저장
회원과 관련된 정보는 클라이언트에 전달 ❌, 추정 불가능한 세션 ID 값만 전달
로그인 이후 클라이언트는 요청마다 항상 서버로 세션 ID 쿠키를 전달
서버는 전달받은 세션 ID값을 가지고 세션 저장소를 조회
예상 불가능한 세션 ID를 사용
➡️ 쿠키 값 변조하더라도 세션 ID를 찾을 수 없을 것
세션의 만료 시간을 짧게 유지 ( or 해킹 의심이 되는 경우 해션 강제 삭제)
(ex: 세션 저장소에 일정 시간 사용하지 않은 세션 삭제)
➡️ 쿠키를 해킹당해 탈취당하더라도 세션 ID만 탈취 당할 것, 세션 ID에는 중요한 정보가 없음
➡️ 해커가 탈취한 토큰(세션 ID)을 사용하려 한다해도 세션 저장소에 해당 세션 ID가 없기에 문제 없음
세션 관리는 크게 세션 생성, 세션 조회, 세션 만료 기능을 제공
인프런 스프링 MVC 2편 - 백엔드 웹 개발 핵심 기술 (김영한) 참조