스프링 -쿠키,세션
김영한 강의 MVC 2편 정리
쿠키
쿠키는 클라이언트가 서버에 접속할때 로그인 상태인지 아닌지 구별하기 위해 존재한다.
클라이언트가 서버에 요청을 보내면 서버는 쿠키값을 준다. 그리고 그 이후의 클라이언트 요청에 쿠키값과 서버에 저장한 쿠키랑 비교하면서 일치하면 로그인한 결과창을 보내준다.
로그인 시 쿠키 생성코드
Cookie idCookie = new Cookie("memberId", String.valueOf(loginMember.getId()));
response.addCookie(idCookie);
쿠키에는 영속 쿠키와 세션 쿠키가 있다.
영속 쿠키: 만료 날짜를 입력하면 해당 날짜까지 유지
세션 쿠키: 만료 날짜를 생략하면 브라우저 종료시 까지만 유지
로그아웃 기능
세션 쿠키이므로 웹 브라우저 종료시 서버에서 해당 쿠키의 종료 날짜를 0으로 지정
Cookie cookie = new Cookie(cookieName, null);
cookie.setMaxAge(0);
response.addCookie(cookie);
보안 문제
쿠키 값은 임의로 변경할 수 있다.
클라이언트가 쿠키를 강제로 변경하면 다른 사용자가 된다.
실제 웹브라우저 개발자모드 Application Cookie 변경으로 확인
Cookie: memberId=1 Cookie: memberId=2 (다른 사용자의 이름이 보임)
쿠키에 보관된 정보는 훔쳐갈 수 있다.
만약 쿠키에 개인정보나, 신용카드 정보가 있다면?
이 정보가 웹 브라우저에도 보관되고, 네트워크 요청마다 계속 클라이언트에서 서버로 전달된다.
쿠키의 정보가 나의 로컬 PC가 털릴 수도 있고, 네트워크 전송 구간에서 털릴 수도 있다.
해커가 쿠키를 한번 훔쳐가면 평생 사용할 수 있다.
해커가 쿠키를 훔쳐가서 그 쿠키로 악의적인 요청을 계속 시도할 수 있다.
이 문제를 해결하려면 결국 중요한 정보를 모두 서버에 저장해야 한다. 그리고 클라이언트와 서버는 추정 불가능한 임의의 식별자 값으로 연결해야 한다
세션
세션 ID를 생성하는데, 추정 불가능해야 한다.
UUID는 추정이 불가능하다. ex)Cookie: mySessionId=zz0101xx-bab9-4b92-9b32-dadb280f4b61
생성된 세션 ID와 세션에 보관할 값( memberA )을 서버의 세션 저장소에 보관한다
여기서 중요한 포인트는 회원과 관련된 정보는 전혀 클라이언트에 전달하지 않는다는 것
만약 쿠키를 탈취 당한다면?
쿠키 탈취 후 사용 해커가 토큰을 털어가도 시간이 지나면 사용할 수 없도록 서버에서 세션의 만료시간을 짧게(예: 30분) 유지한다. 또는 해킹이 의심되는 경우 서버에서 해당 세션을 강제로 제거하면 된다
HttpSession 기능
//세션이 있으면 있는 세션 반환, 없으면 신규 세션 생성
HttpSession session = request.getSession();
//세션에 로그인 회원 정보 보관
session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember);
세션 생성과 조회
세션을 생성하려면 request.getSession(true) 를 사용하면 된다.
public HttpSession getSession(boolean create);
세션의 create 옵션에 대해 알아보자.
request.getSession(true) -세션이 있으면 기존 세션을 반환한다. 세션이 없으면 새로운 세션을 생성해서 반환한다. request.getSession(false) -세션이 있으면 기존 세션을 반환한다. 세션이 없으면 새로운 세션을 생성하지 않는다. null 을 반환한다.
request.getSession() : 신규 세션을 생성하는 request.getSession(true) 와 동일하다.
세션에 로그인 회원 정보 보관
session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember);
세션에 데이터를 보관하는 방법은 request.setAttribute(..) 와 비슷하다. 하나의 세션에 여러 값을 저장할 수 있다.
세션의 값에 쿠키이름과 쿠키 값을 저장한다.
조회는 세션의 값으로 조회
세션 삭제 기능
//세션을 삭제한다.
HttpSession session = request.getSession(false);
if (session != null) {
session.invalidate();
session.invalidate() : 세션을 제거한다.
세션값과 쿠키이름에 해당하는 객체 찾기
session.getAttribute(SessionConst.LOGIN_MEMBER) : 로그인 시점에 세션에 보관한 회원 객체를 찾는다.
스프링에서 지원하는 기능
이미 로그인 된 사용자를 찾을 때는 다음과 같이 사용하면 된다. 참고로 이 기능은 세션을 생성하지 않는다.
@SessionAttribute(name = SessionConst.LOGIN_MEMBER, required = false)
Member loginMember,Model model)
URL에 세션값 담기는거 뺴기
HTTPSession기능은 처음 세션을 보낼때 URL에 세션값도 같이 보냈다. 이 이유는 최초에 서버 입장에서 웹브라우저가 쿠키를 지원하는지 안하는지 판단이 불가능 하기 떄문이다. 이 전달 방식을 끄기 위해서는
application.properties파일에
server.servlet.session.tracking-modes=cookie
이 코드를 추가한다.
세션정보와 타임아웃설정
세션정보
sessionId : 세션Id, JSESSIONID 의 값이다
. 예) 34B14F008AA3527C9F8ED620EFD7A4E1
maxInactiveInterval : 세션의 유효 시간, 예) 1800초, (30분)
creationTime : 세션 생성일시
lastAccessedTime : 세션과 연결된 사용자가 최근에 서버에 접근한 시간, 클라이언트에서 서버로 sessionId ( JSESSIONID )를 요청한 경우에 갱신된다.
isNew : 새로 생성된 세션인지, 아니면 이미 과거에 만들어졌고, 클라이언트에서 서버로 sessionId ( JSESSIONID )를 요청해서 조회된 세션인지 여부
타임아웃 설정-(타임아웃이란-> 세션 유지시간)
글로벌
application.properties파엘에
server.servlet.session.timeout=60(초단위,최소 60)
특정세션 설정
session.setMaxInactiveInterval(1800); //1800초