호비시의 끄적끄적
로그인 관리 Session? JWT 본문
Session 을 통한 로그인 관리
세션을 통해 사용자 인증 및 유지 로그인 관리를 할 때는 다음과 같은 절차를 거친다.
- 사용자가 로그인 할 때 ID 와 PW를 보낸다.
- DB에서 사용자의 계정 정보를 조회하여 일치하는지 확인한다.
- 일치한다면, 서버에 세션을 생성하고 생성된 세션 ID를 세션 저장소에 저장한다.
- 사용자에게 응답과 함께 세션ID를 보낸다.
위와 같은 과정을 통해 세션에 사용자가 로그인 한 상태인지를 저장한다.
인증한 이후에는 사용자가 요청을 보낼 때 세션 ID를 같이 보내고, 서버에서는 받은 세션 ID가 존재하는지, 유효한지를 확인한다. 옳다고 판단한 후엔 사용자가 보낸 요청을 처리한다.
장점
- 중요한 정보가 서버에 전부 있기 때문에 보안적으로 우수하다.
- 서버단에서 세션에 대한 통제가 가능하다.단점
- 많은 양의 트래픽이 있다면, 세션 정보가 전부 서버에 있기 때문에 서버에 걸리는 부하가 심하다.
JWT 를 통한 로그인 관리
JWT를 통해 사용자 인증 및 유지 로그인 관리를 할 때는 다음과 같은 절차를 거치낟.
- 사용자가 로그인 할 때 ID와 PW를 보낸다.
- DB에서 사용자의 계정 정보를 조회하여 일치하는지 확인한다.
- 일치한다면 JWT 를 발급한다.
- 사용자에게 응답과 함께 JWT를 보낸다.
위와같은 과정을 통해 JWT를 이용하여 로그인을 관린한다.
인증한 이후에는 요청을 보낼때 발급받은 Access Token을 서버에 전달한다. 서버에서는 이 토큰이 유효한지 확인하다. 옳다고 판단한 후엔 사용자가 보낸 요청을 처리한다.
장점
- 서버에 대한 의존도가 낮고, 서버의 부담이 없다.
- 여러개의 서버가 존재하더라도 토큰만 받으면 사용자가 동일하게 서비스를 이용할 수 있다.단점
- JWT가 탈취당하면 보안상 위험하다(Refresh Token을 통해 일부 해결 가능)
- 토큰의 data가 많다면 트레픽 데이터의 크기가 커질 수 있다.
JWT는 서버의 개수에 상관없이 로그인을 유지할 수 있다. 그렇다면 Session을 통해서는 여러대의 서버로 관리할 순 없을까?
다중 서버로 서비스가 이루어 질 때는 session id를 공유해야 하기 때문에 여러가지 문제점이 발견된다.
Sticky Session
Load Balance가 기본적으로 트래픽을 분산시킨다.
특정 사용자가 처음 접속을 시도했을 때 처음 접속된 서버로 계속해서 트래픽을 처리하는 방식이다.
장점
- 사용자는 세션이 유지되는 동안 단일 서버만을 사용
- 정합성 이슈에서 자유로음단점
- 사용자가 접속해야하는 서버가 정해져 있기 때문에 특정 서버에서 트래픽이 집중될 위험이 있다.
- 자신의 세션이 없는 다른 서버를 이용할 수 없다.
- 가용성이 떨어진다.
Session Clustering
여러대의 컴퓨터들이 하나의 시스템처럼 동작하도록 하는 것이다. WAS가 2대 이상 설치했을 때 동일한 세션으로 관리하는 것을 말한다.
장점
- 세션을 복제하여 사용자가 어떤 서버에 접속하더라도 데이터가 세션에 복제되기 때문에 정합성 이슈 해결
- 서버 하나에 장애가 발생하더라도 중단되지 않고 운영 가능단점
- 모든 서버가 동일한 객체를 가져야 하기에 메모리를 많이 차지한다.
- 세션 저장소에 데이터가 저장될 때마다 모든 서버에 값이 새로 입력된다.
- 서버가 많을 수록 네트워크 트래픽이 증가하여 성능저하가 일어난다.
Session Storage
서버가 아무리 늘어나도 세션 스토리지에 대한 정보만 각각의 서버에 입력해주면 세션을 공유할 수 있게된다.
트래픽이 비정상적으로 몰리는 현상을 고려하지 않아도 된다.
서버 하나에 장애가 발생하더라도 세션 저장소가 존재하기 때문에 서비스를 계속해서 제공할 수 있다.
세션을 복제할 필요가 없기에 성능적인 문제도 해결이 가능하다.
하지만 세션저장소에 문제가 생기면 모든 서버를 이용할 수 없기 때문에 복제하여 사용하는 것이 좋다.
세션 스토리지를 사용하는 방법은 크게 2가지 이다.
- Disk Based Database
관계형 데이터베이스에 저장하는 방식이다. RDBMS를 사용하기 때문에, 처리 속도가 오래걸리지만 비교적 설정이 간단하다.
- In-Memory Database
메모리에 저장하는 방식이다. Redis, Memcached 등을 사용한다. In-Memory DB에 저장하기 때문에 서버가 다운되면 데이터가 손실되지만, RDBMS에 비해 매우 빠르다.
참고자료
'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 |