2023년 1월 1일
08:00 AM
Buffering ...

최근 글 👑

[스프링] Spring에서 세션이란? 세션의 이해와 원리 그리고 로그인

2023. 5. 31. 18:26ㆍ[자바]스프링

개요

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

 

 

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

세션의 동작방식

 
 
 

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

세션의 보안

 
 
세션의 보안은 꽤 강력한데  그 이유는 저 그림에서 보듯이
클라이언트에 저장되는 것은 세션의 정보가 아니라 쿠키의 있는 세션 ID만이 저장되기 때문이다.
 
 
 
 

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

 
 
 

세션 관리 기능

 

이러한 세션은 다음과 같이 크게 3가지 기능을 제공해야 한다.

 

세션 생성

▶세션 키는 중복이 안되며 추정 불가능한 랜덤 값이어야 한다.
 
▶세션 키에 매칭될 값(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);

 
 
 
그 가져온 세션을 키 값과 밸류를 넣는다. 
 

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

 
 
그 후 인터셉트에 세션을 꺼내서 세션이 있는지 없는지 확인한다.
인터셉트로 사용자가 사이트를 하나하나 들어갈때마다 인터셉트 인증체크를 거처야 함으로
세션이 없다면 로그인 화면으로 튕기게끔 한다.