ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 서버에서 '세션'이란?
    CS 2023. 7. 25. 01:00

     

    서버에서 세션을 쓰는 것은 좋지 않다라는 조언을 들은 적이 있다.

    기존에 로그인을 공부하며 쿠키, 세션, JWT에 대해서 가볍게 공부했었는데 세션에 대해서 좀 더 정리해보고자 한다.

    왜냐면 개발을 하면서 무조건 하나만 쓰기 보단 그 기술의 특성을 잘 이해하고 적재적소에 활용하는 능력이 중요하기 때문.

     

    세션(Session)

    사용자가 브라우저를 통해  서버에 접속한 시점으로부터 브라우저를 종료하여 연결을 끝내는 시점까지 같은 사용자로부터 오는 일련의 요청을 하나의 상태 보고 상태를 일정하게 유지하는 기술 (쉽게 말해 브라우저를 닫을 때 까지 유지된다.)

     

    [세션이 오고가는 Process]

    사용자가 브라우저에서 서버로 요청을 보낼 때 Request Header의 Cookie에 별도의 세션아이디가 없다면

    서버는 자동으로 세션아이디를 발급해주게 된다.

    이후 클라이언트 측에서 요청을 보낼 때 마다  Cookie에 해당 세션 아이디가 함께 담겨 가게 되고 서버에서는 이를 확인한다.

    별도로 세션 만료 시간을 설정하였다면 세션은 1) 브라우저 종료시 또는 2) 세션 시간 만료 시에 종료된다.

     

    [세션을 사용하는 것은 좋은가?]

    쿠키는 브라우저에 저장되는 반면 세션은 서버에 저장되어 비교적 안전하다는 것은 장점이다.

    그러나 이로 인해 서버에 부하가 증가한다. 또 하나의 문제는 서버 간 공유가 되지 않는다는 것이다.

    Scale out을 살펴보자.

     

    cf)

    Scale up: 서버의 사양과 성능을 업그레이드하는 것, 한 대의 서버를 운용하는 것으로 서버 크기 자체를 키우는 것이기에 수직적 확장(Vertical scailing)이라고도 부른다. 한대의 서버만 있는 것이기에 관리 비용이 적고 추가적인 네트워크 연결이 불필요하며 이슈가 비교적 적다. 그러나 성능 업그레이드에 드는 비용이 비교적 크며 성능 향상에 한계가 있다. 게다가 서버가 한대이기에 서버 장애의 영향을 많이 받는다. 성능을 향상할 때에는 서버를 이용할 수 없다는 점도 있다.

     

    Scale out: 비슷한 성능의 서버 대수를 늘리는 것, 갯수 자체를 늘리는 것으로 수평적 확장(Horizontal scailing)이라고도 부른다. 미리 성능을 정해야할 필요 없이 필요한 만큼 그때그때 서버를 늘리고 줄일 수 있다. 비용절약도 되면서 동시에 서버 확장성도 좋은 것이다. 그러나 아키텍쳐에 대한 이해가 높아야하고 서버 개수가 늘어날 때 마다 관리가 쉽지 않다는 것, 부하 분산을 위해 로드밸런싱을 해야한다는 점이 있다.

     

    다시 돌아와서,

    서버가 여러 대일 경우, 한 서버에서 발급한 세션아이디는 다른 서버에 공유되지 않는다.

    예를 들어 AWS ELB를 사용하고 있다면 내가 A서버를 통해 접근하고 로그인 하였는데 그다음 페이지 전환 시 로드밸런싱에 의해

    B서버로 가게된다면 새롭게 로그인해야하는 일이 발생할 수 있다.

     

    이를 방지하기 위해 3가지 대표 방안이 있다.

     

    1) Sticky Session: 처음 세션 아이디를 발급해준 서버로만 요청이 가게끔 하는 것

    쿠키와 클라이언트 IP tracking이라는 두 가지 방법으로 구현 가능하며 특정 서버에만 붙어있어 서버 부하가 몰릴 수 있다는 점,

    해당 서버에 문제가 생겨서 세션이 모두 소실될 수 도 있다는 점이 문제이다.

     

    2) Session clustering: 각 WAS들은 세션을 각각 가지고 있지만, 이를 하나로 묶어 클러스터로 관리하는 것, WAS하나가 다운되어도 다른 WAS로 세션이 이동한다. 그러나 Scale out으로 확장할 경우 새로운 서버 정보를 기존의 WAS에 추가해줘야 하는 번거로움, 이로 인한 휴먼 에러 발생 가능성이 있다.

     

    3) Redis를 활용한 세션 서버 분리: Redis를 별도의 세션 서버로 구성하여 놓는 방식, 새로운 서버가 생기더라도 Redis에만 세션 정보를 적어주면 되기 때문에 기존 서버를 수정할 필요가 없다. 하지만 Redis가 죽으면 세션도 모두 사라지니 죽지 않게 잘 관리할 필요가 있다.

     

    세션의 특성과 보완법들을 잘 숙지하여 활용해보도록 하자.

     

     

    출처:

    https://jeongkyun-it.tistory.com/105

    https://fomaios.tistory.com/entry/Network-%EC%84%B8%EC%85%98Session%EC%9D%B4%EB%9E%80-What-is-a-Session#:~:text=%EC%A6%89%2C%20%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8%EC%99%80%20%EC%84%9C%EB%B2%84%20%EA%B0%84%EC%9D%98,%EC%9D%98%20%EC%83%81%ED%83%9C%EB%9D%BC%EA%B3%A0%20%EB%B3%B4%EB%A9%B4%20%EB%90%9C%EB%8B%A4.

    https://jeonyoungho.github.io/posts/%EB%A1%9C%EB%93%9C-%EB%B0%B8%EB%9F%B0%EC%84%9C-%EC%82%AC%EC%9A%A9-%EC%8B%9C%EC%9D%98-%EC%9D%B4%EC%8A%88-%EC%A4%91-%EC%84%B8%EC%85%98-%EA%B4%80%EB%A6%AC-%EB%AC%B8%EC%A0%9C/

    https://velog.io/@kkimbj18/%EC%84%B8%EC%85%98-%EC%BF%A0%ED%82%A4-%EA%B0%9C%EB%85%90-%EB%B0%8F-%EC%B0%A8%EC%9D%B4

    https://tecoble.techcourse.co.kr/post/2021-10-12-scale-up-scale-out/

     

     

     

    'CS' 카테고리의 다른 글

    객체의 동일성과 동등성  (0) 2023.07.28
    템플릿 메서드 패턴 and 팩토리 메서드 패턴  (0) 2023.06.25
Designed by Tistory.