백 엔드/spring

스프링 -쿠키,세션

까르르꿍꿍 2022. 5. 13. 14:33

김영한 강의 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초