세션(Session)과 JWT(JSON Web Token)은 모두 사용자 인증을 관리하기 위한
방법이지만, 동작 방식과 저장 방식에서 차이가 있습니다.
세션(Session)
세션은 사용자가 웹 애플리케이션에 로그인할 때 서버가 고유 세션 ID를 발급하여, 서버에 사용자 상태를 저장하고 이를 통해 인증 상태를 관리하는 방식입니다.
세션의 특징
- 세션 저장 위치: 세션 정보는 서버에 저장되며, 주로 메모리나 데이터베이스에 저장됩니다.
- 세션 ID: 서버가 생성한 고유 세션 ID가 사용자의 브라우저에 쿠키로 전달됩니다. 이후 클라이언트는 요청 시 쿠키에 포함된 세션 ID를 서버로 전송하여, 서버가 이를 확인하고 사용자의 인증 상태를 유지합니다.
- 상태 저장성(Stateful): 서버가 세션 정보를 유지하기 때문에 상태 저장 방식입니다. 즉, 사용자의 인증 상태가 서버에 의존합니다.
- 서버 확장성 제한: 세션은 서버에 저장되므로, 서버가 여러 대일 경우 세션을 일관되게 관리하기 어렵습니다. 보통 세션 클러스터링이나 데이터베이스를 통해 공유하지만, 관리가 복잡해질 수 있습니다.
세션 인증 흐름
- 사용자가 로그인하면, 서버는 고유한 세션 ID를 생성하고 이를 서버의 세션 저장소에 저장합니다.
- 서버는 세션 ID를 클라이언트에 쿠키로 전송하고, 클라이언트는 이를 저장합니다.
- 클라이언트는 이후 요청 시 쿠키에 포함된 세션 ID를 서버로 전송하여 인증 상태를 확인합니다.
- 서버는 세션 ID를 확인하여 사용자의 인증 상태를 유지합니다.
JSON Web Token (JWT)
JWT는 서버와 클라이언트 간에 정보를 안전하게 주고받기 위해 사용하는 자체 인증 토큰입니다. JWT는 JSON 형식으로 이루어진 문자열로, 서버에서 생성하여 클라이언트에 전달됩니다. 클라이언트는 이후 요청 시 이 토큰을 포함하여 서버에 전송함으로써 인증 상태를 유지합니다.
JWT의 특징
- 토큰 기반 인증: JWT는 클라이언트에 토큰을 저장하고, 서버에는 인증 상태를 저장하지 않는 방식입니다.
- 구조: JWT는 세 부분으로 구성됩니다.
- 헤더(Header): 토큰 유형과 해싱 알고리즘 정보.
- 페이로드(Payload): 사용자 정보나 토큰 만료 시간과 같은 데이터.
- 서명(Signature): 헤더와 페이로드를 인코딩한 후 비밀 키로 서명한 값으로, 토큰이 변조되지 않도록 보장합니다.
- 상태 비저장성(Stateless): 서버가 인증 정보를 저장하지 않으므로 상태 비저장 방식입니다. 토큰 자체에 인증 정보를 포함하고 있어, 서버는 토큰만 검증하면 됩니다.
- 확장성: JWT는 서버 확장성이 뛰어나며, 서버 간의 세션 상태를 공유할 필요가 없습니다.
JWT 인증 흐름
- 사용자가 로그인하면, 서버는 사용자 정보를 포함한 JWT를 생성하고 이를 클라이언트에 전송합니다.
- 클라이언트는 JWT를 로컬 저장소(Local Storage)나 쿠키에 저장합니다.
- 클라이언트는 이후 요청 시 이 토큰을 헤더에 포함하여 서버로 전송합니다.
- 서버는 토큰의 서명을 검증하여 유효한지 확인하고, 사용자 인증을 처리합니다.
세션과 JWT의 차이점 요약
특징세션(Session)JWT (JSON Web Token)
저장 위치 | 서버에 저장 | 클라이언트에 저장 |
상태 관리 | 상태 저장 방식 (Stateful) | 상태 비저장 방식 (Stateless) |
확장성 | 서버 확장 시 세션 관리 필요 | 서버 확장에 유리 |
보안 | 서버에서 세션 만료 및 관리를 제어 | 만료 시간 지정 가능, 자체 서명으로 무결성 보장 |
주로 사용하는 곳 | 전통적인 웹 애플리케이션 | SPA, 모바일 앱, 서버 간 인증 |
세션과 JWT의 선택 기준
- 세션은 사용자 인증 정보를 서버에 저장하고 관리하므로, 서버가 인증 상태를 제어할 수 있고 세션 만료 등 보안 관리를 쉽게 할 수 있습니다. 주로 전통적인 웹 애플리케이션에서 사용됩니다.
- JWT는 클라이언트에 토큰을 저장하여 서버가 상태를 저장할 필요가 없으므로, 확장성과 이동성이 요구되는 시스템에서 유리합니다. 주로 SPA(Single Page Application)나 모바일 애플리케이션, 서버 간 인증에서 많이 사용됩니다.
서버의 확장성, 보안 요구사항, 그리고 애플리케이션 구조에 따라 세션과 JWT 중 적합한 인증 방식을 선택하는 것이 좋습니다.
'Springboot Study > Springboot Security' 카테고리의 다른 글
Filter (FilterChain) (0) | 2024.10.31 |
---|---|
Spring Security에서 중요한 인터페이스들 (0) | 2024.10.30 |
스레드풀 (0) | 2024.10.29 |
OAuth (1) | 2024.10.28 |
인증(Authentication)과 권한 부여(Authorization) (0) | 2024.10.28 |