로그인 처리 - 쿠키, 세션

rooni97·2022년 9월 27일
0

Spring MVC2

목록 보기
1/2

로그인 처리하기 - 쿠키 사용

쿠키 생성

클라이언트 쿠키 전달

쿠키 종류

  • 영속 쿠키: 입력한 만료 날짜까지 유지
  • 세션 쿠키: 브라우저 종료 전까지 유지

로그아웃 기능

  • 서버에서 해당 쿠키의 종료 날짜를 0으로 지정
    Cookie cookie = new Cookie(cookieName, null);
     cookie.setMaxAge(0);
     response.addCookie(cookie);
     cookie.setMaxAge(0);

쿠키의 보안 문제

  • 쿠키 값을 임의로 변경하면 다른 사용자가 된다.
  • 쿠키 정보가 탈취될 수 있다.

대안

  • 쿠키에 해커가 예측할 수 없는 토큰을 담고 서버에서 토큰과 사용자 ID를 매핑하도록 한다. 토큰은 서버가 관리!
  • 해커가 토큰을 탈취해도 시간이 지나면 못쓰도록 서버가 만료시간을 짧게 유지
  • 해킹 의심되면 서버에서 토큰 강제 제거

로그인 처리하기 - 세션 동작 방식

중요한 정보를 쿠키에 넣으면 안되고 서버가 가지고 있어야함
클라이언트 - 서버는 임의의 식별자 값으로 연결해야함

세션이란?
서버에 중요한 정보를 보관하고 연결을 유지하는 방법

세션 동작 방식

1. 로그인

2. 세션 생성

  • 세션 ID(토큰)는 예측 불가 → UUID 같은 랜덤 값 사용
    Cookie: mySessionId=zz0101xx-bab9-4b92-9b32-dadb280f4b61
  • 세션 ID와 세션 값을 서버의 세션 저장소에 보관함
  • 앞으로 회원 관련 정보가 아닌 세션 ID 값만 쿠키를 통해 통신

3. 클라이언트의 세션ID 쿠키 전달

  • 클라이언트는 항상 mySessionId 쿠키 전달
  • 서버는 mySessionId로 세션 저장소 조회 후 정보 사용

정리

  • 쿠키 값 변조 위험 → 예측 불가, 복잡한 세션 ID 사용
  • 쿠키 값 탈취 위험 → 세션 ID에는 중요한 정보가 없음
  • 쿠키 탈취 후 사용 → 쿠키 만료시간을 짧게 혹은 강제 제거

로그인 처리하기 - 서블릿 HTTP 세션1

서블릿이 공식 지원하는 세션과 우리가 직접 만든 세션의 동작방식은 거의 같다.

서블릿은 HttpSession이라는 기능을 제공한다.

HttpSession

HttpSession과 우리가 만든 SessionManager는 같은 방식으로 동작
서블릿을 통해 HttpSession을 생성하면 다음과 같은 쿠키를 생성함
Cookie: JSESSIONID=5B78E23B513F50164D6FDD8C97B0AD05

세션 생성과 조회

request.getSession(true) (true 빼도 됨)

  • 세션이 있으면 기존 세션을 반환
  • 세션이 없으면 새로운 세션을 생성 후 반환

request.getSession(false)

  • 세션이 있으면 기존 세션을 반환
  • 세션이 없으면 null 반환

session.setAttribute(..)request.setAttribute(..)는 비슷하고, 하나의 세션에 여러 값을 저장할 수 있다.

session.invalidate(): 세션 제거


로그인 처리하기 - 서블릿 HTTP 세션2

@SessionAttribute

스프링이 제공하는 어노테이션으로
@SessionAttribute(name = "loginMember", required = false) Member loginMember 간단하게 사용할 수 있다.

TrackingModes

로그인 처음 시도 시 url은 jsessionid를 포함한다.

http://localhost:8080/;jsessionid=F59911518B921DF62D09F0DF8F83F872
  • 쿠키 대신 url을 통한 세션 유지 방식
  • 서버는 처음에 웹 브라우저가 쿠키를 지원하는지 판단할 수 없음
  • 따라서 url에 함께 전달되는 것
  • 항상 쿠키를 통한 세션 방식을 원하면 다음 옵션을 넣어주도록 하자

application.properties

server.servlet.session.tracking-modes=cookie

세션이 제공하는 정보들

  • sessionId: JSESSIONID
  • maxInactiveInterval: 세션 유효시간
  • creationTime: 세션 생성일시
  • lastAccessedTime: 최근 접근 시간, 클라이언트가 서버로 sessionId를 요청한 경우 갱신
  • isNew: 새로 생성된 세션인지, 과거에 만들어져 클라이언트가 서버로 요청해서 조회된 세션인지 여부

세션 무한정 보관?

  • 탈취당한 경우 시간이 오래 지나도 계속 쿠키 사용
  • 세션은 메모리에 생성되어 필요한 경우만 생성해야함

세션 타임아웃 설정

application.properties

server.servlet.session.timeout=60

60초, 기본은 1800(30분)이며 글로벌 설정은 분 단위로 설정해야함
특정 세션 단위로 시간 설정은 session.setMaxInactiveInterval(1800) 사용

세션 타임아웃 발생

세션 타임아웃 시간은 JSESSIONID를 전달하는 요청이 있으면 현재 시간으로 다시 초기화된다. LastAccessedTime 이후로 Timeout 시간이 만료되면 WAS가 내부에서 해당 세션을 제거한다.

정리

  • 실무에서는 세션에 최소한의 데이터만 보관해야함
  • 데이터용량 * 사용자 수로 메모리 사용량이 커지면 장애 발생
  • 세션 시간을 길게 가져가면 메모리 사용량 누적되므로 적당한 시간 설정할 것

0개의 댓글