동작방식
- 클라이언트가 서버에 최초 요청
- 서버는 세션 ID를 새로 생성하고, 자신만의 목록에 세션 ID를 등록한다.
- 서버는 응답을 보낼 때 Header 영역의 쿠키 영역에 세션 ID를 담아 전송한다.
- 클라이언트는 세션 ID를 가지게 된다.
- 이후 요청시 클라이언트는 세션 ID를 함께 전송한다.
- 서버는 세션 ID를 목록에서 비교 후 그에 맞게 응답한다.
세션 ID가 사라지는 경우
- 서버에서 세션 제거
- 사용자가 브라우저를 모두 종료 → 클라이언트에서는 세션 값이 날라간다. 하지만 서버는 아직 이전값을 가지고 있어, 이 후 클라이언트 요청시 세션 ID 재발급을 해준다.
- 서버에서 설정한 세션 만료 시간이 초과된 경우
로그인 요청 동작방식
주로 로그인 요청(인증)을 할 때 많이 사용한다.
- 클라이언트가 서버에게 요청
- 서버는 요청을 받고, 세션 ID를 생성해 세션 저장소에 등록한다.
- 세션 저장소 내부에서 각 세션 ID마다 또 하나의 저장소가 존재한다.
- 서버에서 응답할 때 Header 영역에 세션 ID를 담아 보낸다.
- 클라이언트에 세션 ID가 저장된다.
- 클라이언트가 서버에게 로그인을 요청
- 서버는 로그인 정보를 통해 DB에서 조회하고 맞는 데이터 일시 클라이언트에게 받은 세션 ID로, 세션 저장소에서 알맞은 값을 찾은 후 세션 ID 내부의 저장소에 로그인 유저 정보를 등록한다.
- 서버는 클라이언트에게 로그인 후 알맞은 페이지로 보낸다.
- 이후 클라이언트가 인증이 필요한 서비스를 요청한다.
- 서버는 인증이 필요하기 때문에 세션 ID를 확인하고, 세션 ID 내부 저장소에 유저 정보가 있다면 로그인 한 것으로 간주한다.
- 이후 DB에서 요청한 데이터를 가져와 정상적으로 응답해준다.
세션의 단점
서버는 클라이언트의 접속자 수에 맞춰 수용 서버가 있어야 한다.
서버 한개가 꽉차면 다른 서버에서 응답을 해줘야 하기 때문이다.
즉 서버를 여러개 만들어야 한다. 이것이 로드밸런싱이다.
로드밸런싱은 부하를 분산시키는 것이다.
만약 클라이언트가 서버 1에서 세션 ID를 발급받고, 이 후 서버 1이 바빠 서버 2 한테 세션 ID로 요청을하면, 서버 2의 세션저장소에는 클라이언트의 세션 ID가 등록되어 있지 않아 처음 온사람으로 인식을 한다.
이 문제점을 해결하는 방법은 스티키 서버, 세션 저장소 복제, DB에 세션 값 저장 등 다양한 방법이 존재한다.
세션 값을 여러 서버에서 공유하는 경우 RAM 저장소를 이용해야 한다. 대표적으로 Redis 이다.
'Back-end' 카테고리의 다른 글
객체지향 생활 체조 원칙 9가지 (0) | 2022.11.07 |
---|---|
Checked Exception vs Unchecked Exception(+ Transaction) (0) | 2022.10.20 |
[Spring Security] 스프링 시큐리티 (0) | 2022.10.17 |
다양한 연관관계 매핑 (0) | 2022.09.15 |
연관관계 매핑 기초 (0) | 2022.09.14 |