एक्सेस टोकन क्यों समाप्त होते हैं?


209

मैं अभी Google API और OAuth2 के साथ काम करना शुरू कर रहा हूं। जब क्लाइंट मेरे ऐप को अधिकृत करता है तो मुझे "रिफ्रेश टोकन" और एक अल्पकालिक "एक्सेस टोकन" दिया जाता है। अब हर बार जब टोकन समाप्त हो जाता है, तो मैं Google को अपना ताज़ा टोकन पोस्ट कर सकता हूं और वे मुझे एक नया एक्सेस टोकन देंगे।

मेरा प्रश्न यह है कि टोकन एक्सपायरिंग का उद्देश्य क्या है? रिफ्रेश टोकन के बजाय लंबे समय तक चलने वाला टोकन क्यों नहीं हो सकता है?

इसके अलावा, क्या ताज़ा टोकन समाप्त हो जाता है?

Google OAuth2 वर्कफ़्लो के बारे में अधिक जानकारी के लिए Google API तक पहुंचने के लिए OAuth 2.0 का उपयोग करना देखें ।

जवाबों:


226

यह बहुत अधिक कार्यान्वयन विशिष्ट है, लेकिन सामान्य विचार यह है कि प्रदाताओं को लंबी अवधि के ताज़ा टोकन के साथ शॉर्ट टर्म एक्सेस टोकन जारी करने की अनुमति दी जाती है। क्यों?

  • कई प्रदाता वाहक टोकन का समर्थन करते हैं जो बहुत कमजोर सुरक्षा-वार होते हैं। उन्हें अल्पकालिक बनाने और ताज़ा करने की आवश्यकता होने पर, वे उस समय को सीमित कर देते हैं जब कोई हमलावर चोरी के टोकन का दुरुपयोग कर सकता है।
  • बड़े पैमाने पर तैनाती हर एपीआई कॉल को डेटाबेस लुकअप करने के लिए नहीं करना चाहते हैं, इसलिए इसके बजाय वे स्वयं-एन्कोडेड टोकन जारी करते हैं जिसे डिक्रिप्शन द्वारा सत्यापित किया जा सकता है। हालांकि, इसका मतलब यह भी है कि इन टोकन को रद्द करने का कोई तरीका नहीं है, इसलिए उन्हें थोड़े समय के लिए जारी किया जाता है और उन्हें ताज़ा किया जाना चाहिए।
  • ताज़ा टोकन को क्लाइंट प्रमाणीकरण की आवश्यकता होती है जो इसे मजबूत बनाता है। उपरोक्त पहुंच टोकन के विपरीत, यह आमतौर पर डेटाबेस लुकअप के साथ लागू किया जाता है।

4
दो प्रश्न: 1) मोबाइल ऐप्स के मामले में, क्या क्लाइंट प्रमाणीकरण की आवश्यकता इसे और मजबूत बनाती है? क्योंकि client_secret एप्लिकेशन स्रोत कोड का हिस्सा है, इसलिए यह बिल्कुल गुप्त नहीं है। यह मानते हुए कि एक्सेस टोकन केवल TLS के माध्यम से भी साझा किया जाता है (और आपका पहला बुलेट पॉइंट लागू नहीं होता है) क्या कोई अतिरिक्त सुरक्षा है? 2) यह मानते हुए कि यह सब हमारे परिदृश्य में है (केवल टीएलएस, कोई स्व-एन्कोडेड अपरिवर्तनीय टोकन), क्या एक्सेस टोकन जारी करना ठीक है जो समाप्त नहीं होता है?
थिलो

4
एक बियर टोकन क्या है, और इसे ताज़ा और पहुंच टोकन के साथ क्या करना है?
allyourcode

