본문 바로가기
네트워크

HTTPSession은 어떻게 관리가 될까???

by SICDev 2021. 4. 20.
반응형
  • 세션이라는 것은 무엇일까???
    • 우리 개발자들은 보통 로그인로직을 구현할때 세션을 이용해서 구현했다고 한다❗
    • 그렇다면...❗세션에대해 알아보기전에 HTTP에 대해 간단히 알아보고가자❗❗❗


 

  • HTTP의 가장 큰 특징중 두 가지는 Connectionless(비연결성), Stateless(무상태)이다..❗

    • ConnectionlessStateless는 무엇이냐❓❗

    • 흔히 우리가 사용하는 채팅은 지속적으로 계속해서 데이터가 오고 가기 때문에 연결이 유지 되어있는 것이 효율적이다❗
      채팅은 보통 소켓 통신을 이용해 연결을 끊지 않고 유지시키는데, 이런 상태를 바로 Stateful(상태유지)하다고 한다❗

  • 이와 반대로 HTTP는 본래 문서 전달을위해 고안된 프로토콜이다..!
  • 클라이언트가 문서를 요청하고 서버가 요청한 문서를 넘겨주면 그걸로 끝이다! 서버는 요청한 클라이언트가 누군지, 어떤 상태인지 알 필요가 없다❗❗😀😀
  • 단지 어떤 문서를 요청했는지만 알고 그에 대한 response(응답)만 주면되는것이다. 요청과 응답을 주고받은뒤에 HTTP는 연결을 끊어버리는데 이것을 Connectionless(비연결성)이라하고,
    연결을 끊음과 동시에 상태 정보를 유지하지 않고 날려버린다! 이것을 Stateless(무상태)라고한다.

 

  • HTTP 통신에서 로그인과같이 어떠한 상태를 유지시키기 위해 쿠키와 세션이라는것이 등장한다. (두두등장❗)

    • 쿠키란❓❓
      • 간단히 클라이언트(브라우저)에 저장되는 어떠한 작은 데이터 파일이다..!
        쿠키는 각각의 클라이언트(브라우저)마다 다르게 저장되기때문에
        우리가 Chrome 브라우저를 키고 네이버에 로그인을 하고 Internet Explore에서 네이버를 들어간다면...❓❗ 로그인이 되어있을까❓😮🤔
        당연히 안되어있다❗ 쿠키는 브라우저마다 다르게 저장되기 때문이다❗👌

IE : C:\Users\YourName\AppData\Local\Microsoft\Windows\INetCookies\deprecated.cookies
Chrome : C:\Users\YourName\AppData\Local\Google\Chrome\User Data\Default\Cookies
궁금하면 한번 들어가보시길....❗

 


 

  • 쿠키는 브라우저에 저장되기때문에 보안이 매우매우 베리베리 머취머취 취약하다❗❗😮 
    사용자 정보같이 중요한 정보를 유지하기에 적합하지않다❌❌
    그래서 우리는 세션(Session)이라는 것을 이용하게 된다
    • 세션이란❓❓
      • 세션은 쿠키를 기반하고 있지만..정보를 클라이언트(브라우저)에 저장하는 쿠키와는 다르게 서버에서 관리를 한다..❗❗
    • 세션을 사용하기위해선 많이사용하는 2가지 방법이있다..❗

  • @Autowired로 주입받는 방식( DI )
Class A {
  @Autowired
  HttpSession session
  
  public sessionTest(){
    session.setAttribute(name, value);
  }
}

 

  • 메소드의 매개변수로 주입받는 방식
Class A {

  public sessionTest(HttpSession session){
    session.setAttribute(name, value);
  }
  
}

 

  • 세션에 어떤 값을 저장하기위해선 setAttribute(String name, Object value)라는 메서드를 이용해
    name, value 쌍으로 Object를 저장할 수 있다..❗❗
  • setAttribute(String name, Object value)로 저장한 세션값을 getAttribute(String name)메서드로 값을 가지고 올수도 있다❗❗ 아주 간단하지 않은가...❓❗

 


 

 

내가 세션에 대해 다시 한번 공부하게된 가장 큰 이유는 유투브에서 이런 질문을 보았기 때문이다..

보통 세션정보를 가지고 올때 key값으로 구분을 해서 가지고오는데
A사용자가 접속해도 HttpSession.getAttribute("user")이렇게  "user"를 키로 값을 가져오고
B사용자가 접속해도 HttpSession.getAttribute("user")이렇게  "user"를 키로 값을 가지고 오는데 
A사용자와 B사용자를 어떻게 구분하는지??


A사용자와 B사용자를 어떻게 구분을할까??? 그대들은 정답을 알고있는가요...?

 

  • 바로 JSESSIONID 값을 이용해서 사용자를 구분하게 된다!
    • JSESSIONID가 무엇이냐
      • 쉽게 말해 톰켓 컨테이너가 세션을 유지하기 위해 클라이언트에게 발급해주는 키라고 생각하면된다..❗
      • 위에서 세션은 쿠키를 기반으로 하고 있다고 말하였다! JSESSIONID가 바로 그 쿠키안에 들어가있다..❗

  • 클라이언트가 처음 서버에 접속시 ( 로그인 시 ) 서버는 클라이언트에게 Response Header안의 쿠키에 JSESSIONID 값을 담아 응답해준다❗❗

 

  • 그럼 클라이언트는 이 응답받은 쿠키를 가지고 그 다음 요청시 마다 Request Header에 이 쿠키를 포함해서 서버에 요청을한다❗❗

 

  • 서버는 클라이언트의 Request Header에 포함된 JSESSIONID 값을 통해 JSESSIONID와 매핑되는 Session을 연결해주어 상태도 유지하고 사용자도 구분을 할 수 있게 되는것이다❗❗❗
반응형