사용자 로그인을 구현하였다. 기존에는 Session만을 이용했는데, 이번엔 JWT를 활용하였다.
JWT를 이용하면서 이론적으로만 알던 부분을 적용하면서 이해도가 깊어진 느낌이다. 우선 전통적인 Session 기반 인증을 공부해 보자.
1. 세션(Session)이란?
세션은 웹 서버에서 클라이언트를 구분하기 위한 방법 중 하나이다. 클라이언트가 웹 서버에 접속하면, 웹 서버는 해당 클라이언트의 브라우저에게 세션 ID를 부여한다. 이후 클라이언트가 서버로 요청을 보낼 때마다, 해당 세션 ID를 함께 보내게 된다.
1.1 세션 로그인(Session Login)이란?
세션 로그인은, 사용자가 로그인을 하면 서버에서 해당 사용자에 대한 세션을 생성하는 방식이다. 이후 사용자가 로그인 상태를 유지하는 동안, 해당 세션 ID를 이용하여 사용자를 식별한다. 이때 세션 ID를 저장하는 방식은 다음과 같다
1.1.1 쿠키(Cookie)
쿠키는 클라이언트 측에서 저장되는 작은 데이터 파일이다. 클라이언트가 서버에 접속하면, 서버는 쿠키를 생성하여 클라이언트의 브라우저에 저장한다. 이후 클라이언트가 서버로 요청을 보낼 때마다, 해당 쿠키를 함께 보내게 된다. 쿠키를 이용하여 세션 ID를 저장하는 방법을 쿠키 기반 세션 관리(Cookie-based Session Management)라고 한다.
1.1.2. URL Rewriting
URL Rewriting은 URL에 세션 ID를 포함시키는 방법이다.(query string 형태로) 클라이언트가 서버로 요청을 보낼 때마다, 해당 요청 URL에 세션 ID를 추가하여 보내는 방식이다. URL Rewriting을 이용하여 세션 ID를 저장하는 방법을 URL Rewriting 기반 세션 관리(URL Rewriting-based Session Management)라고 한다.
1.1.3. Hidden Form Fields
Hidden Form Fields는 HTML 폼(Form)에서 사용자가 입력한 정보와 함께 세션 ID를 전송하는 방법이다. Hidden Form Fields를 이용하여 세션 ID를 저장하는 방법을 Hidden Field 기반 세션 관리(Hidden Field-based Session Management)라고 한다.
2. Session 로그인의 장단점
2.1. 장점
- 보안성이 높다. 사용자의 아이디와 비밀번호를 서버에서 처리하기 때문에, 브라우저 상에서 사용자 정보가 노출될 위험이 적다.
- 서버에서 세션 정보를 관리하기 때문에, 클라이언트 측에서는 세션 ID만 관리하면 되기 때문에 비교적 간단하다.
- 사용자가 로그인 상태를 유지하는 동안, 세션 정보를 이용하여 다양한 기능을 제공할 수 있다.
2.2. 단점
- 서버에서 세션 정보를 관리하기 때문에, 서버 자원을 많이 사용하다.
- 사용자가 많아질수록, 서버 부하가 커질 수 있다.
- Session 기반은 stateful하다. Session은 클라이언트와 서버 간의 연결을 유지하기 때문에, 서버는 클라이언트의 상태를 유지합니다. 따라서, Session 기반은 stateful 한 방식 하다. 그렇기 때문에 서버가 scale out 하게 되면 서버는 session 상태를 새롭게 연결해야 한다
3. Session의 서버 Scale Out을 해결하기 위한 방법
Session 기반의 인증 절차의 단점인 scale out에 대한 부분을 해결하기 위해 아래와 같은 기법도 있다.
보통 Scale-out을 위해서는 로드 밸런싱(Load Balancing)을 이용한다. 로드 밸런싱을 이용하여 클라이언트의 요청을 여러 대의 서버로 분산시킨다. 이러한 방식에서는 세션 정보를 공유할 수 없기 때문에, 세션 정보를 공유하기 위해서는 다음과 같은 방법을 이용할 수 있다.
3.1. Sticky Session
Sticky Session은 클라이언트가 한 번 접속한 서버에 계속 접속하도록 하는 방식이다. 클라이언트가 처음 접속한 서버에서 세션 정보를 관리하고, 이후에도 해당 서버에서 세션 정보를 관리한다. Sticky Session을 이용하면, 서버 간의 세션 정보 공유가 필요하지 않는다. 하지만, 서버 부하 분산이 불균형해질 가능성이 있다.
3.2. Session Clustering
Session Clustering은 여러 대의 서버에서 세션 정보를 공유하는 방식이다. 세션 정보는 공유 메모리나 데이터베이스 등을 이용하여 여러 대의 서버에서 공유한다. Session Clustering을 이용하면, Sticky Session과 달리 서버 부하 분산이 균형적으로 이루어진다. 하지만, 세션 정보를 공유하기 위한 추가적인 작업이 필요하다.
따라서, Scale-out을 위해서는 Sticky Session 또는 Session Clustering 등의 방법을 이용하여 세션 정보를 공유해야 한다.
'Django' 카테고리의 다른 글
Swagger - SerializerMethodField의 return type hint (0) | 2023.07.04 |
---|---|
[Django] - 사용자 로그인 - JWT 적용하기 - 2. JWT 이해하기 (0) | 2023.07.03 |
인증 구현하기 (0) | 2023.05.14 |
Django Channels - 채팅 기능 구현하기 - 1 (0) | 2023.05.08 |
Django Channels - Consumer 살펴보기 (0) | 2023.05.05 |