7
@ थिलो मुझे लगता है कि यह विचार है कि पहुंच टोकन की जरूरत नहीं है। जैसा कि एरन बताते हैं, यह अनुरोधित सेवा के लिए यह तय करना संभव बनाता है कि किसी डेटाबेस में एक्सेस टोकन देखने के लिए <em> बिना किसी अनुरोध <em> को सेवा प्रदान करना है या नहीं। AFAICT, जो ताज़ा टोकन और पहुँच टोकन को अलग करने का वास्तविक लाभ है।
allyourcode

5
एक पहुँच (वाहक) टोकन अल्पकालिक कैसे है? यदि मैं समय सीमा समाप्त टोकन के साथ एक अनुरोध करता हूं, तो ताज़ा टोकन एक ताज़ा बियर टोकन लौटाएगा। इसी तरह, अगर मैं किसी के टोकन को उनकी कुकीज से चुराता हूं, और उस टोकन के साथ अपनी खुद की कुकी को खराब करता हूं, तो मैं इसे सर्वर पर भेज देता हूं, यह ताज़ा हो जाएगा और मुझे एक नया भेज देगा। उसे रोकने के लिए क्या है? IP पता या यहां तक ​​कि MAC मत कहो, क्योंकि यह अनुचित है।
सुमेरे

3
@Samamere, कि पहले से ही समझाया गया था। बियरर टोकन को एक क्रिप्टो प्रक्रिया द्वारा मान्य किया जाता है जो प्रमाणीकरण डेटाबेस को स्पर्श नहीं करता है, जिससे वे लगातार संसाधन एक्सेस के लिए बहुत अधिक कुशल हो जाते हैं। ताज़ा टोकन एक ऐसी प्रक्रिया में मान्य हैं जिसमें यह सुनिश्चित करने के लिए डेटाबेस की जाँच करना शामिल है कि यह अभी भी वैध है। अब सोचिए कि जीमेल कैसे काम करता है। यदि कोई अप्रत्याशित भौगोलिक स्थान से आपके खाते में लॉग इन करता है तो आप अलर्ट प्राप्त कर सकते हैं। आप उन सभी स्थानों को देख सकते हैं जिनमें वर्तमान में मान्य ताज़ा टोकन हो सकते हैं। आप सभी स्थानों से लॉग आउट कर सकते हैं, उन सभी अन्य ताज़ा टोकन को अमान्य कर सकते हैं।
बॉन

33

परिदृश्यों के एक जोड़े को एक oauth2 (या किसी अन्य वस्तु) प्रणाली को डिजाइन करने में टोकन और इंजीनियरिंग ट्रेड-ऑफ का उपयोग करने और ताज़ा करने के उद्देश्य को समझाने में मदद मिल सकती है:

वेब ऐप परिदृश्य

वेब ऐप परिदृश्य में आपके पास कुछ विकल्प हैं:

  1. यदि आपके पास अपना सत्र प्रबंधन है, तो अपने सत्र राज्य सेवा पर सत्र राज्य में अपनी सत्र आईडी के खिलाफ access_token और refresh_token दोनों को संग्रहीत करें। जब उपयोगकर्ता द्वारा एक पृष्ठ का अनुरोध किया जाता है जिसके लिए आपको संसाधन का उपयोग करने की आवश्यकता होती है तो access_token का उपयोग करें और यदि access_token की समय सीमा समाप्त हो गई है तो नए का उपयोग करने के लिए ताज़ा करें_token का उपयोग करें।

आइए कल्पना करें कि कोई व्यक्ति आपके सत्र को हाइजैक करने का प्रबंधन करता है। केवल एक चीज जो संभव है वह है आपके पृष्ठों का अनुरोध करना।

  1. यदि आपके पास सत्र प्रबंधन नहीं है, तो access_token को कुकी में रखें और सत्र के रूप में उपयोग करें। फिर, जब भी उपयोगकर्ता आपके वेब सर्वर से पेजों का अनुरोध करता है, तो access_token भेजें। यदि आवश्यक हो तो आपका ऐप सर्वर access_token को ताज़ा कर सकता है।

1 और 2 की तुलना:

