| 개요
우리는 일상생활 속에서 많은 세션을 접해본 경험이 있다.
인터넷을 사용한 사람들 중에서 난 세션이라는거는 한번도 보거나 접해보지 못했는데?
라고 얘기할 수 있는데.. 이것은 거짓말이다. 그 이유는
"세션이 만료되었습니다" 이 문구를 인터넷을 해본사람이라면 모르는 사람은 없을 것 이다.
그렇다면 이 세션은 도대체 뭔가?

우리는 네이버나 다른 사이트등에 들어갔을때 한번 회원가입을 하고나서 로그인을 하면
그 다음부터는 신기하게도 자동으로 로그인인이 되어있는 신기한 경험들을 해본적이 있을 것 이다.
이것이 바로 세션이다.
즉 세션은 서버에서 정보들을 기억해 다음 번에 동일 사용자가 올 때 그 정보들을 세션에 저장해 두었다가
사용자가 인증하지 않아도 사용자임을 인지하고 자동으로 정보를 제공해주는 것 이다.
그렇다면 이 세션에 대해서 조금 깊게 알아보자.
| 세션의 동작방식

이것은 세션의 동작방식인데
클라이언트(사용자)가 서버에 정보를 보냈다.
그렇다면 서버는 가장 먼저 하는 일은 세션을 뒤져보는 것 이다.
세션에서 이 정보들이 있다면? 세션 id만 따서 쿠키에 담아둔다.
없다면 세션에 정보들을 저장한 후 그림의 순번대로 진행된다.
이렇게 세션은 저기 그림처럼 동작한다고 생각하면 쉽다.
이보다 더 정확한 그림이 있나 싶지만
저 그림대로 동작한다고 생각하면
이해하기 쉬울 것 이다.
세션의 보안
세션의 보안은 꽤 강력한데 그 이유는 저 그림에서 보듯이
클라이언트에 저장되는 것은 세션의 정보가 아니라 쿠키의 있는 세션 ID만이 저장되기 때문이다.

기본적으로 세션 ID는 복잡하게 되어있기 때문에 추정불가이며 그렇기 때문에 변조를 하더라도
추정 할 수 없기 때문에 보안이 강력한 편에 속한다.
또한 어느 누군가가 쿠키를 탈취 하더라도
세션 ID만이 쿠키에 저장되어 있어 세션 ID만 바꿔버린다면
그 쿠키의 있는 정보들은 쓰레기나
마찬가지이다. 그렇기 때문에 정보는 서버에 담고 추정 불가능한 세션 ID를 쿠키에 담아
혹시 탈취되더라도 아무런 영향이 없도록 할 수 있게 만드는 것이 세션의 역활이다.

세션 관리 기능
세션 생성
▶세션 키는 중복이 안되며 추정 불가능한 랜덤 값이어야 한다.
▶세션 키에 매칭될 값(Value)가 있어야 한다.
▶이렇게 생성된 키를 응답 쿠키에 저장해 클라이언트에 전달해야 한다.
세션조회
▶ 클라이언트가 요청한 세션아이디 쿠키 값으로 세션 저장소에 저장된 값을 조회할 수 있어야 한다.
세션 만료
▶ 클라이언트가 요청한 세션아이디 쿠키 값으로 세션 저장소에 보관한 세션 엔트리를 제거해야 한다.
스프링 세션 사용방법
스프링에서는 HttpSession에서 세션을 관리할 수 있다.
직접 만들어도 되지만 우리는 서블릿이 가지고 있는 기능들을 사용해보자.

기본적으로 세션은 로그인할때 정보들을 세션에 넣는다.
이 로직은 로그인할때 쓰는 로직이다. 로그인이 성공적으로 된다면
세션에 정보들을 넣는 역활을 한다.
저기 괄로 친 부분이 세션부분인데 저 메서드는 내가 직접 만든 메서드이다.
저 메서드를 까보면

정말 쉽다.
HttpServlet에 request를 가져온 후 세션에 키값과 밸류 값을 담으면 된다.
세션에는 키값과 밸류값이 들어가야 하는데 키 값은 아무값이나 저장해도 상관없다.
그 이유는 서블릿 세션에 값을 넣으면 serlvet에서 자동으로 추정불가능한 세션 ID를 만들어 주기때문이다.
또한 세션의 값들은 서버가 내려갈 때 까지 없어지지 않는다.그러므로 세션의 들어 있는 값들을 각 메서드의 마다 유동적으로 사용할 수 있기도 한다.

만들고 이런식으로 서버 세션에 저장된다.
이렇게 키 , 값을 넣으면 스프링은 추정 불가능한 세션 ID로 만들어 준다.
SessionKey.SessionKey,form
이렇게 키 값을 만들고 이 세션을 꺼낼때는 우리가 만들었던 SessionKey로 꺼내면 된다.
쉽게 생각해서 HashMap처럼 값을 꺼낼때 키가 필요한 것 처럼 생각하면 쉽다.
이렇게만 하면 값들을 세션의 넣는 것은 끝 이다.
그렇다면 이제 세션을 꺼내서 적용하는 건 어떻게 해야할까??
인터셉터의 사용과 활용
만약 인터셉트를 모른다면 인터셉트를 공부하고 오는 것을 추천한다.
이 내용은 인터셉트를 안다는 가정하에 진행한다.

인터셉트 부분에서 세션을 꺼내온다.
그렇다면 세션이 꺼내질 것 이다.
저기서 조건을 걸어서 확인 하는 것 이다.
세션이 있다면? 이 사람은 로그인을 해서 정보가 저장되어 있는 사용자이다.
만약 세션이 없다면 이 사람은 세션이 끊겼거나 이 서버에 등록되지 않은 미인증 사용자 이다.
세션의 생성과 조회
요약한다면 세션을 사용하기 위해서는
정보를 전달하는 메서드에
HttpSession session = request.getSession();
request로 세션을 가져온다(꺼내온다) .
Object attribute = session.getAttribute(SessionConst.Login_Member);
세션의 특정값들을 가져오고 싶다면 session.getAtrribute로 가져오면 된다.
그럼 반환타입이 Object형인데 그러면 Object에 있는 타입의 메서드밖에 사용 할 수 없게된다.
그럴때는 다운캐스팅을 해주면되는데
Member Mem = (Member)request.getAttribute(SessionConst.Login_Member);
이렇게 내가 받고싶은 타입을 다운 캐스팅 시켜서 사용하면된다.
session.setAttribute(SessionKey.SessionKey,form);
그 가져온 세션을 키 값과 밸류를 넣는다.

그렇다면 서버 세션에는 이렇게 저장되어 있다.

그 후 인터셉트에 세션을 꺼내서 세션이 있는지 없는지 확인한다.
인터셉트로 사용자가 사이트를 하나하나 들어갈때마다 인터셉트 인증체크를 거처야 함으로
세션이 없다면 로그인 화면으로 튕기게끔 한다.
'[자바]스프링' 카테고리의 다른 글
| [스프링] 스프링 Converter 스프링의 자동변환 정리 (2) | 2023.06.04 |
|---|---|
| [스프링] 인터셉터[Interceptor]의 원리와 개념 그리고 활용 (0) | 2023.06.01 |
| [스프링] 쿠키란? 쿠키의 원리부터 구현까지 (0) | 2023.05.31 |
| 스프링 querydsl 의존성 추가 스프링 부트 3.0.0이상 gradle 5.0이상 (1) | 2023.05.05 |
| bindingresult,rejectValue의 이해와 원리 (1) | 2023.05.05 |