본문 바로가기
Spring

세션을 생성하는 getSession()에 대해 알아보기

by 흑시바 2023. 10. 22.

배경

팀원이 작성한 프로젝트 코드 중 일부에서 세션 존재 여부를 검증하기 위해 조건문으로 getSession()을 사용하는 경우가 있었다. 처음에는 대수롭지 않게 넘어갔지만, 해당 로직이 로그인하지 않은 상태인데 접근할 수 있는 영역에 존재해서 로그인을 하지 않았음에도 불구하고 세션을 발급하는 문제가 생겼다.

getSession()

세션 기반 인증 방식을 가진 애플리케이션에서 HttpServletRequest.getSession()을 통해 우리는 간단하게 session 정보에 접근할 수 있다. session에 접근해서 세션 정보를 확인 할 수도 있고, 세션을 무효화(invalid) 시킬수도 있다.

하지만 파라미터가 없는 getSession()은 숨겨진 기능이 존재한다. 바로 세션을 생성하는 것이다.

 

HttpServeltRequest 인터페이스의 구현체인 ApplicationHttpRequest에서 getSession 정보를 찾아 볼 수 있다.

 

 

getSession()은 동일한 getSession(boolean create) 메서드를 오버로딩 하는 것을 확인 할 수 있다.

 

위 코드는 getSession(boolean create) 코드 중 일부이다.

 

해당 코드에서는 create 파라미터가 true 값이고 session/localSession 값이 null인 경우 신규 세션을 생성한다는 내용을 포함하고 있다. (문제가 되었던 부분)

 

즉, 인증 이전 영역에서 getSession() 호출한다면 세션이 그냥 생성되는 것이다. [ getSession(true) 포함 ]

결론

조건 문에 getSession()이 아닌 getSession(false)로 수정해서 더 이상 세션이 생성되지 않게 하여 문제를 해결했다.

해당 문제 해결을 통해 라이브러리에 있는 메서드의 기능을 단순하게 추측해서 호출하는 것에 대해 다시 한 번 생각하게 되었다.

댓글