로그인 상태를 유지하는 방법

 

1.  쿠키

HTTP 응답 시 쿠키에 데이터를 담아서 브라우저에 전달하면 브라우저의 쿠키 저장소에 쿠키가 저장이 되어 이후 요청을 보낼 때 쿠키를 같이 전송한다.

쿠키를 생성할 때는 일정 시간동안 유지되는 영속 쿠키, 브라우저 종료시까지 유지되는 세션 쿠키(만료 날짜 생략)가 있다. 또한 @CookieValue 애노테이션을 사용하면 편리하게 쿠키를 조회할 수 있다.

 

쿠키의 문제점

클라이언트가 쿠키 값을 임의로 변경할 수 있기 때문에 보안에 취약하다.

쿠키에는 임의의 예측 불가능한 값의 토큰을 생성해서 노출하고 서버에서는 해당 토큰을 매핑해서 중요한 데이터를 관리하는 방법이 있다.

이렇게 서버에 중요한 데이터를 보관하고 연결을 유지하는 방법을 세션이라 한다.

 

2.  세션

세션을 생성하고 sessionId로 쿠키를 생성해서 클라이언트에 전달하면, 클라이언트는 쿠키를 보관하면서 이후 요청 시 쿠키를 통해 세션 저장소에 저장된 값을 조회할 수 있고 세션이 만료되면 연결이 끊어지게 된다.

서블릿이 제공하는 HttpSession은 JSESSIONID 라는 이름의 쿠키를 생성하고 값은 추정 불가능한 랜덤 값을 가진다.

getSession(boolean create) 의 경우 기본 값이 true 옵션이라 로그인 확인을 하려면 false로 바꾸는 것이 좋다.

//세션이 있으면 있는 세션 반환, 없으면 신규 세션 생성
//getSession(boolean create)
// true : 세션이 없으면 새로 생성해서 반환, false : 세션이 없으면 null 반환
HttpSession session = request.getSession(default: true);

//세션에 로그인 회원 정보 보관
session.setAttribute("loginMember", loginMember);

 

스프링이 지원하는 @SessionAttribute를 사용하면 직접 생성할 필요 없이 다음과 같이 편하게 사용할 수 있다.

 

@GetMapping("/login")
public String homeLogin (
	@SessionAttribute("loginMember", required = false) Member loginMember, Model model) {
	...
}

 

세션은 session.invalidate() 를 호출하면 삭제가 되는데 HTTP는 비연결성이기 때문에 로그아웃을 누르지 않고 브라우저를 종료할 경우 세션 데이터가 삭제되지 않고 남아있게 된다.

세션기본적으로 메모리에 생성되기 때문에 필요한 경우에 생성했다 삭제하는 것이 좋은데 서블릿의 HttpSession은 클라이언트에서 서버에 마지막으로 요청한 시간을 기준으로 일정 시간동안 세션을 유지하는 방법을 사용한다. (기본 설정 30분, 만료 시 WAS가 내부에서 해당 세션을 제거)

특정 세션 단위로 시간을 설정하거나 스프링부트를 통해 application.properties로 글로벌 설정을 할 수 있다.

 

// 특정 세션에 적용
session.setMaxInactiveInterval(1800);

// application.properties
server.servlet.session.timeout=1800

 

 

 

[참고] 인프런 김영한님 강의를 공부한 내용입니다.

+ Recent posts