개발이군고구마

Session 사용 이유와 방법 본문

SERVER/Spring

Session 사용 이유와 방법

김구황 2024. 10. 27. 21:51
728x90

1. 세션은 왜 필요한가 

1) HTTP 요청의 stateless 

각각의 요청은 별개의 요청으로, 요청 이후 상태가 유실 지속되지 않음

이렇게 되면 이전 요청에서 수행했던 정보들이 "유지" 되지 않는 문제가 있음 

요청별로 정보를 담아서 전달해줄 필요가 생김 

 

2) Cookie

브라우저 내에 cookie 라는 저장소에 정보를 저장하는 방법

서버 에 정보를 저장하지 않기 때문에 데이터 로딩이 빠르다는 장점이 있지만

브라우저에 있는 값이기 때문에 임의로 변경할 수 있어 보안이 낮다는 단점이 있음 

 

3) Session 

서버에 값을 저장하는 방법 

서버에서 값을 가져오기 때문에 보안에서 장점이 있음

주로 WAS 메모리에 저장됨 

 

2. 세션의 생성 (처음 접속) 

0) 어떻게

spring 설정값에 세션 ID 를 지정함 

처음 진입시(WAS 구동) 이렇게 설정한 ID Cookie 값에 넣어져 요청

<session-config>
	<cookie-config>
		<http-only>true</http-only>
		<secure>true</secure>
	</cookie-config>
</session-config>

이러한 형태로, domain 값과 그때의 ID (예, JSESSIONID) 를 지정할 수 있음 

 

1) 언제 

  • session 값을 요청할 때 

첫 도메인 접근

 

2) 어디에 

  • WAS 내부 Session Manager에 HttpSession (=세션)이 저장 

 

3) 무엇이 

  • key : 랜덤 ID (sid)
  • value : HttpSession ( sid를 key로 한 key-value의 데이터 구조 ) 

지정한 시간 만큼 WAS 에 저장됨 (현재 사이트는 30분동안 지속됨)

 

 

3. 세션의 파악 (세션값 생성 이후) 

세션값 생성 이후

세션 값 없을 땐, 첫 요청과 같은 방법으로 

 

4. SecurityContext와의 관계 

https://yenjjun187.tistory.com/593

 

 

  • Security Conext에 authentication 이 담긴 뒤  SecurityContext는 HttpSession에 저장
  • 클라이언트가 서버에 접속하면 세션에 저장된 SecurityContext 를 꺼내어서 사용하게 되는데
  • 임의로 세션을 삭제하면 클라이언트의 세션 자체가 없어지는 것이므로 SecurityContext 도 사라지게 되는 결과
    • (SuccessHandler 이후 필요한 값을 쿠키에 담아주는 작업)
@GetMapping()
public String index(HttpSession session){
  Authentication authentication1 = SecurityContextHolder.getContext().getAuthentication()
  
  SecurityContext context = (SecurityContext)session.getAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY);
  Authenticatino authentication2 = context.getAuthentication();
  
}

 

 

 

[여전한 의문점]
세션이 만료가 되면, 로그아웃이 되도록 사이트별로 설정해놓는 걸까? 
만약 로그아웃이 됬을 때, 그때 securityContext 안에 authentication 비우는 로직을 살펴보아야 할 것 같음. 

또한 HttpSession 객체에 대한 이해가 완벽하게 되지 않았음 
JSESSIONID 에의 value 값으로는 랜덤값이 저장되는데, 그 값이 어떻게 session 이 되는것인지, 세션이라는 것의 확실한 정체는 무엇인지 (그냥 랜던값으로 생각하고 session이 요청될 때마다 Cookie에서 전달받은 value를 비교해서 연결해주는 개념인건지)