1 में, access_token और refresh_token केवल ऑथराइजेशन सर्वर (आपके मामले में google) और आपके ऐप सर्वर के बीच के तार पर यात्रा करते हैं। यह एक सुरक्षित चैनल पर किया जाएगा। एक हैकर सत्र को हाईजैक कर सकता है लेकिन वे केवल आपके वेब ऐप के साथ बातचीत कर पाएंगे। 2 में, हैकर access_token को दूर ले जा सकता है और उन संसाधनों के लिए अपने स्वयं के अनुरोध बना सकता है जिन्हें उपयोगकर्ता ने एक्सेस की अनुमति दी है। यहां तक ​​कि अगर हैकर को access_token की पकड़ मिलती है, तो उनके पास केवल एक छोटी विंडो होगी जिसमें वे संसाधनों तक पहुंच सकते हैं।

किसी भी तरह रिफ्रेश_टोकन और क्लायंटिड / सीक्रेट केवल सर्वर के लिए ज्ञात होते हैं, जिससे वेब ब्राउज़र से दीर्घकालिक पहुंच प्राप्त करना असंभव हो जाता है।

आइए कल्पना करें कि आप oauth2 को लागू कर रहे हैं और एक्सेस टोकन पर एक लंबा समय निर्धारित करते हैं:

1) ऐप सर्वर में छिपे होने के बाद से छोटी और लंबी एक्सेस टोकन के बीच यहां बहुत अंतर नहीं है। 2 में) किसी को ब्राउज़र में access_token मिल सकता है और फिर इसका उपयोग सीधे उपयोगकर्ता के संसाधनों को लंबे समय तक करने के लिए कर सकता है।

मोबाइल परिदृश्य

मोबाइल पर, कुछ ऐसे परिदृश्य हैं जिनके बारे में मुझे पता है:

  1. डिवाइस पर स्टोरिड / सीक्रेट स्टोर करें और उपयोगकर्ता के संसाधनों तक पहुंच प्राप्त करने के लिए डिवाइस ऑर्केस्ट्रेट प्राप्त करें।

  2. क्लाइंट / गुप्त रखने के लिए बैकएंड ऐप सर्वर का उपयोग करें और यह ऑर्केस्ट्रेशन करें। एक प्रकार की सत्र कुंजी के रूप में access_token का उपयोग करें और क्लाइंट और ऐप सर्वर के बीच इसे पास करें।

1 और 2 की तुलना करना

1 में) एक बार जब आपके पास डिवाइस पर ग्राहक / गुप्त होते हैं तो वे किसी भी अधिक गुप्त नहीं होते हैं। कोई भी विघटित हो सकता है और फिर अभिनय शुरू कर सकता है जैसे कि वे आप हैं, बेशक उपयोगकर्ता की अनुमति के साथ। Access_token और refresh_token भी मेमोरी में हैं और एक समझौता किए गए डिवाइस पर एक्सेस किया जा सकता है, जिसका अर्थ है कि कोई व्यक्ति आपके क्रेडेंशियल्स दिए बिना उपयोगकर्ता के रूप में आपके ऐप के रूप में कार्य कर सकता है। इस परिदृश्य में access_token की लंबाई को hackability से कोई फर्क नहीं पड़ता है क्योंकि ताज़ा_token access_token के समान स्थान पर है। 2 में) ग्राहक / गुप्त और न ही ताज़ा टोकन समझौता किया जाता है। यहां access_token expiry की लंबाई निर्धारित करती है कि कोई हैकर उपयोगकर्ताओं के संसाधनों को कितने समय तक एक्सेस कर सकता है, तो क्या उन्हें इसे पकड़ना चाहिए।

एक्सपायरी लंबाई

यहां यह निर्भर करता है कि आप अपने सिस्टम के साथ क्या हासिल कर रहे हैं, जब तक आपका access_token एक्सपायरी होना चाहिए। यदि यह उपयोगकर्ता के लिए विशेष रूप से मूल्यवान कुछ है तो यह छोटा होना चाहिए। कुछ कम मूल्यवान, यह अधिक लंबा हो सकता है।

