호비시의 끄적끄적

로그인 관리 Session? JWT 본문

Back

로그인 관리 Session? JWT

호비시 2022. 6. 29. 23:48

Session 을 통한 로그인 관리

세션을 통해 사용자 인증 및 유지 로그인 관리를 할 때는 다음과 같은 절차를 거친다.

  1. 사용자가 로그인 할 때 ID 와 PW를 보낸다.
  2. DB에서 사용자의 계정 정보를 조회하여 일치하는지 확인한다.
  3. 일치한다면, 서버에 세션을 생성하고 생성된 세션 ID를 세션 저장소에 저장한다.
  4. 사용자에게 응답과 함께 세션ID를 보낸다.

위와 같은 과정을 통해 세션에 사용자가 로그인 한 상태인지를 저장한다.
인증한 이후에는 사용자가 요청을 보낼 때 세션 ID를 같이 보내고, 서버에서는 받은 세션 ID가 존재하는지, 유효한지를 확인한다. 옳다고 판단한 후엔 사용자가 보낸 요청을 처리한다.

장점

  • 중요한 정보가 서버에 전부 있기 때문에 보안적으로 우수하다.
  • 서버단에서 세션에 대한 통제가 가능하다.단점
  • 많은 양의 트래픽이 있다면, 세션 정보가 전부 서버에 있기 때문에 서버에 걸리는 부하가 심하다.

JWT 를 통한 로그인 관리

JWT를 통해 사용자 인증 및 유지 로그인 관리를 할 때는 다음과 같은 절차를 거치낟.

  1. 사용자가 로그인 할 때 ID와 PW를 보낸다.
  2. DB에서 사용자의 계정 정보를 조회하여 일치하는지 확인한다.
  3. 일치한다면 JWT 를 발급한다.
  4. 사용자에게 응답과 함께 JWT를 보낸다.

위와같은 과정을 통해 JWT를 이용하여 로그인을 관린한다.
인증한 이후에는 요청을 보낼때 발급받은 Access Token을 서버에 전달한다. 서버에서는 이 토큰이 유효한지 확인하다. 옳다고 판단한 후엔 사용자가 보낸 요청을 처리한다.

장점

  • 서버에 대한 의존도가 낮고, 서버의 부담이 없다.
  • 여러개의 서버가 존재하더라도 토큰만 받으면 사용자가 동일하게 서비스를 이용할 수 있다.단점
  • JWT가 탈취당하면 보안상 위험하다(Refresh Token을 통해 일부 해결 가능)
  • 토큰의 data가 많다면 트레픽 데이터의 크기가 커질 수 있다.

JWT는 서버의 개수에 상관없이 로그인을 유지할 수 있다. 그렇다면 Session을 통해서는 여러대의 서버로 관리할 순 없을까?
다중 서버로 서비스가 이루어 질 때는 session id를 공유해야 하기 때문에 여러가지 문제점이 발견된다.

Sticky Session

Load Balance가 기본적으로 트래픽을 분산시킨다.
특정 사용자가 처음 접속을 시도했을 때 처음 접속된 서버로 계속해서 트래픽을 처리하는 방식이다.

장점

  • 사용자는 세션이 유지되는 동안 단일 서버만을 사용
  • 정합성 이슈에서 자유로음단점
  • 사용자가 접속해야하는 서버가 정해져 있기 때문에 특정 서버에서 트래픽이 집중될 위험이 있다.
  • 자신의 세션이 없는 다른 서버를 이용할 수 없다.
  • 가용성이 떨어진다.

Session Clustering

여러대의 컴퓨터들이 하나의 시스템처럼 동작하도록 하는 것이다. WAS가 2대 이상 설치했을 때 동일한 세션으로 관리하는 것을 말한다.

장점

  • 세션을 복제하여 사용자가 어떤 서버에 접속하더라도 데이터가 세션에 복제되기 때문에 정합성 이슈 해결
  • 서버 하나에 장애가 발생하더라도 중단되지 않고 운영 가능단점
  • 모든 서버가 동일한 객체를 가져야 하기에 메모리를 많이 차지한다.
  • 세션 저장소에 데이터가 저장될 때마다 모든 서버에 값이 새로 입력된다.
  • 서버가 많을 수록 네트워크 트래픽이 증가하여 성능저하가 일어난다.

Session Storage

서버가 아무리 늘어나도 세션 스토리지에 대한 정보만 각각의 서버에 입력해주면 세션을 공유할 수 있게된다.
트래픽이 비정상적으로 몰리는 현상을 고려하지 않아도 된다.
서버 하나에 장애가 발생하더라도 세션 저장소가 존재하기 때문에 서비스를 계속해서 제공할 수 있다.
세션을 복제할 필요가 없기에 성능적인 문제도 해결이 가능하다.
하지만 세션저장소에 문제가 생기면 모든 서버를 이용할 수 없기 때문에 복제하여 사용하는 것이 좋다.
세션 스토리지를 사용하는 방법은 크게 2가지 이다.

  1. Disk Based Database

    관계형 데이터베이스에 저장하는 방식이다. RDBMS를 사용하기 때문에, 처리 속도가 오래걸리지만 비교적 설정이 간단하다.
  1. In-Memory Database

    메모리에 저장하는 방식이다. Redis, Memcached 등을 사용한다. In-Memory DB에 저장하기 때문에 서버가 다운되면 데이터가 손실되지만, RDBMS에 비해 매우 빠르다.

 

참고자료

https://velog.io/@young_209/%EA%B0%9C%EC%84%A0-%ED%95%98%EA%B8%B0%EC%96%B4%EB%85%B8%ED%85%8C%EC%9D%B4%EC%85%98-%EA%B8%B0%EB%B0%98-%EC%84%B8%EC%85%98-%EC%A0%80%EC%9E%A5%EC%86%8C%EB%A1%9C-DB-%EC%82%AC%EC%9A%A9

https://hyuntaeknote.tistory.com/6

https://velog.io/@kimju0913/Session-%EA%B3%BC-JWT

'Back' 카테고리의 다른 글

Adapter pattern  (0) 2022.07.29
Docker ?  (0) 2022.06.25
객체지향 프로그램이란  (0) 2022.06.20
git bash ec2 연결  (3) 2022.04.18
JWT  (0) 2022.04.15
Comments