Understanding Token Security Measures
Access Token, Refresh Token
Mar 08, 2024
What is A Token?
- 토큰은 사용자의 신원을 확인하거나(Authentication) 사용자에게 작업을 수행하도록 권한을 부여할 수 있도록(Authorization) 하게 위한 정보를 담고 있는 데이터 조각.
- 일반적인 identify 프레임워크와 프로토콜은 토큰 기반 전략을 사용하여 어플리케이션과 리소스에 대한 액세스를 보호한다.
- OpenID Connect(OIDC) 권한 부여 및 인증 메커니즘을 활용하는 신원 프로토콜. 신원 인증 프로토콜이며 신뢰 당사자라고도 하는 클라이언트 서비스에 대한 사용자의 신원을 확인하는데 사용됨. 요청 시 이름, 이메일 주소 등과 같은 사용자의 클레임도 공유할 수 있음. ID 토큰을 사용함.
Token Types
ID token?
- 클라이언트 애플리케이션이 사용자의 ID를 사용하는데 사용할 수 있는 아티팩트. ID 토큰에는 사용자의 이름, 이메일, 프로필 사진에 대한 정보가 포함될 수 있어 사용자의 프로필을 구축하여 사용자 경험을 개인화 할 수 있다.
- OIDC 프로토콜을 준수하는 인증 서버는 사용자가 로그인할때마다 클라이언트에 ID 토큰을 발급한다. 아이디 토큰의 소비자는 주로 SPA 및 모바일 앱과 같은 애플리케이션이다.
Access token?
- 사용자가 로그인하면 권한 부여 서버는 클라이언트 애플리케이션이 API 서버를 안전하게 호출하는 데 사용할 수 있는 액세스 토큰을 발급한다. 클라이언트 애플리케이션이 서버의 보호된 리소스에 액세스해야 하는 경우, 액세스 토큰을 통해 클라이언트는 특정 작업을 수행하거나 특정 리소스에 액세스 할 수 있도록 사용자로부터 권한을 받았다는 신호를 서버에 보낼 수 있음.
- JWT(JSON 웹 토큰) 표준을 따름 → OAuth 2.0
- 액세스 토큰은 무기명 토큰이므로 토큰을 소유한 사람만 토큰을 사용할 수 있음
- 악의적인 사용자가 토큰을 탈취해서 사용할 수 있는 단점이 있음. → 보완방법으로 토큰의 수명을 짧게 만들어서 시간 또는 일 단위의 짧은 시간동안 유효하게 만듦.
- 새 액세스 토큰을 얻기 위해서 사용자가 다시 로그인하거나 리프레시 토큰을 이용해 액세스 토큰을 새 토큰으로 교체할 수 있다
Refresh Token?
- 보안 목적으로 짧은 수명을 갖고 있는 액세스 토큰이 만료되면 클라이언트 어플리케이션이 리프레시 토큰을 사용해 액세스 토큰을 새로 고칠 수 있다. 이로 인해 클라이언트는 새로 로그인을 하지 않아도 새 액세스 토큰을 얻을 수 있다.
- 리프레시 토큰이 만료되기 전까지 새로운 액세스 토큰을 받을 수 있다.
- 긴 수명을 가지고 있는 리프레시 토큰은 언제든지 새로운 액세스 토큰을 받을 수 있다.
- 리프레시 토큰도 무기명 토큰이다.
- 마찬가지로 악의적인 사용자가 토큰을 탈취해서 새 액세스 토큰을 얻을 수 있다.
Keeping Refresh Tokens Secure
Refresh Token Rotation
- 애플리케이션이 새 액세스 토큰을 얻기 위해 새로 고침 토큰을 교환할 때마다 새 리프레시 토큰도 반환되도록 보장한다. → 리프레시 토큰이 지속적으로 교환되고 무효화되므로 불법 액세스의 위협이 줄어든다.
Refresh Token Automatic Reuse Detection
- 리프레시 토큰은 무기명 토큰*이므로 새로운 액세스 토큰 요청을 받을때 누가 합법적인지 악의적인지 알 수 없어서 모든 사용자를 잠재적으로 악의적인 사용자로 취급한다.
* 무기명 토큰: 무기명 토큰은 사용자의 식별 정보를 직접적으로 포함하지 않지만, 인증 서버는 토큰과 클라이언트의 관련 정보를 관리하여 클라이언트를 추적하고 식별할 수 있기 때문에 토큰의 소유자를 알 수 있다. - 자동 재사용 감지는 토큰 교체 전략의 핵심. 이전에 받은 리프레시 토큰을 무효화했음. 그러나 인증서버는 합법적인 사용자가 최신 리프레시 토큰을 보유하고 있는지 알 수 없으므로 안전을 위해 모든 토큰을 무효화시킴
- 정상적인 사용자(리프레시 토큰1, 액세스 토큰1)
- 악의적인 사용자가 정상적인 사용자의 리프레시 토큰 1 훔침
- 정상 사용자가 리프레시 토큰 1을 사용하여 새로운 리프레시-액세스 토큰 쌍을 얻음
- 인증서버가 리프레시 토큰 2와 액세스 토큰 2를 정상 사용자에게 반환
- 악의적인 사용자가 탈취한 리프레시 토큰1을 사용하여 새 액세스 토큰을 얻으려고함
- —재사용 감지 기능—
- 인증 서버는 리프레시 토큰에서 내려오는 모든 리프레시 토큰을 추적하여 ‘토큰 제품군’을 만들었음
- 인증서버는 리프레시 토큰 1이 재사용되는 것을 인식하고 리프레시 토큰 2를 포함하여 모든 리프레시 토큰 제품을 즉시 무효화시킴
- 인증서버는 악의적인 사용자에게 액세스 거부 응답을 반환
- 액세스 토큰 2가 만료되고 정상사용자가 리프레시 토큰 2를 사용하여 새 리프레시 토큰 쌍을 요청하려고 시도
- 인증서버는 정상 사용자에게 액세스 거부 응답 반환
- 새 액세스 및 리프레시 토큰을 받으려면 인증 서버에서 재인증 필요함
(공부하다 궁금한 부분 ChatGPT한테 물어봄..)
Q. 보안을 강화하기 위해서는 어떤 방법이 있어?
- 토큰의 유효 기간 제한: 토큰의 유효 기간을 짧게 설정하여 토큰이 더 오랜 시간 동안 유효하지 않도록 합니다. 이렇게 하면 토큰이 탈취된 경우에도 악의적인 사용자가 제한된 시간 동안만 토큰을 사용할 수 있습니다.
- 토큰의 보안 강화: 토큰을 안전하게 저장하고 전송하는 방법을 사용하여 토큰이 노출되거나 탈취되는 것을 방지합니다. HTTPS와 같은 보안 프로토콜을 사용하여 통신을 암호화하고, 안전한 저장소에 토큰을 저장합니다.
- 토큰의 리프레시 및 재발급: 클라이언트는 주기적으로 새로운 토큰을 요청하고 사용하여 기존 토큰을 갱신할 수 있습니다. 이를 통해 토큰이 탈취되었을 때 빠르게 토큰을 갱신하여 보안을 강화할 수 있습니다.
- 다단계 인증: 다단계 인증 방법을 사용하여 토큰을 요청하고 사용할 때 추가적인 인증 단계를 거치도록 합니다. 이는 토큰을 사용하는 사용자의 신원을 더욱 확실하게 확인할 수 있도록 도와줍니다.
Q. 토큰이 탈취되었다는 것을 어떻게 감지해?
- 비정상적인 액세스 패턴 감지: 시스템은 특정 사용자가 예상치 않은 시간에 또는 예상치 않은 위치에서 액세스를 시도할 때 경고를 발생시킬 수 있습니다. 이는 사용자의 토큰이 다른 장치나 지역에서 사용되는 것을 감지할 수 있습니다.
- 로그 및 감사 기록 분석: 시스템은 토큰을 사용하여 발생한 모든 액세스 이벤트를 로그로 기록합니다. 이를 통해 시스템 운영자는 특정 토큰의 액세스 기록을 분석하여 비정상적인 활동을 식별할 수 있습니다.
- 사용자 보고: 사용자가 자신의 토큰이나 계정에 대한 이상한 활동을 발견하면, 그것을 시스템 관리자나 보안 담당자에게 보고할 수 있습니다.
- 알림 및 경고 시스템: 시스템은 특정 이벤트 또는 패턴에 대해 경고를 발생시키는 알림 시스템을 구축할 수 있습니다. 예를 들어, 토큰의 유효 기간이 지나거나, 여러 잘못된 인증 시도가 있을 때 알림을 전송할 수 있습니다.
- 다중 요인 인증 (MFA): 다중 요인 인증은 사용자가 로그인할 때 추가적인 인증 단계를 거치도록 합니다. 이를 통해 탈취된 토큰만으로는 액세스를 허용할 수 없게 되며, 추가적인 인증 단계가 필요합니다.
출처:
What Are Refresh Tokens and How to Use Them Securely | auth0 blog
Go toor?