1. 토큰 인증 (Token Authentication)
토큰 인증은 서버가 사용자를 인증한 후, 인증 정보를 담은 "토큰"을 클라이언트에게 발급하여 클라이언트가 후속 요청에 이 토큰을 포함시켜 서버에 인증을 요청하는 방식입니다. 이 방식은 보통 **JWT (JSON Web Token)**와 같은 표준을 사용합니다.
특징
- 토큰 발급: 사용자가 로그인하면 서버는 고유한 인증 토큰을 생성하여 클라이언트에 반환합니다. 이 토큰은 사용자의 인증 정보를 암호화하거나 서명하여 포함할 수 있습니다.
- 상태 비저장 (Stateless): 서버는 클라이언트의 인증 상태를 저장하지 않습니다. 클라이언트는 인증을 위한 토큰을 매 요청마다 서버로 전달하며, 서버는 토큰을 검증하여 사용자를 인증합니다.
- 주로 헤더를 통해 전달: 클라이언트는 Authorization 헤더에 토큰을 포함시켜 요청을 보냅니다.
- 만료 시간: 토큰은 만료 시간이 설정될 수 있으며, 만료되면 클라이언트는 새 토큰을 받아야 합니다.
- 확장성: 세션 정보를 서버에 저장할 필요가 없으므로, 여러 서버나 마이크로서비스 환경에서 토큰 인증은 특히 유용합니다.
장점
- 서버에 상태를 저장하지 않음 (Stateless): 서버가 클라이언트의 세션 상태를 저장하지 않으므로, 서버 간에 세션 동기화가 필요 없습니다. 이는 분산 시스템에서 유리합니다.
- 모바일 앱 및 SPA 지원: 모바일 애플리케이션이나 싱글 페이지 애플리케이션(SPA)에서 인증을 처리하기에 적합합니다.
- 확장성: 수많은 요청을 처리할 때 서버가 상태를 관리하지 않으므로 확장성이 좋습니다.
단점
- 토큰 탈취 시 위험: 토큰이 유효한 동안 누구나 그 토큰을 사용하여 인증된 사용자로서 행동할 수 있습니다. 따라서 토큰 탈취에 대한 보안이 중요합니다.
- 토큰 만료 관리: 만료된 토큰에 대한 처리가 필요합니다. 일반적으로 Refresh Token을 사용하여 만료된 Access Token을 갱신하는 방식이 필요합니다.
사용 예시
- JWT (JSON Web Token): 인증과 권한 부여를 위해 많이 사용됩니다.
- OAuth: 소셜 로그인이나 외부 API 인증에서 널리 사용됩니다.
2. 세션 인증 (Session Authentication)
세션 인증은 사용자가 로그인할 때 서버에서 세션을 생성하고, 이 세션의 ID를 클라이언트에 전달하여 후속 요청에서 이 세션 ID를 사용해 인증을 처리하는 방식입니다.
특징
- 세션 생성: 사용자가 로그인하면 서버는 세션을 생성하고, 세션 ID를 쿠키에 저장하여 클라이언트에 전달합니다. 클라이언트는 이 세션 ID를 포함시켜 매 요청을 보냅니다.
- 상태 저장 (Stateful): 서버는 사용자가 로그인한 상태를 세션에 저장합니다. 즉, 서버가 클라이언트의 세션 정보를 관리합니다.
- 세션 ID 관리: 클라이언트는 서버로부터 전달받은 세션 ID를 요청 헤더의 쿠키에 포함시켜 요청을 보냅니다.
- 세션 만료: 세션은 서버에서 관리되며, 일정 시간이 지나면 만료됩니다. 클라이언트는 세션 만료 후 다시 로그인을 해야 합니다.
장점
- 보안성: 세션 인증은 주로 서버에서 세션 정보를 관리하므로, 토큰 탈취 문제를 어느 정도 방지할 수 있습니다. 세션 정보는 서버에 저장되고, 클라이언트에게는 세션 ID만 전달됩니다.
- 간단한 관리: 인증 정보를 서버에서 관리하기 때문에, 토큰 방식보다 관리가 간단할 수 있습니다. 예를 들어, 로그아웃 시 서버에서 세션을 삭제하기만 하면 됩니다.
단점
- 서버 상태 유지 (Stateful): 서버는 세션 정보를 저장하고 관리해야 하므로, 서버의 메모리 사용량이 늘어나고, 서버 간 세션 동기화가 필요할 수 있습니다.
- 확장성 문제: 여러 서버를 사용하는 경우, 각 서버 간에 세션 정보를 공유하거나 동기화하는 데 추가적인 작업이 필요할 수 있습니다.
- 세션 하이재킹: 세션 ID가 탈취되면, 해당 세션을 통해 인증된 사용자의 권한을 가질 수 있습니다.
사용 예시
- 웹 애플리케이션: 전통적인 웹 애플리케이션에서 주로 사용됩니다.
- 로그인 시스템: 서버가 상태를 유지하며 세션 정보를 관리하는 시스템.