로그인 처리 - 쿠키 & 세션
쿠키를 이용한 로그인 구현
알고리즘
- Contoller 에서 ID, PW 를 입력받는다.
- Repository 를 이용해 ID, PW 에 해당하는 회원을 반환한다.
- 회원 고유번호로 쿠키를 만들고 HttpServletResponse 객체에 추가한다.
- 영속쿠키와 세션쿠키
- 영속쿠키 : 브라우저가 종료되도 만료 날짜까지 유지되는 쿠키
세션쿠키 : 브라우저가 종료되기 전까지 유지되는 쿠키
쿠키의 값 조회 어노테이션 : @CookieValue
1
2
3
4
@GetMapping("/")
public String homeLogin(@CookieValue(name = "memberId", required = false) Long memberId) {
...
}
쿠키의 값을 조회하는 것이기 때문에 쿠키 객체를 조회하려면 HttpServletRequest 객체의 getCookies() 메서드를 이용해 조회해야 한다.
로그아웃 구현
- HttpServletRequest 객체의 getCookie() 메서드를 이용해 쿠키를 조회한다.
- 해당 쿠키의 만료 날짜를 0으로 만들고 HttpServletResponse 객체에 추가한다.
문제
- 쿠키 값을 임의로 변경할 수 있다.
- 쿠키에 보관된 정보를 탈취당할 수 있다.
- 해커가 쿠키를 훔쳐가면 평생 사용할 수 있다.
개선방안
- 쉽게 식별할 수 없도록 쿠키를 생성한다.
- 해커가 쿠키를 훔쳐가도 시간이 지나면 사용할 수 없도록 만료시간을 설정한다.
직접 구현한 세션을 이용한 로그인 구현
알고리즘
- Controller 에서 ID, PW 를 입력받는다.
- Repository 를 이용해 ID, PW 에 해당하는 회원을 반환한다.
- 고유한 세션 ID 를 생성하고 세션 ID 와 회원 정보를 매핑하여 보관한다.
- 세션 ID 로 쿠키를 만들고 HttpServletResponse 객체에 추가한다.
로그아웃 구현
- HttpServletRequest 객체의 getCookie() 메서드를 이용해 쿠키를 조회한다.
- 세션 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초