Google जैसे कुछ लोग रिफ्रेश_टोकन को समाप्त नहीं करते हैं। कुछ स्टैकफ्लो करते हैं। समाप्ति पर निर्णय उपयोगकर्ता आसानी और सुरक्षा के बीच एक व्यापार बंद है। रिफ्रेश टोकन की लंबाई उपयोगकर्ता के रिटर्न की लंबाई से संबंधित होती है, यानी रिफ्रेश को सेट करें कि उपयोगकर्ता आपके ऐप पर कितनी बार लौटता है। यदि ताज़ा टोकन केवल उसी तरीके से समाप्त नहीं होता है जब वे निरस्त किए जाते हैं, तो एक स्पष्ट निरसन के साथ होता है। आम तौर पर, लॉग ऑन नहीं होता।

आशा है कि बल्कि लंबाई पोस्ट उपयोगी है।


अगर आप अपने सर्वर में क्लाइंट आईडी स्टोर करते हैं तो मोबाइल स्क्रीन के बारे में यह खतरनाक बात है। इसलिए कोई भी अन्य ऐप आपके सर्वर पर केवल अनुरोध भेज सकता है और उपयोगकर्ताओं के संसाधनों को आपके सर्वर पर पहुंच सकता है, इसलिए इसका वही
अमीर बार

सच है, लेकिन फिर उन्हें केवल आपके द्वारा प्रदान की गई सुविधाओं तक पहुंच है, बजाय अंतर्निहित टोकन तक पूर्ण पहुंच के। यानी वे आपके ऐप का उपयोग कर सकते हैं। अक्सर, टोकन में व्यापक अनुमति हो सकती है, जबकि आपको केवल एक सबसेट की आवश्यकता होती है। बैकएंड में टोकन पर पकड़ आगे प्रतिबंध प्रदान करता है, क्या आपको इसकी आवश्यकता होनी चाहिए।
एड साइक्स

11

अन्य प्रतिक्रियाओं के अलावा:

