Intellij
- 서버는 사용자를 식별하기 위해 쿠키를 생성, 쿠키는 클라이언트(사용자)의 브라우저에 저장
- 해당 사용자가 동일한 웹사이트를 방문할 때마다. 브라우저는 저장된 쿠키를 서버에 전송
- 수명: 쿠키는 만료 날짜가 설정될 수 있습니다. 만료 날짜가 설정된 쿠키는 영구 쿠키로 불리며, 만료 날짜가 없는 쿠키는 세션 쿠키로 불리며 브라우저가 닫히면 삭제됩니다.
- 보안: 쿠키는 브라우저에 저장되므로, 데이터의 안전성은 중요합니다. 쿠키에는 민감한 정보를 저장하지 않는 것이 좋습니다.
- 사용 예: 로그인 상태 유지, 사용자 설정 정보 저장 등.
- 서버는 각 사용자에 대한 세션을 생성, 고유한 세션 ID를 생성하여 사용자를 식별
- 세션 ID는 쿠키를 통해 클라이언트에 전달
- 서버 측 저장: 세션 데이터는 서버 측에 저장되며, 클라이언트에는 세션 ID만 전달됩니다.
- 단기적: 세션은 주로 사용자가 브라우저를 닫거나 일정 시간이 경과하면 만료됩니다.
- 보안: 쿠키에 비해 상대적으로 안전하며, 서버 측에서만 접근 가능한 데이터를 저장할 수 있습니다.
- 사용 예: 사용자 인증, 장바구니 정보 저장 등.
- 사용자 로그인: 사용자가 로그인하면 서버는 세션을 생성하고, 고유한 세션 ID를 생성합니다.
- 쿠키에 세션 ID 저장: 서버는 이 세션 ID를 쿠키에 담아 클라이언트에 전송합니다.
- 인증된 요청: 사용자가 서버에 요청을 보낼 때마다 브라우저는 해당 쿠키(세션 ID 포함)를 서버로 전송합니다.
- 서버에서 세션 확인: 서버는 전송된 세션 ID를 확인하고, 해당 세션에 저장된 정보를 기반으로 사용자를 인증합니다.
- 스테이트리스 인증 메서니즘으로 사용 - 서버가 클라이언트의 상태를 유지하지 않는 애플리케이션에서 널리 사용
- 모든 서버 동일한 Secret Key 소유
- 헤더(Header): 토큰의 타입(JWT)과 해싱 알고리즘(예: HS256)을 명시합니다.
- 페이로드(Payload): 토큰에 포함된 클레임(Claim, 즉 토큰에 포함된 데이터)을 나타냅니다. 일반적으로 사용자 정보나 권한, 만료 시간 등이 포함됩니다.
- 서명(Signature): 비밀 키를 사용해 생성된 서명으로, 토큰의 무결성을 확인하는 데 사용됩니다. 헤더와 페이로드의 정보를 기반으로 생성됩니다.
- 스테이트리스: 서버는 클라이언트의 상태를 저장하지 않으며, 클라이언트가 JWT를 요청마다 전송합니다.
- 보안: JWT는 서명을 통해 데이터의 무결성을 보장하지만, 암호화를 사용하지 않으면 누구나 JWT의 내용을 읽을 수 있습니다. 따라서 민감한 정보를 JWT에 담아서는 안 됩니다.
- 자가 포함(Self-contained): JWT는 자체적으로 필요한 모든 정보를 포함하므로, 추가적인 데이터베이스 조회 없이도 사용자의 인증 상태를 확인할 수 있습니다.
- 사용 예: SPA(Single Page Application) 인증, 모바일 애플리케이션 인증, 마이크로서비스 간의 인증 등.
- 사용자 로그인: 사용자가 로그인하면 서버는 사용자를 인증하고 JWT를 생성합니다.
- JWT 전송: 서버는 이 JWT를 클라이언트에 전송합니다.
- 클라이언트 저장: 클라이언트는 이 JWT를 저장(주로 로컬 스토리지 또는 쿠키)합니다.
- 인증된 요청: 사용자가 서버에 요청을 보낼 때마다 JWT를 포함시켜 서버로 전송합니다(주로 HTTP 헤더의
Authorization필드에 담아 보냄).- 서버에서 JWT 검증: 서버는 전송된 JWT의 서명을 검증하고, 토큰의 유효성을 확인하여 사용자를 인증합니다.
- 장점
- 동시 접속자가 많을 떄 서버 측 부하 낮춤
- Client, Sever가 다른 도메인을 사용할 때
- 단점
- 구현의 복잡도 증가
- JWT가 담는 내용이 커질 수록 네트워크 비용 증가
- Secret KEY 유출 시 JWT 조작 가능
| 특성 | 쿠키-세션 | JWT |
|---|---|---|
| 저장 위치 | 세션 데이터는 서버에, 세션 ID는 쿠키에 저장 | 클라이언트에 저장 (로컬 스토리지, 쿠키) |
| 상태 유지 | 서버가 상태를 유지 (Stateful) | 서버가 상태를 유지하지 않음 (Stateless) |
| 보안 | 세션 ID 유출 시 보안 위험이 있지만, 데이터는 서버에 저장되므로 안전 | 데이터가 클라이언트에 저장되므로 민감한 정보는 포함하지 않아야 함 |
| 확장성 | 서버 상태에 의존하므로 확장에 제한이 있음 | 스테이트리스 구조로 확장성 우수 |
| 만료 | 세션 만료 시간 설정 가능 | JWT에 만료 시간이 포함되어 있음 |
| 사용 편의성 | 쿠키를 통한 세션 ID 자동 전송 | JWT를 요청마다 포함시켜야 함 |