토큰의 개요
- 토큰은 사용자가 로그인할 때 생성되는 고유한 문자열입니다.
- 이 토큰은 UUID 형식일 수도 있고, JSON Web Token (JWT) 형식일 수도 있습니다.
- 사용자는 로그인 후 이 토큰을 받아서, 이후의 모든 요청에 이 토큰을 포함시켜야 합니다.
- 서버는 토큰을 검증하고, 유효한 토큰일 경우 보호된 리소스를 반환합니다.
토큰의 생성 및 사용 과정
- 로그인 요청:
- 클라이언트가 /user/login 엔드포인트로 사용자 이름과 비밀번호를 포함한 요청을 보냅니다.
- 예시: POST /user/login (body에 username과 password 포함)
- 토큰 생성 및 반환:
- 인증 서버 또는 애플리케이션이 사용자의 자격증명을 확인하고, 유효하면 고유한 토큰을 생성합니다.
- 생성된 토큰은 클라이언트에게 반환됩니다.
- 예시: 0a099aae-273a-11eb-adc1-0242ac120002
- 토큰 저장 및 사용:
- 클라이언트는 받은 토큰을 저장합니다 (예: 로컬 스토리지, 세션 스토리지).
- 이후 보호된 리소스에 접근할 때마다 이 토큰을 포함하여 요청을 보냅니다.
- 예시: GET /user/myAccount (Authorization 헤더에 토큰 포함)
- 토큰 검증 및 리소스 반환:
- 서버는 요청에 포함된 토큰을 검증합니다.
- 토큰이 유효하면, 요청된 리소스를 반환합니다.
- 예시: Token is Valid. Here are the account details
서버 측 처리
- 토큰 생성:
- 로그인 시 인증 서버는 토큰을 생성하고 클라이언트에게 반환합니다.
- 동시에 이 토큰과 관련된 사용자 세부 정보를 메모리나 데이터베이스에 저장합니다.
- 토큰 검증:
- 클라이언트가 요청을 보낼 때마다, 서버는 해당 토큰을 검증합니다.
- 토큰이 유효하면 보호된 리소스를 반환합니다.
흐름도 설명
- 클라이언트와 인증 서버 간의 통신:
- 클라이언트가 로그인 요청을 보냅니다.
- 인증 서버는 사용자 자격 증명을 확인한 후, 고유한 토큰을 생성하여 클라이언트에게 반환합니다.
- 클라이언트의 요청 처리:
- 클라이언트는 받은 토큰을 저장하고, 이후의 모든 요청에 이 토큰을 포함시켜 보냅니다.
- 서버는 토큰을 검증하여 유효성을 확인하고, 유효한 경우 요청된 리소스를 반환합니다.
- 토큰의 중요성:
- 토큰은 사용자가 로그인 상태임을 증명하는 데 사용됩니다.
- 클라이언트가 토큰을 포함하여 요청할 때마다, 서버는 이 토큰을 검증하여 사용자의 유효성을 확인합니다.
- 이를 통해 사용자 자격 증명을 반복적으로 입력하지 않아도 되며, 서버는 클라이언트의 상태를 유지할 수 있습니다
토큰의 장점 및 사용 이유
1. 자격 증명 공유 방지
- 보안 강화: 매 요청마다 자격 증명을 전송하는 것은 보안 위험이 큽니다. 토큰을 사용하면 한 번의 인증으로 토큰을 발급받아 이후 요청에서 자격 증명을 공유할 필요가 없습니다.
2. 토큰 무효화
- 안전성: 의심스러운 활동이 감지되면 사용자 자격 증명을 무효화하지 않고도 토큰을 무효화할 수 있습니다. 이는 사용자 경험을 개선하면서도 보안을 유지할 수 있는 방법입니다.
3. 짧은 수명 토큰
- 보안 및 유연성: 토큰은 짧은 수명으로 생성할 수 있습니다. 이는 만료된 토큰이 재사용되는 것을 방지하여 보안을 강화합니다.
4. 사용자 정보 저장
- 역할 및 권한 저장: 토큰에 사용자 관련 정보(예: 역할, 권한 등)를 저장할 수 있습니다. 이는 요청 시마다 사용자 정보를 불러올 필요 없이 토큰 자체로 인증 및 권한 부여를 처리할 수 있게 합니다.
5. 재사용성
- 다중 서버 환경: 여러 서버에서 동일한 토큰을 사용하여 사용자를 인증할 수 있습니다. 이는 멀티플랫폼 및 도메인에서 동일한 인증 시스템을 재사용할 수 있게 합니다.
6. 상태 비저장 및 확장 용이성
- 확장성: 토큰은 상태를 저장하지 않기 때문에 서버 간 세션 상태를 동기화할 필요가 없습니다. 로드 밸런서를 사용하여 사용자를 특정 서버에 고정하지 않고 여러 서버로 분산할 수 있습니다.
- 세션 상태 제거: 토큰은 사용자를 식별하는 데 필요한 모든 정보를 포함하고 있어 세션 상태의 필요성을 제거합니다.
이미 사용 중인 토큰
- CSRF 토큰: CSRF 공격으로부터 애플리케이션을 보호합니다.
- JSESSIONID: Spring Security가 기본적으로 생성하는 토큰으로, 백엔드에 매번 자격 증명을 전달하지 않도록 도와줍니다.
결론
토큰 기반 인증은 세션 기반 인증의 한계를 보완하며, 특히 분산 시스템이나 마이크로서비스 아키텍처에서 유용합니다. JWT와 같은 토큰을 사용하면, 서버 간의 인증 정보 공유와 확장성이 향상되며, 보안성이 강화됩니다.