Spring

[SpringBoot] Cookie & JWT

codi-3 2024. 8. 21. 20:36

Spring Boot에서 Cookie와 JWT(Json Web Token)는 웹 애플리케이션에서 사용자 인증 및 세션 관리를 위해 자주 사용된다. 두 가지는 서로 다른 방식으로 사용되며, 그 특성에 따라 상황에 맞게 선택할 수 있다.


🍪 Cookie

Cookie는 사용자의 브라우저에 저장되는 작은 데이터 조각으로, 서버가 클라이언트를 식별하거나 세션 정보를 저장하기 위해 사용된다.

  • 동작 방식:
    1. 클라이언트가 서버에 요청을 보내면, 서버는 응답과 함께 Cookie를 생성하여 클라이언트에게 보낸다.
    2. 클라이언트는 이 Cookie를 브라우저에 저장하고, 이후의 요청에서 이 Cookie를 서버로 다시 전송한다.
    3. 서버는 이 Cookie를 확인하여 클라이언트를 식별하거나 세션을 유지한다.
  • 사용 예:
    • 사용자 세션 유지: 서버는 사용자의 세션 정보를 서버 측에 저장하고, 클라이언트에는 세션 ID를 포함한 Cookie를 제공한다.
    • 사용자 설정 저장: 사용자의 선호 언어나 테마 등의 정보를 Cookie에 저장할 수 있다.
  • 보안 고려사항:
    • Cookie에는 민감한 정보를 저장하지 않도록 해야 한다.
    • HttpOnly, Secure, SameSite와 같은 속성을 사용해 보안을 강화할 수 있다.

🪙 JWT (Json Web Token)

JWT는 클라이언트와 서버 간의 정보를 JSON 객체로 표현한 토큰이다. JWT는 서명되기 때문에, 토큰이 위변조되지 않았음을 확인할 수 있다.

  • 구성 요소:
    1. Header: 토큰 타입과 해싱 알고리즘 정보를 담고 있다. (예: {"alg": "HS256", "typ": "JWT"})
    2. Payload: 실제로 저장될 데이터가 포함됩니다. 여기에는 사용자의 정보와 같은 클레임(Claims)이 포함된다. (예: {"sub": "1234567890", "name": "John Doe", "admin": true})
    3. Signature: Header와 Payload를 비밀 키로 해싱한 값이다. 이 서명으로 토큰이 변조되지 않았음을 확인한다.
  • 동작 방식:
    1. 사용자가 로그인하면 서버는 JWT를 생성하여 클라이언트에게 반환한다.
    2. 클라이언트는 이 JWT를 로컬 스토리지나 쿠키에 저장하고, 이후의 요청에서 Authorization 헤더에 포함하여 서버로 전송한.
    3. 서버는 전송된 JWT의 서명을 확인한 후, Payload에 포함된 정보를 바탕으로 사용자를 인증한다.
  • 사용 예:
    • API 인증: RESTful API에서 JWT는 사용자를 인증하고 권한을 부여하는 데 자주 사용된다.
    • 무상태(stateless) 인증: JWT는 세션 상태를 서버에 저장할 필요가 없기 때문에, 분산 시스템에서 효율적으로 사용될 수 있다.
  • 보안 고려사항:
    • JWT는 기본적으로 암호화되지 않으므로, 민감한 정보를 Payload에 포함시키지 않아야 한다.
    • 비밀 키는 안전하게 관리해야 하며, JWT가 만료되지 않도록 만료 시간(expiration time)을 설정하는 것이 중요하다.