Post

로그인 처리 - 쿠키 & 세션

쿠키를 이용한 로그인 구현

알고리즘

  1. Contoller 에서 ID, PW 를 입력받는다.
  2. Repository 를 이용해 ID, PW 에 해당하는 회원을 반환한다.
  3. 회원 고유번호로 쿠키를 만들고 HttpServletResponse 객체에 추가한다.
영속쿠키와 세션쿠키
영속쿠키 : 브라우저가 종료되도 만료 날짜까지 유지되는 쿠키
세션쿠키 : 브라우저가 종료되기 전까지 유지되는 쿠키

쿠키의 값 조회 어노테이션 : @CookieValue

1
2
3
4
@GetMapping("/")
public String homeLogin(@CookieValue(name = "memberId", required = false) Long memberId) {
	...
}

쿠키의 값을 조회하는 것이기 때문에 쿠키 객체를 조회하려면 HttpServletRequest 객체의 getCookies() 메서드를 이용해 조회해야 한다.

로그아웃 구현

  1. HttpServletRequest 객체의 getCookie() 메서드를 이용해 쿠키를 조회한다.
  2. 해당 쿠키의 만료 날짜를 0으로 만들고 HttpServletResponse 객체에 추가한다.

문제

  1. 쿠키 값을 임의로 변경할 수 있다.
  2. 쿠키에 보관된 정보를 탈취당할 수 있다.
  3. 해커가 쿠키를 훔쳐가면 평생 사용할 수 있다.

개선방안

  1. 쉽게 식별할 수 없도록 쿠키를 생성한다.
  2. 해커가 쿠키를 훔쳐가도 시간이 지나면 사용할 수 없도록 만료시간을 설정한다.

직접 구현한 세션을 이용한 로그인 구현

알고리즘

  1. Controller 에서 ID, PW 를 입력받는다.
  2. Repository 를 이용해 ID, PW 에 해당하는 회원을 반환한다.
  3. 고유한 세션 ID 를 생성하고 세션 ID 와 회원 정보를 매핑하여 보관한다.
  4. 세션 ID 로 쿠키를 만들고 HttpServletResponse 객체에 추가한다.

로그아웃 구현

  1. HttpServletRequest 객체의 getCookie() 메서드를 이용해 쿠키를 조회한다.
  2. 세션 ID 와 회원 정보를 매핑한 자료구조에서 세션 ID(쿠키 값) 를 제거한다.

서블릿이 제공하는 세션 : HttpSession

HttpSession 도 직접 구현한 세션과 비슷한 방식으로 동작한다.

다만, 클라이언트에 저장되는 쿠키 이름이 JSESSIONID 이다.

로그인을 처음 시도하면 URL에 jsessionid 가 포함된다.
이는 웹 브라우저가 쿠키를 지원하지 않으면 URL 포함된 jsessionid 를 이용해 세션을 유지해야하기 때문이다.
최초 로그인 시 서버는 웹 브라우저가 쿠키를 지원하는지 안하는지 모르기 때문에 URL 에 jsessionid 를 포함한다.
이 기능을 사용하지 않으려면 application.properties 파일에 server.servlet.session.tracking-modes=cookie 를 추가하면 된다.

세션 생성

1
HttpSession session = request.getSession();  // or request.getSession(true);
getSession() , getSession(true)
요청에 세션이 있으면 세션을 반환하고 없으면 신규 세션을 생성한다.
getSession(false)
요청에 세션이 있으면 세션을 반환하고 없으면 null 을 반환한다.

세션에 데이터 저장

1
session.setAttribute(String name, Object value);

request.setAttribute(…) 메서드와 비슷하다. 즉, 하나의 세션에 여러 값을 저장할 수 있다.

세션에 저장된 데이터 조회

1
session.getAttribute(String name);

@SessionAttribute 를 사용하면 편리하게 세션에 저장된 값을 조회할 수 있다.

참고로 이 기능은 세션을 생성하지 않는다.

1
2
3
4
@GetMapping("/")
public String home(@SessionAttribute(name = "[attribute-name]", required = false) Member loginMember) {
	...
}

세션 제거

1
session.invalidate();

세션 타임아웃 설정

세션도 해커가 탈취하면 악의적으로 사용이 가능하다.

세션은 서버의 메모리에 저장되는데 용량이 한정적이기 때문에 꼭 필요한 세션만 저장해야 한다.

그래서 세션의 타임아웃은 꼭 설정해야 한다.

세션의 기본 타임아웃 시간은 1800초(30분) 이다.

HttpSession 은 마지막 세션 접근 시간(lastAccessedTime) 으로부터 타임아웃 시간이 지났을 때 세션이 만료되는 방식을 사용한다.

세션이 만료되면 was 가 내부에서 해당 세션을 제거한다.

글로벌 세션 타임아웃 설정

1
server.servlet.session.timeout=60  // 60초. 분 단위로 설정해야 한다.

특정 세션 단위로 시간 설정

1
session.setMaxInactiveInterval(1800);  // 1800초
This post is licensed under CC BY 4.0 by the author.