쿠키를 사용한 로그인#
로그인 상태 유지하기
로그인에 성공하면, 쿠키를 생성하고 HttpServletResponse에 담는다.
웹 브라우저는, 세션이 끊기기 전까지 쿠키를 서버에 계속 보내줌
로그아웃시에는, 똑같은 이름의 새 쿠키를 생성하고,.setMaxAge(0)으로 지속시간을 없애고, HttpServletResponse 에 담아주면 된다.
보안문제#
쿠키값은 임의로 바뀔 수도 있고, 웹 브라우저에 보관되기 때문에 누군가 정보를 훔처갈 수도 있음 해커가 한번 쿠키를 가져가면 평생 사용 가능
대안
- 토큰을 사용, 서버에서 매핑해서 인식, 서버에서 토큰 관리(만료시간짧게)
세션 동작 방식#
쿠키는 여러 보안 이슈가 있다. 이 문제를 해결하기 위해, 중요한 정보는 서버에 저장하고, 클라이언트와 서버를 임의의 식별자 값으로 연결해야 한다.
로그인
- 사용자가
loginId,password정보를 전달하면 서버에서 확인한다.
세선 생성
응답 쿠키
결국 쿠키를 사용하지만, 클라이언트는 세션ID만 가지고 있을 뿐 중요한 정보는 서버에 있다
클라이언트의 쿠키 전달
세션 직접 만들기#
생성
- sessionID(UUID사용) 생성
- 세션 저장소에 sessionId와 값 저장
- sessionId가 담긴 쿠키를 클라이언트에 전달
조회
- 클라이언트가 요청한 sessionId(쿠키) 값으로, 세션 저장소 조회
만료
- 클라이언트가 요청한 sessionId 값으로 세션 저장소에서 제거
세션은 특별한게 아니고 단지 쿠키를 사용해서 서버에서 데이터를 유지하는 방법일 뿐이다
서블릿 Http 세션#
서블릿의 HttpSession 기능을 사용
세션 생성 & 조회
request.getSession(true) default
- 세션이 있으면 기존 세션 반환, 없으면 생성
false를 주면, 없으면null반환
** 정보보관 & 삭제 **
- 보관
session.setAttribute(String name, Object value);로 값 넣기 - 삭제
public String logoutV3(HttpServletRequest request) {
HttpSession session = request.getSession(false);
if (session != null) {
session.invalidate();
}
return "redirect:/";
}
//request.getSession(false)로 세션이 있는지 확인
//만일 세션이 있으면 invalidate()를 통해 제거@SessionAttribute를 통해 세션에서 간단하게 꺼낼 수 있음
@GetMapping(.....)
public String homeLoginV3Spring(
@SessionAttribute(name = "loginMember",
required = false) Member loginMember, Model model)세션 정보와 타임아웃#
**세션 기본 정보 **
sessionId: 세션아이디maxInactiveInterval유효시간creationTime: 생성일시lastAccessedTime: (사용자가) 최근 서버에 접근한 시간isNew새로 생성됬는지
타임아웃 설정 현재 사용자가 로그아웃을 하지 않으면, 서버는 세션 데이터를 계속 보관해야함 따라서, 사용자가 최근에 요청한 시간을 기준으로 생존시간을 유지해줌
- 글로벌 설정
application.properties에 설정server.servlet.session.timeout=60(60초) - 특정 세션 단위로 설정
session.setMaxInactiveInterval(60);
lastAcessTime 이후로 timeout 시간이 지나면, Was가 세션을 제거해줌
** 세션은 기본적으로 메모미를 사용하므로, 최소한의 정보만 보관하자**