1. 세션 기반 인증과 토큰 기반 인증의 차이에 대해 설명해주세요.
세션 기반 인증과 토큰 기반 인증은 모두 사용자 인증을 위한 메커니즘이지만, 각각의 동작 방식과 특징이 다릅니다.
다음은 두 인증 방식의 주요 차이점입니다:
- 세션 기반 인증 (Session-Based Authentication)
-
작동 방식:
- 사용자가 로그인하면 서버는 사용자의 세션을 생성하고, 세션 ID를 브라우저의 쿠키에 저장합니다.
- 이후 요청마다 쿠키에 저장된 세션 ID를 서버로 전송하여 사용자를 인증합니다.
-
서버 상태:
- 서버는 각 사용자의 세션 정보를 저장하고 관리해야 합니다. 이를 통해 서버는 상태를 유지(stateful)합니다.
- 세션 정보는 보통 서버의 메모리나 데이터베이스에 저장됩니다.
-
확장성:
- 많은 사용자가 접속할 경우 서버가 모든 세션을 관리해야 하므로 확장성이 떨어질 수 있습니다.
- 세션 데이터가 증가하면 서버의 리소스 사용량이 늘어납니다.
-
보안:
- 세션 ID가 탈취되면 공격자가 이를 통해 사용자로 가장할 수 있습니다.
- 쿠키의 보안 설정(예: HttpOnly, Secure)이 중요합니다.
- 토큰 기반 인증 (Token-Based Authentication)
-
작동 방식:
- 사용자가 로그인하면 서버는 사용자를 인증하고, JWT(JSON Web Token)와 같은 토큰을 생성하여 클라이언트에 전달합니다.
- 이후 요청마다 클라이언트는 이 토큰을 HTTP 헤더에 포함하여 서버로 전송합니다.
-
서버 상태:
- 서버는 사용자의 상태를 저장하지 않으며(stateless), 각 요청은 자체적으로 인증 정보를 포함합니다.
- 서버는 단지 토큰을 검증하여 사용자를 인증합니다.
-
확장성:
- 서버가 상태를 저장하지 않기 때문에 확장성이 좋습니다.
- 여러 서버에 걸쳐 부하 분산이 용이합니다.
-
보안:
- 토큰은 자체적으로 서명되어 있어 변조가 어렵습니다.
- 토큰은 만료 시간을 포함할 수 있어 보안성을 높일 수 있습니다.
- 토큰이 탈취되면 일정 기간 동안 악용될 수 있지만, 만료 시간이 지나면 무효화됩니다.
요약
- 세션 기반 인증은 서버가 상태를 유지해야 하며, 확장성이 떨어질 수 있지만 간단한 구현이 가능합니다.
- 토큰 기반 인증은 서버가 상태를 유지하지 않으며, 확장성이 뛰어나지만, 토큰의 관리와 보안에 더 많은 신경을 써야 합니다.
2. JWT, Refresh, Access Token에 대해서 설명해주세요.
JWT, Refresh Token, 그리고 Access Token은 현대적인 웹 애플리케이션에서 사용자 인증 및 권한 부여를 위해 자주 사용되는 개념입니다.
- JWT (JSON Web Token)
-
정의:
- JWT는 JSON 객체를 안전하게 전송하기 위한 개방형 표준(RFC 7519)입니다.
- 주로 사용자 인증 및 정보 교환에 사용됩니다.
-
구조:
- JWT는 세 부분으로 구성됩니다: 헤더(Header), 페이로드(Payload), 서명(Signature).
- 헤더: 토큰 유형(JWT)과 서명 알고리즘(예: HMAC SHA256)을 지정합니다.
- 페이로드: 사용자 정보(클레임)를 포함합니다. 클레임에는 등록된 클레임(iss, exp 등), 공개 클레임, 비공개 클레임이 있습니다.
- 서명: 헤더와 페이로드를 인코딩한 후 비밀 키로 서명하여 토큰의 무결성을 보장합니다.
-
특징:
- 자체 포함(self-contained)되어, 필요한 모든 정보를 포함합니다.
- 토큰은 서버 상태를 유지하지 않고도 유효성을 검증할 수 있어 확장성이 좋습니다.
- Access Token
-
정의:
- Access Token은 클라이언트가 API에 액세스할 때 사용자의 인증을 나타내는 짧은 수명의 토큰입니다.
- 주로 사용자 리소스에 대한 권한 부여를 관리합니다.
-
특징:
- 보통 JWT 형식으로 발급되며, 만료 시간(exp) 설정이 필수적입니다.
- 클라이언트는 Access Token을 HTTP 헤더에 포함시켜 서버에 요청을 보냅니다.
- 만료 시간이 짧아 보안성이 높습니다. 유출되더라도 짧은 시간 동안만 악용될 수 있습니다.
- Refresh Token
-
정의:
- Refresh Token은 Access Token이 만료되었을 때 새로운 Access Token을 발급받기 위해 사용되는 장기 수명의 토큰입니다.
-
특징:
- 일반적으로 서버에서만 저장 및 관리됩니다.
- Access Token과 달리 만료 시간이 길고, 재발급 요청 시 사용됩니다.
- 보안상의 이유로 클라이언트에서 보관할 때는 주의가 필요합니다.
- 작동 방식
- 로그인:
- 사용자가 로그인하면 서버는 Access Token과 Refresh Token을 생성하여 클라이언트에 전달합니다.
- API 요청:
- 클라이언트는 Access Token을 사용하여 서버에 API 요청을 보냅니다.
- 서버는 Access Token을 검증하여 요청을 처리합니다.
- 토큰 갱신:
- Access Token이 만료되면 클라이언트는 Refresh Token을 사용하여 새로운 Access Token을 서버에 요청합니다.
- 서버는 Refresh Token을 검증한 후 새로운 Access Token을 발급합니다.
요약
- JWT: JSON 형식의 자체 포함된 토큰으로, 사용자 정보와 서명을 포함합니다.
- Access Token: 짧은 수명의 JWT로, API 요청 시 사용되며 보안성을 높이기 위해 만료 시간이 짧습니다.
- Refresh Token: 장기 수명의 토큰으로, Access Token이 만료될 때 새로운 Access Token을 발급받기 위해 사용됩니다.