세션 기반 인증과 JWT(Jason Web Token)를 사용한 토큰 기반 인증

heyjk2212·2024년 1월 23일
0

면접준비

목록 보기
12/13

1. 세션 기반 인증

  • 세션 기반 인증은 서버 측에서 사용자의 상태를 유지하고 세션 ID를 클라이언트에게 제공하여 로그인 상태를 유지합니다.

  • 일반적으로 사용자가 로그인하면 서버는 세션을 생성하고, 이 세션 ID를 클라이언트에게 쿠키로 전송합니다.

  • 클라이언트는 세션 ID를 쿠키로 저장하고, 이를 이용하여 서버에 인증된 요청을 보냅니다.

  • 서버는 세션 ID를 사용하여 사용자의 로그인 상태를 추적하고 필요한 경우 세션을 무효화할 수 있습니다.

2. JWT를 사용한 토큰 기반 인증

  • JWT는 클레임(claim)이라 불리는 정보를 담은 JSON 객체로 표현된 토큰입니다.

  • 사용자가 로그인하면 서버는 JWT를 생성하고 이를 클라이언트에게 전달합니다.

  • 클라이언트는 JWT를 저장하고, 이를 이용하여 서버에 요청을 보냅니다. 보통 HTTP 헤더나 쿠키 등에 토큰을 실어 보냅니다.

  • 서버는 JWT를 검증하고 클레임에 따라 사용자의 권한을 확인합니다.

  • 로그인 시에 JWT를 발급하고, 이를 쿠키로 클라이언트에게 전송하여 로그인 상태를 유지합니다. 클라이언트는 이 JWT를 이용하여 서버에 요청을 보냅니다.

세션 기반 인증에서는 보통 세션 ID가 쿠키로 전달되어 상태를 유지하며, JWT를 사용한 토큰 기반 인증에서는 JWT가 쿠키 또는 다른 방식으로 전달되어 상태를 유지합니다.


세션 ID와 JWT의 차이

구조:

  • 세션 ID: 세션 기반 인증에서는 서버가 사용자에 대한 정보를 서버에 저장하고 클라이언트에게는 세션 ID만 전달합니다. 세션 ID는 일반적으로 쿠키에 저장되며, 클라이언트는 이 세션 ID를 사용하여 서버에서 세션 데이터를 조회합니다.

  • JWT: JWT는 클레임(claim)이라 불리는 정보를 담은 JSON 객체로 표현된 토큰입니다. 서버가 클라이언트에게 토큰을 발급하고, 클라이언트는 이 토큰을 저장하고 서버에 전송하여 인증을 수행합니다.

서버의 상태 유무:

  • 세션 ID: 서버는 세션 데이터를 관리하고, 클라이언트는 단순히 세션 ID를 전달합니다. 서버에는 클라이언트에 대한 상태가 유지됩니다.

  • JWT: JWT는 서버에 상태를 저장하지 않습니다. 토큰에 모든 필요한 정보가 포함되어 있으므로, 서버 측에서 사용자의 상태를 추적할 필요가 없습니다.

스케일링 및 분산 환경:

  • 세션 ID: 세션 기반 인증은 서버 측에서 사용자 상태를 관리하므로 서버가 중앙 집중식으로 상태를 유지해야 합니다. 이는 서버의 확장성에 일부 제약을 가할 수 있습니다.

  • JWT: JWT는 토큰 자체에 필요한 정보가 모두 포함되어 있기 때문에, 서버 사이의 통신에서도 상태를 유지하기 용이합니다. 이는 서버의 스케일링 및 분산 환경에서 유리합니다.

유효 기간 관리:

  • 세션 ID: 세션 기반 인증에서는 세션 ID의 유효 기간을 서버에서 관리합니다.

  • JWT: JWT는 토큰에 유효 기간을 포함할 수 있으며, 클라이언트 측에서 이를 검증하여 토큰의 유효성을 확인합니다.

안전성:

  • 세션 ID: 세션 기반 인증에서는 클라이언트가 세션 ID를 가로채면 세션을 탈취할 수 있습니다.

  • JWT: JWT는 서명(signature)이 포함되어 있어 클라이언트 측에서 토큰의 변조를 감지할 수 있습니다.


세션 기반 인증의 장점과 단점:

장점:

  • 세션 데이터가 서버에 저장되기 때문에 클라이언트에서 직접 조작하기 어렵습니다.

  • 서버에서 세션 관리를 할 수 있기 때문에, 로그인 상태를 쉽게 무효화할 수 있습니다.

단점:

  • 서버에 상태를 유지해야 하기 때문에 서버의 확장성에 영향을 미칠 수 있습니다.

  • CSRF(Cross-Site Request Forgery)와 같은 공격에 취약할 할 수 있습니다.

  • 로그인 상태를 다양한 서버 간에 공유하기 어렵습니다.

JWT 기반 인증의 장점과 단점:

장점:

  • 서버에 상태를 저장하지 않아도 되기 때문에 서버의 확장성이 향상됩니다.

  • 클라이언트 측에서 상태를 저장하므로, 서버 간에 상태 공유가 간편합니다.

  • 클라이언트와 서버 사이에 효과적인 토큰 기반 인증이 가능합니다.

단점:

  • 토큰이 유출되면 정보를 읽을 수 있기 때문에, 반드시 안전한 전송을 보장해야 합니다.

  • 토큰이 클라이언트에 저장되어 있어 XSS(Cross-Site Scripting) 공격에 노출될 수 있습니다.

  • 토큰을 발급한 후에는 유효 기간을 조정할 수 없으므로, 안전한 방법으로 관리해야 합니다.


보안적인 측면

  • HTTPS를 사용하여 통신을 암호화해야 합니다.

  • 토큰을 안전한 장소에 저장해야 합니다. 브라우저의 쿠키는 Secure 속성을 사용하여 안전한 환경에서만 전송되도록 설정할 수 있습니다.

  • 토큰을 저장할 때에는 최소한의 정보만 포함시켜야 합니다. 민감한 정보는 서버 측에 저장하는 것이 안전합니다.

  • 토큰의 유효 기간을 적절하게 설정하여 짧은 기간 동안만 유효하도록 관리합니다.

profile
She can do it, He can do it, Why not me?

0개의 댓글