Session 인증과 JWT(Json Web Token) 인증은 모두 웹 애플리케이션에서 사용자를 인증하는 방법이지만, 동작 방식과 관리 방법이 다릅니다. 각각의 개념과 차이점을 설명하겠습니다.
1. Session 인증
개념
- Session 기반 인증은 서버에 사용자 인증 상태를 유지하기 위한 세션을 생성하는 방식입니다. 사용자가 로그인하면 서버는 세션 ID를 생성하고, 이 세션 ID를 클라이언트에 쿠키로 전달합니다.
- 클라이언트는 이후 요청 시 이 세션 ID를 함께 보내며, 서버는 이를 통해 사용자가 인증되었음을 확인합니다.
- 서버는 각 사용자의 세션 ID와 연결된 세션 데이터를 서버 메모리나 데이터베이스에 저장하여, 사용자의 상태를 관리합니다.
동작 과정
- 로그인 요청: 사용자가 로그인 정보를 서버에 전송합니다.
- 서버에서 인증: 서버는 사용자의 자격 증명을 확인한 후, 세션을 생성하고 세션 ID를 발급합니다.
- 세션 ID 저장: 서버는 세션 ID를 서버 측 세션 저장소에 저장하고, 이 ID를 클라이언트에게 쿠키로 전송합니다.
- 인증된 요청: 이후 클라이언트는 모든 요청에 세션 ID를 쿠키로 포함시켜 서버에 전송합니다.
- 세션 확인: 서버는 세션 ID를 기반으로 사용자의 세션 정보를 확인하고, 요청을 처리합니다.
장점
- 상태 유지: 서버가 사용자 상태를 관리하므로, 상태 정보를 활용한 복잡한 비즈니스 로직 구현에 유리합니다.
- 보안성: 세션 ID는 서버에서만 관리되므로, 정보 유출 가능성이 낮습니다.
단점
- 서버 부하: 서버에 세션 정보를 저장해야 하므로, 많은 사용자를 처리할 경우 서버 메모리나 저장소에 부하가 걸릴 수 있습니다.
- 확장성: 서버 확장 시 세션 정보를 공유해야 하므로, 복잡성이 증가합니다.
2. JWT 인증
개념
- JWT 기반 인증은 클라이언트와 서버 간의 인증 정보를 JSON Web Token 형태로 주고받는 방식입니다. JWT는 클라이언트 측에서 보관하며, 서버는 JWT를 통해 사용자를 인증합니다.
- JWT는 기본적으로 세 부분으로 구성됩니다: 헤더(Header), 페이로드(Payload), 서명(Signature). 페이로드에는 사용자 정보와 만료 시간 등의 정보가 포함되며, 서명은 토큰의 무결성을 확인하는 데 사용됩니다.
동작 과정
- 로그인 요청: 사용자가 로그인 정보를 서버에 전송합니다.
- 서버에서 인증: 서버는 사용자의 자격 증명을 확인한 후, JWT를 생성하여 클라이언트에게 반환합니다.
- 토큰 저장: 클라이언트는 JWT를 로컬 스토리지 또는 쿠키에 저장합니다.
- 인증된 요청: 이후 클라이언트는 모든 요청의 헤더에 JWT를 포함하여 서버에 전송합니다.
- 토큰 확인: 서버는 JWT의 서명을 확인하여 무결성을 검증하고, 페이로드를 확인하여 사용자를 인증합니다.
장점
- 무상태성: 서버가 별도의 세션을 관리하지 않으므로, 서버 확장 및 클라우드 환경에서의 확장성에 유리합니다.
- 자체 인증 정보: JWT 자체에 필요한 정보를 포함하고 있으므로, 추가적인 데이터베이스 조회 없이 사용자 인증을 처리할 수 있습니다.
단점
- 보안 문제: JWT는 클라이언트 측에 저장되므로, 토큰이 유출되면 쉽게 재사용될 수 있습니다. 따라서 토큰 만료 시간 관리 및 재발급 정책이 중요합니다.
- 크기: JWT는 세션 ID보다 크기가 커질 수 있으므로, 네트워크 트래픽에 영향을 줄 수 있습니다.
3. Session 인증과 JWT 인증의 비교
| 특징 | Session 인증 | JWT 인증 |
|---|
| 상태 유지 | 서버에서 사용자 상태를 유지 | 무상태성 (서버는 토큰만 검증) |
| 확장성 | 서버 확장 시 세션 정보 공유 필요 | 서버 확장에 유리 (토큰만 유효성 검사) |
| 보안 | 서버에서 세션 관리 (유출 위험 낮음) | 토큰 유출 시 보안 위험 |
| 서버 부하 | 많은 세션 관리 시 서버 부하 증가 | 서버 부하 낮음 (세션 관리 필요 없음) |
| 네트워크 트래픽 | 세션 ID만 전송 (작음) | JWT 크기가 클 수 있음 (네트워크 트래픽 증가) |
이 두 가지 인증 방식은 각기 다른 요구사항과 환경에 따라 선택됩니다. 예를 들어, 서버 간 확장성이 중요한 클라우드 환경에서는 JWT가 선호되지만, 보안성이 중요한 환경에서는 Session 인증이 더 적합할 수 있습니다.