반응형
Session 기반 인증
서버 측(Session Storage)에서 클라이언트의 인증 상태를 저장하고 관리하는 방식입니다.
- 클라이언트가 로그인하면 서버가 Session ID를 생성하고 이를 클라이언트에게 쿠키로 전달
- 이후 클라이언트가 요청할 때마다 해당 Session ID를 포함하여 서버에 전송
- 서버는 Session Storage에서 Session ID를 조회하여 인증 및 권한을 검증
Session 인증 흐름
- 사용자가 로그인 요청 (ID/PW)
- 서버가 사용자 인증 후, 세션을 생성하고 Session ID를 응답 쿠키로 설정
- 클라이언트가 이후 요청 시, Session ID를 포함한 쿠키를 서버에 전달
- 서버는 저장된 Session ID를 조회하여 사용자 인증 및 권한을 검증
- 로그아웃하면 세션을 삭제
✅ 장점
보안성
- 세션이 서버에서 관리되므로 클라이언트가 직접 조작할 수 없음
- 토큰보다 상대적으로 탈취 위험이 낮음 (쿠키의 HttpOnly 설정 가능)
세션 만료 및 강제 로그아웃 가능
- 서버에서 세션을 제거하면, 사용자는 더 이상 인증되지 않음
적은 데이터 전송
- Session ID만 전송하면 되므로, 토큰보다 네트워크 사용량이 적음
❌ 단점
서버 메모리 사용 증가
- 각 사용자별로 세션을 저장해야 하므로, 사용자가 많아질수록 메모리 부담 증가
- 확장성(Scalability)이 낮아짐 (수평 확장이 어려움)
로드 밸런싱이 어려움
- 서버가 세션을 저장하므로, 여러 서버를 운영할 경우 Sticky Session 또는 Redis 같은 외부 저장소(Session Storage)가 필요
CSRF 공격에 취약
- 세션이 Cookie를 사용하기 때문에, CSRF 보호를 위한 추가적인 조치(CSRF Token 등)가 필요
Token 기반 인증 (JWT)
서버에서 인증 정보를 포함한 토큰을 발급하고, 클라이언트가 이를 저장하여 요청 시마다 포함하는 방식
- 클라이언트가 로그인하면 서버는 JWT(Json Web Token)을 생성하여 클라이언트에게 반환
- 이후 클라이언트는 요청할 때마다 JWT를 HTTP Header에 포함하여 전송
- 서버는 JWT를 검증하여 사용자 인증 및 권한 확인
Token 인증 흐름 (JWT 예제)
- 사용자가 로그인 요청 (ID/PW)
- 서버는 사용자 인증 후, JWT 토큰을 생성하여 클라이언트에게 응답
- 클라이언트는 JWT를 LocalStorage 또는 Cookie에 저장
- 이후 요청 시, Authorization: Bearer <JWT> 형식으로 HTTP Header에 포함
- 서버는 JWT를 검증하여 인증 및 권한을 확인
- 로그아웃 시 클라이언트가 토큰을 삭제 (단, 서버에서 강제 만료는 어렵다)
✅ 장점
서버 확장성 (Scalability) 높음
- 서버에서 세션을 저장하지 않으므로, 서버가 늘어나도 관리가 쉬움
- 로드 밸런싱이 필요할 때 Stateless한 방식이므로 모든 서버가 동일하게 처리 가능
OAuth 2.0, Single Sign-On (SSO) 등과 연계 가능
- JWT는 여러 서비스에서 인증을 공유하는 데 유리
클라이언트에서 정보 확인 가능
- JWT에는 사용자 정보(예: user_id, role)가 포함될 수 있어, 일부 정보를 클라이언트에서 확인 가능
CSRF에 상대적으로 안전
- JWT는 주로 Authorization Header로 전송하므로 CSRF 공격에 덜 취약
❌ 단점
토큰 탈취 시 보안 위험 증가
- JWT는 자체적으로 무효화할 수 없음 (세션과 달리 서버에서 일괄 삭제 불가)
- 토큰이 유출되면 유효기간 만료 전까지는 공격자가 계속 사용할 수 있음
Payload 크기 문제
- JWT는 보통 Header.Payload.Signature로 이루어지며, Payload에 많은 정보를 담으면 전송 데이터가 커질 수 있음
토큰 재발급(Refresh Token) 관리 필요
- JWT가 만료되면 새로 로그인해야 하므로, Refresh Token을 사용하여 재발급 시스템을 구축해야 함
🎯 Session 기반 vs Token(JWT) 기반 비교
유형 | Session 기반 인증 | Token (JWT) 기반 인증 |
저장 위치 | 서버 (Session Storage) | 클라이언트 (LocalStorage, Cookie) |
서버 확장성 | 낮음 (서버에서 관리 필요) | 높음 (Stateless) |
보안성 | 세션 관리로 안전 (HttpOnly 가능) | 토큰 탈취 시 위험 |
CSRF 취약성 | 있음 (CSRF 방어 필요) | 적음 (Authorization Header 사용) |
토큰 무효화 | 서버에서 즉시 삭제 가능 | 불가능 (만료될 때까지 사용 가능) |
데이터 전송량 | Session ID만 전송 (작음) | JWT 크기가 클 수 있음 |
로드 밸런싱 | 어려움 (Sticky Session 필요) | 쉬움 (Stateless) |
Single Sign-On (SSO) | 어렵다 | 가능 (OAuth 2.0 활용) |
어떤 방식을 선택해야 할까❓
Session 기반 인증이 적합한 경우
- 일반적인 웹 애플리케이션 (예: 기업 내부 시스템, 관리 페이지)
- 서버 확장성이 크게 중요하지 않은 경우
- 보안이 중요하며, 즉시 세션을 만료(즉시 로그아웃)해야 하는 경우
Token(JWT) 기반 인증이 적합한 경우
- 대규모 서비스 또는 마이크로서비스 아키텍처(MSA) 환경
- 모바일 앱 + 웹앱에서 동일한 인증 시스템을 사용해야 하는 경우
- OAuth 2.0 또는 SSO(싱글 사인온)가 필요한 경우
반응형
'ETC' 카테고리의 다른 글
샤딩(Sharding)과 클러스터링(Clustering) (0) | 2024.12.11 |
---|---|
Jenkins Pipeline에 Slack 연동하기 (0) | 2022.05.08 |
Jenkins를 이용한 Docker 컨테이너 자동 배포하기(Blue Ocean, Bitbucket, NCP) (8) | 2022.05.06 |
Jenkins를 이용한 프로젝트 자동 배포하기(Bitbucket, EC2) (0) | 2022.05.03 |
H2 Database 사용자 정의 함수 만들기 (0) | 2022.04.19 |