एक बार प्राप्त करने के बाद, एक्सेस टोकन आमतौर पर ग्राहकों से हर अनुरोध के साथ संरक्षित संसाधन सर्वर पर भेजे जाते हैं। यह टोकन चोरी और रीप्ले तक पहुँचने के लिए एक जोखिम पैदा करता है (यह मानते हुए कि एक्सेस टोकन "बियरर" प्रकार के होते हैं (जैसा कि प्रारंभिक RFC6750 में परिभाषित किया गया है)।

वास्तविक जीवन में उन जोखिमों के उदाहरण:

  • रिसोर्स सर्वर आमतौर पर एप्लिकेशन सर्वर वितरित किए जाते हैं और आमतौर पर प्राधिकरण सर्वर (कम एसएसएल / टीएलएस कॉन्फ़िगरेशन, कम सख्त, आदि) की तुलना में कम सुरक्षा स्तर होते हैं। दूसरी ओर प्राधिकरण सर्वर को आमतौर पर महत्वपूर्ण सुरक्षा अवसंरचना के रूप में माना जाता है और अधिक गंभीर सख्त के अधीन होता है।

  • एक्सेस टोकन HTTP निशान, लॉग आदि में दिखाई दे सकते हैं, जो संसाधन सर्वर या क्लाइंट पर नैदानिक ​​उद्देश्यों के लिए वैध रूप से एकत्र किए जाते हैं। उन निशानों को सार्वजनिक या अर्ध-सार्वजनिक स्थानों (बग ट्रेसर, सर्विस-डेस्क, आदि) से बदला जा सकता है।

  • बैकएंड आरएस एप्लिकेशन को कम या अधिक भरोसेमंद तृतीय-पक्ष के लिए आउटसोर्स किया जा सकता है।

दूसरी ओर, रिफ्रेश टोकन आमतौर पर केवल दो बार तारों पर प्रसारित होता है, और हमेशा क्लाइंट और प्राधिकरण सर्वर के बीच होता है : एक बार जब क्लाइंट द्वारा प्राप्त किया जाता है, और एक बार जब रिफ्रेश के दौरान क्लाइंट द्वारा उपयोग किया जाता है (प्रभावी रूप से पिछले रिफ्रेशिंग "एक्सपायर" होता है। टोकन)। यह अवरोधन और पुनरावृत्ति के लिए एक बहुत ही सीमित अवसर है।

अंतिम विचार, रिफ्रेश टोकन बहुत कम सुरक्षा प्रदान करता है, यदि कोई हो, समझौता किए गए ग्राहकों के खिलाफ।


आपने कुछ हद तक इसे छुआ है, लेकिन मैं इस बात पर जोर दूंगा कि टोकन प्राप्त करने (या इसके विपरीत अनजाने में) टोकन प्राप्त करने के लिए बड़ा हमला सतह अनुप्रयोग लॉग या नापाक-से-जोड़ा संसाधन सेवाओं में है (आज एमआईटीएम हमला नहीं)। बस एक सामान्य एपीआई बैकएंड में हर जगह उपयोग किए जाने वाले टोकन तक पहुंच होती है (यदि यह HttpRequest एक्सेस ऑब्जेक्ट तक पहुंच है)। सिस्टम में केवल TWO कोड पथों में ताज़ा टोकन तक पहुँच होती है - वह जो इसे पहले स्थान पर उत्पन्न करता है, और वह जो एक नए एक्सेस टोकन के लिए इसका आदान-प्रदान करता है। यह एक महत्वपूर्ण हमले की सतह का अंतर है।
टॉम डिब्बल

9

यह अनिवार्य रूप से एक सुरक्षा उपाय है। यदि आपके ऐप से छेड़छाड़ की जाती है, तो हमलावर के पास केवल अल्पकालिक एक्सेस टोकन तक पहुंच होगी और नया जेनरेट करने का कोई तरीका नहीं होगा।

ताज़ा टोकन भी समाप्त हो जाते हैं, लेकिन वे पहुँच टोकन की तुलना में अधिक समय तक रहने वाले हैं।


45
लेकिन हमलावर भी ताज़ा टोकन के लिए उपयोग नहीं होगा? और एक नया उपयोग टोकन बनाने के लिए उपयोग कर सकते हैं?
लेवी

10
@levi, हैकर नए एक्सेस टोकन बनाने के लिए रिफ्रेश टोकन का उपयोग नहीं कर सकता क्योंकि नए एक्सेस टोकन को जेनरेट करने के लिए रिफ्रेश टोकन के साथ क्लाइंट आईडी और क्लाइंट सीक्रेट की जरूरत होती है।
स्पाइक

9
@ सही है, लेकिन क्या ऐप में क्लाइंट आईडी और सीक्रेट नहीं है?
एंडी

9
तो यह पैकेट सूँघने से कुछ सुरक्षा प्रदान करता है, जब तक कि अवरोधन केवल सामान्य डेटा अनुरोधों को पकड़ता है (चक केवल टोकन तक पहुंच जाता है)? जो थोड़ा कमजोर लगता है; ब्लैक हैट को बस तब तक थोड़ा इंतजार करना होगा जब तक कि उपयोगकर्ता एक नए एक्सेस टोकन का अनुरोध नहीं करता है और फिर वह क्लाइंट आईडी, गुप्त और ताज़ा टोकन प्राप्त करेगा।

3
यह सिर्फ मुझे यहाँ मंदबुद्धि हो सकता है, लेकिन अगर यह एसएसएल पर भेजा जाता है, तो यह सुरक्षा की एक और संभावित परत को जोड़ता नहीं है। मुझे लगता है कि मैं मान रहा हूं कि हर कोई जानता है कि एसएसएल क्या है।
डेमन ड्रेक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.