Spring Boot 공부 일기 <11> - 세션-쿠키, JWT

이동휘·2024년 8월 21일

Spring Boot

목록 보기
11/21

1. IDE

Intellij

2. 오늘 공부 내용

세션-쿠키, JWT

세션-쿠키

  • 쿠기 - 사용자의 브라우저에 저장되는 작은 조각
  • 서버는 사용자를 식별하기 위해 쿠키를 생성, 쿠키는 클라이언트(사용자)의 브라우저에 저장
  • 해당 사용자가 동일한 웹사이트를 방문할 때마다. 브라우저는 저장된 쿠키를 서버에 전송
  • 쿠키의 특징
  • 수명: 쿠키는 만료 날짜가 설정될 수 있습니다. 만료 날짜가 설정된 쿠키는 영구 쿠키로 불리며, 만료 날짜가 없는 쿠키는 세션 쿠키로 불리며 브라우저가 닫히면 삭제됩니다.
  • 보안: 쿠키는 브라우저에 저장되므로, 데이터의 안전성은 중요합니다. 쿠키에는 민감한 정보를 저장하지 않는 것이 좋습니다.
  • 사용 예: 로그인 상태 유지, 사용자 설정 정보 저장 등.
  • 세션 - 사용자와 서버 간의 일시적인 연결 상태 유지하는 방법
  • 서버는 각 사용자에 대한 세션을 생성, 고유한 세션 ID를 생성하여 사용자를 식별
  • 세션 ID는 쿠키를 통해 클라이언트에 전달
  • 세션 특징
  • 서버 측 저장: 세션 데이터는 서버 측에 저장되며, 클라이언트에는 세션 ID만 전달됩니다.
  • 단기적: 세션은 주로 사용자가 브라우저를 닫거나 일정 시간이 경과하면 만료됩니다.
  • 보안: 쿠키에 비해 상대적으로 안전하며, 서버 측에서만 접근 가능한 데이터를 저장할 수 있습니다.
  • 사용 예: 사용자 인증, 장바구니 정보 저장 등.
  • 쿠키-세션의 흐름
  1. 사용자 로그인: 사용자가 로그인하면 서버는 세션을 생성하고, 고유한 세션 ID를 생성합니다.
  2. 쿠키에 세션 ID 저장: 서버는 이 세션 ID를 쿠키에 담아 클라이언트에 전송합니다.
  3. 인증된 요청: 사용자가 서버에 요청을 보낼 때마다 브라우저는 해당 쿠키(세션 ID 포함)를 서버로 전송합니다.
  4. 서버에서 세션 확인: 서버는 전송된 세션 ID를 확인하고, 해당 세션에 저장된 정보를 기반으로 사용자를 인증합니다.

JWT

  • JWT - JSON 포맷을 사용하여 클라이언트와 서버 간에 정보를 안전하게 전송하는 방법
  • 스테이트리스 인증 메서니즘으로 사용 - 서버가 클라이언트의 상태를 유지하지 않는 애플리케이션에서 널리 사용
  • 모든 서버 동일한 Secret Key 소유
  • JWT 구조 - 헤더(Header), 페이로드(Payload), 서명(Signature)
  • 헤더(Header): 토큰의 타입(JWT)과 해싱 알고리즘(예: HS256)을 명시합니다.
  • 페이로드(Payload): 토큰에 포함된 클레임(Claim, 즉 토큰에 포함된 데이터)을 나타냅니다. 일반적으로 사용자 정보나 권한, 만료 시간 등이 포함됩니다.
  • 서명(Signature): 비밀 키를 사용해 생성된 서명으로, 토큰의 무결성을 확인하는 데 사용됩니다. 헤더와 페이로드의 정보를 기반으로 생성됩니다.
  • JWT 특징
  • 스테이트리스: 서버는 클라이언트의 상태를 저장하지 않으며, 클라이언트가 JWT를 요청마다 전송합니다.
  • 보안: JWT는 서명을 통해 데이터의 무결성을 보장하지만, 암호화를 사용하지 않으면 누구나 JWT의 내용을 읽을 수 있습니다. 따라서 민감한 정보를 JWT에 담아서는 안 됩니다.
  • 자가 포함(Self-contained): JWT는 자체적으로 필요한 모든 정보를 포함하므로, 추가적인 데이터베이스 조회 없이도 사용자의 인증 상태를 확인할 수 있습니다.
  • 사용 예: SPA(Single Page Application) 인증, 모바일 애플리케이션 인증, 마이크로서비스 간의 인증 등.
  • JWT 흐름
  1. 사용자 로그인: 사용자가 로그인하면 서버는 사용자를 인증하고 JWT를 생성합니다.
  2. JWT 전송: 서버는 이 JWT를 클라이언트에 전송합니다.
  3. 클라이언트 저장: 클라이언트는 이 JWT를 저장(주로 로컬 스토리지 또는 쿠키)합니다.
  4. 인증된 요청: 사용자가 서버에 요청을 보낼 때마다 JWT를 포함시켜 서버로 전송합니다(주로 HTTP 헤더의 Authorization 필드에 담아 보냄).
  5. 서버에서 JWT 검증: 서버는 전송된 JWT의 서명을 검증하고, 토큰의 유효성을 확인하여 사용자를 인증합니다.
  • JWT의 장단점
  • 장점
    • 동시 접속자가 많을 떄 서버 측 부하 낮춤
    • Client, Sever가 다른 도메인을 사용할 때
  • 단점
    • 구현의 복잡도 증가
    • JWT가 담는 내용이 커질 수록 네트워크 비용 증가
    • Secret KEY 유출 시 JWT 조작 가능

쿠키-세션, JWT 비교

특성쿠키-세션JWT
저장 위치세션 데이터는 서버에, 세션 ID는 쿠키에 저장클라이언트에 저장 (로컬 스토리지, 쿠키)
상태 유지서버가 상태를 유지 (Stateful)서버가 상태를 유지하지 않음 (Stateless)
보안세션 ID 유출 시 보안 위험이 있지만, 데이터는 서버에 저장되므로 안전데이터가 클라이언트에 저장되므로 민감한 정보는 포함하지 않아야 함
확장성서버 상태에 의존하므로 확장에 제한이 있음스테이트리스 구조로 확장성 우수
만료세션 만료 시간 설정 가능JWT에 만료 시간이 포함되어 있음
사용 편의성쿠키를 통한 세션 ID 자동 전송JWT를 요청마다 포함시켜야 함

요약

  • 쿠키-세션은 상태를 서버에서 유지하고 , 보안에 민감한 애플리케이션에서 유리
  • JWT는 서버가 상태를 유지할 필요가 없고, 확장성과 성능이 중요한 애플리케이션에서 주로 사용

0개의 댓글