[Spring] Cookie & Session

세션 로그인 동작 방식

 

 

 

1. 로그인
- 사용자가 아이디와 비밀번호를 입력하여 로그인을 시도한다.

2. 서버에서 세션 생성
- 서버는 로그인 정보를 검증하고, 유효한 경우 해당 사용자를 위한 세션을 생성한다.

3. 세션 ID 생성 및 전송
- 세션은 서버 측에서 생성되며, 고유한 세션 ID가 생성된다.

- 이 세션 ID는 일반적으로 쿠키를 통해 클라이언트에게 전송된다.


4. 클라이언트에서 세션 ID 저장
- 클라이언트는 받은 세션 ID를 쿠키나 다른 저장 방식을 사용하여 저장한다.


5. 인증 및 권한 부여
이후의 클라이언트의 요청에서는 세션 ID를 이용하여 사용자를 인증하고, 해당 사용자에게 권한을 부여한다.


6. 세션 유지 및 만료
- 세션은 일정 시간 동안 유지되며, 사용자의 비활동 시간이 일정 기간 동안 지속되면 세션이 만료된다.


세션 로그인의 주요 문제점 및 해결 방법


1. 서버 부하 및 확장성
- 세션은 서버 측에서 관리되므로, 사용자가 많아지면 서버 부하가 증가하고 서버의 확장이 어려워진다.

- 또한 이 경우에 Redis라는 메모리 공유 서버를 활용하여 서버들을 관리 해주어야 한다.


2. 상태 공유의 어려움
- 여러 서버가 사용되는 경우, 사용자의 세션 상태를 서버 간에 공유하는 것이 어려울 수 있습니다.
- 해결 방법: 분산된 서버 간에 세션 상태를 공유하기 위해 외부 저장소를 사용하거나, 로드 밸런서를 이용하여 세션을 특정 서버에 고정할 수 있다.


3. 로그인 상태 관리 어려움
- 사용자의 로그인 상태를 서버에 의존해야 하기 때문에, 사용자가 여러 기기 또는 브라우저에서 로그인 상태를 공유하는 것이 어려울 수 있다.
- 해결 방법: 토큰 기반의 인증을 사용하여 클라이언트 측에서 로그인 상태를 관리하고, 필요한 경우 서버에 로그인 상태를 검증하는 요청을 보낼 수 있다.

 

4. 세션 변조 가능성
- 세션 ID를 탈취하여 다른 사용자처럼 세션을 이용할 수 있으며, 이는 세션 변조의 가능성을 내포하고 있다.
- 해결 방법: 세션 ID를 안전한 방식으로 전송하고 저장해야 한다. HTTPS를 사용하여 통신을 암호화하고, 쿠키의 Secure 및 HttpOnly 속성을 사용하여 보안을 강화할 수 있다.


5. 로그아웃 관리의 어려움
- 서버측에서 관리하기 때문에 즉각적인 사용자의 로그아웃을 관리하기가 어려울 수 있다.

6. CSRF에 대한 취약성
- 세션 쿠키가 자동으로 전송되기 때문에 CSRF 공격에 노출될 가능성이 있다.

 

세션기반의 로그인 방식을 쉽게 구현하도록 도와주는 프레임워크가 Spring Security인데, 이후에는 이에 대해 포스팅 해보겠다.