'스프링 부트와 AWS로 혼자 구현하는 웹 서비스'를 공부하던 중 궁금한 점이 생겨 이를 정리하고자 한다.
해당 책 5장을 보게 되면 HttpSession에 로그인한 사용자의 정보를 저장하는 아래의 코드가 나오고
httpSession.setAttribute("user", new
SessionUser(user)); // 세션에 사용자 정보를 저장하기 위한 Dto 클래스
이를 어노테이션화한 아래의 코드가 나온다.
@LoginUser SessionUser user
둘 다 HttpSession을 사용한다.
또한 HttpSession 뿐만 아니라 Spring-Session-JDBC를 사용하여 스프링 세션을 H2 DB에 저장하는 방식 또한 소개된다.
5장에서 다루는 중요한 내용이라고 생각되어서 HttpSession과 Spring Session은 정확히 무엇인지 알아보고자 한다.
1. HTTP 세션
1) 쿠키란?
세션에 대해 알아보기 전에 쿠키에 대해 알아봐야 한다.
쿠키는 stateless(상태가 없는)한 HTTP 통신에서 클라이언트에게 특정 표시를 주어 해당 클라이언트를 식별하기 위해 만들어졌다.
쉽게 말해 놀이공원의 팔찌를 생각하면 되겠다. 팔찌의 유무에 따라 클라이언트(손님)가 신규 입장인지 재입장인지 구별할 수 있고, 팔찌의 상태(자유이용권, 빅5 등)에 따라 놀이기구 이용의 차이를 둘 수 있기 때문이다.
쿠키는 주로 세션 관리, 개인 설정유지, 사용자 트래킹(사용자의 행동을 기록하고 분석하는 것) 용도로 사용된다.
2) HTTP 세션이란?
다음으로 HTTP 세션에 대해 먼저 알아보자.
HTTP 세션이란 클라이이언트가 웹서버에 연결된 순간부터 웹 브라우저를 닫아 서버와의 HTTP 통신을 끝낼 때까지의 기간이다.
하지만 보통 세션이라고 말할 때에는 서버(웹)에 세션에 대한 정보(세션 상태, 클라이언트 상태, 세션 데이터 등)를 저장해 놓고 세션 쿠키(고유한 세션 ID 값)를 클라이언트에게 발행하여 서버가 클라이언트를 식별할 수 있도록 하는 방식 자체를 의미하는 경우가 많다.
3) HTTP 세션의 특징
세션 ID로 클라이언트를 구분하여 클라이언트 요구에 맞는 서비스를 제공한다.
사용했던 정보들을 서버에 저장하기 때문에 클라이언트에 저장하는 쿠키보다 보안성이 더 우수하다. 하지만 서버에 저장되기때문에 서버 부하가 발생한다.
HTTP 프로토콜은 비접속형 프로토콜이라서 매 접속마다 새로운 네트워크 연결이 이뤄지는데, 세션이 연결 유지를 가능하게 해준다.
4) HTTP 세션의 작동 방식
1. 클라이언트가 서버에 요청을 보내면 서버에서는 요청헤더(Cookie)를 확인하고 세션 ID가 있는지 확인한다.
2. 만약 요청에 세션 ID가 없다면 서버에서는 세션 ID를 생성한 뒤 응답을 보낼 때 쿠키에 세션 ID를 담아 보낸다.
3. 클라이언트는 응답에서 받은 세션 쿠키(세션 ID 값)를 저장해두고, 매번 해당 서버에 요청을 보낼 때마다 세션 쿠키를 함께 보내서 자신이 누구인지 인증한다.
4. 세션 쿠키는 브라우저가 종료되면 삭제된다.
2. 스프링 세션
다음으로 스프링 세션이다.
스프링 세션은 서버에 저장되는 HTTP 세션의 한계로부터 세션 관리를 자유롭게 한다는 목표를 갖고 있다.
톰캣과 같은 특정 애플리케이션 컨테이너에 얽매이지 않고, 클라우드를 사용하여 여러 서비스들 사이에 세션 데이터의 공유를 쉽게 만든다. 또한 동일한 브라우저에서 여러 개의 세션을 지원하고, 헤더에서 세션을 전송한다.
또한 아래와 같은 장점도 있다고 한다.
Spring Session은 HTTP 세션을 관리하기 위한 강력한 도구입니다.
세션 스토리지가 구성 클래스와 몇 가지 종속성으로 단순화되어 여러 애플리케이션을 동일한 Redis 인스턴스에 연결하고 인증 정보를 공유할 수 있습니다.
Spring Session은 분산 시스템 아키텍처에서 HTTP 세션을 관리하기 위한 강력한 도구입니다.
Spring은 최소한의 구성으로 미리 정의된 스키마를 제공하여 간단한 사용 사례에 대한 무거운 작업을 처리합니다.
동시에 세션 정보를 저장하는 방법에 대한 설계를 제안할 수 있는 유연성을 제공합니다.
스프링 세션은 JDBC, MongoDB, Redis 등을 사용하여 세션 데이터를 유지할 수 있다.
'스프링 부트와 AWS로 혼자 구현하는 웹 서비스' 책에서는 JDBC를 이용해 H2 DB에 세션 정보를 저장하는 방식을 사용했다.
build.gradle에 다음과 같이 의존성을 등록한다.
// build.gradle
compile('org.springframework.session:spring-session-jdbc')
그리고 application.properties에 세션 저장소를 jdbc로 선택하고, H2 DB를 사용하도록 코드를 추가한다.
// application.properties
spring.session.store-type=jdbc
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
스프링 애플리케이션 실행 후 H2 DB에 접근하여 보면 "spring.session.store-type=jdbc" 코드 덕분에 아래와 같은 SPRING_SESSION과 SPRING_SESSION_ATTRIBUTES 테이블이 자동으로 생성된 것을 확인 할 수 있다.
이제 api 요청을 보내면 세션이 생성된다. 이 세션 정보는 SPRING_SESSION 테이블에 저장된다.
만약 특정 api가 다음 코드처럼 Spring Session의 attribute를 설정하는 POST 메서드라면
request.getSession().setAttribute("favoriteColors", favoriteColors);
이에 관한 내용은 SPRING_SESSION_ATTRIBUTES 테이블에서 확인할 수 있다.
참고
https://noahlogs.tistory.com/38
[네트워크] HTTP 쿠키와 세션이란 ?
HTTP 에는 쿠키라는 개념이 존재하는데, 이름부터가 친숙하고 귀엽다. 왜 쿠키라는 이름이 붙여졌을까에는 여러가지 이야기들이 있는데, 내가 처음 공부할 때 들었던 이야기는 헨젤과 그레텔 동
noahlogs.tistory.com
https://jeongkyun-it.tistory.com/105
[Spring] 세션(Session)이란? (개념 / 특징 / 사용법)
서론 이번 글도 이전 글인 쿠키글과 마찬가지로 나 혼자 공부를 위해 작성하는것이니 지저분한 정리가 될 수 있다. 추 후 깔끔하게 정리를 꼭 해보도록 하겠다 :() 세션이란? 사용자가 웹 브라우
jeongkyun-it.tistory.com
https://scshim.tistory.com/447
스프링 세션 (Spring Session)이란? spring-session-jdbc 사용하기
스프링 세션은 서버에 저장되는 HTTP 세션의 한계로부터 세션 관리를 자유롭게 한다는 목표를 갖고 있다. 이러한 해결책으로 특정 애플리케이션 컨테이너(예:톰캣)에 얽매이지 않고, 클러스터링
scshim.tistory.com
https://www.baeldung.com/spring-session
Guide to Spring Session | Baeldung
The article introduces Spring Session a project that decouples session management from server container.
www.baeldung.com
'개발 > 스프링 개념' 카테고리의 다른 글
[Spring] Spring JPA FindByFK (외래키로 조회) (0) | 2023.02.15 |
---|---|
[Spring] Spring JPA 복합키 (0) | 2023.02.10 |
[Spring] Select에 @Transaction을 사용하는 이유 (0) | 2023.01.20 |
[Spring] Spring 웹 계층 구조 (0) | 2023.01.20 |
[Spring] 의존성 주입이란? (0) | 2023.01.13 |