
1. 인증(Authentication)과 인가(Authorization)의 정의
- 인증(Authentication): 사용자가 누구인지 확인하는 절차다. 회원가입과 로그인이 대표적인 예시다.
- 인가(Authorization): 사용자가 요청한 리소스에 대해 적절한 접근 권한이 있는지 확인하는 절차다.
2. 세션 기반 인증 및 인가 절차
서버가 클라이언트의 상태를 관리하는 대표적인 절차는 다음과 같다.
- 로그인 요청: 클라이언트가 로그인 정보를 전송하면 서버는 회원 정보를 대조하여 인증을 수행한다.
- 세션 생성: 인증에 성공하면 서버는 세션 저장소에 정보를 생성하고
Session ID를 발급한다. - ID 전달: 서버는 HTTP 응답 헤더의 쿠키에
Session ID를 담아 클라이언트에 전달한다. - ID 저장 및 전송: 클라이언트는 해당 ID를 저장하고 이후 요청마다 쿠키에 담아 전송한다.
- 정보 조회 및 인가: 서버는 전달받은 ID를 기준으로 세션 저장소를 조회하여 사용자 정보를 확인하고 인가를 수행한다.
- 데이터 응답: 인가가 완료되면 요청 결과를 응답 메시지에 담아 반환한다.
3. 세션 방식의 특징 및 보안 취약점
주요 장점 및 단점
- 보안성 향상: 사용자 정보를 직접 쿠키에 담지 않고
Session ID만 전송하므로 비교적 안전하다. - 자원 소모: 서버 측 세션 저장소를 활용하므로 추가 저장 공간과 메모리 자원이 필요하다.
- 확장성 제한: Load Balancing 환경에서는 여러 서버 간 세션 공유와 관리가 필요해 확장에 제약이 생길 수 있다.
보안 위협: 세션 하이재킹(Session Hijacking)
- 개요: 악의적인 사용자가 타인의
Session ID를 탈취하여 서버에 요청을 보내는 공격 방식이다. - 대응 방법: 전송 구간 암호화를 위한 HTTPS 사용, 짧은 세션 만료 시간 설정, 세션 관리 강화가 필요하다.
추가 정리
Q. 서버 확장성 문제를 해결하는 방법은?
- Sticky Session: 특정 사용자의 요청을 처음 처리한 서버로만 고정 전달하는 방식.
- Session Clustering: 서버 그룹 간 세션 데이터를 실시간 복제하여 공유하는 방식.
- Redis 활용: 별도의 인메모리 데이터베이스(Redis 등)를 세션 전용 저장소로 사용하여 모든 서버가 공유하는 방식.
Q. 세션 방식과 JWT(토큰) 방식의 결정적 차이는?
- 세션은 서버가 상태를 보관하는 방식(Stateful)이고, JWT는 서버가 상태를 보관하지 않는 무상태 방식(Stateless)이다.
- 확장성이 중요한 대규모 서비스에서는 서버 자원 부담이 상대적으로 적은 토큰 기반 인증이 자주 사용된다.