Modern uygulama güvenliği dünyasında, OAuth 2.0 ve OpenID Connect (OIDC) arasındaki ilişki kadar çok kafa karışıklığına veya kritik güvenlik açığına yol açan başka bir konu yoktur. Genellikle aynı bağlamda anılsalar da, temel olarak farklı amaçlar hizmet ederler. OAuth 2.0 bir yetkilendirme çerçevesidir, OpenID Connect ise bunun üzerine inşa edilmiş bir kimlik doğrulama katmanıdır. Bu ayrımı anlamak sadece akademik bir mesele değil; güvenli, ölçeklenebilir ve kullanıcı dostu uygulamalar oluşturmak için hayati öneme sahiptir.
Yetkilendirme Fil: OAuth 2.0
Özü itibarıyla OAuth 2.0, belirli bir sorunu çözmek için tasarlanmıştır: Üçüncü taraf bir uygulama, kullanıcının kimlik bilgilerini yönetmeden başka bir hizmetteki kullanıcının kaynaklarına nasıl erişebilir? Bunu, arabanıza bir garson anahtarı (valet key) verdiğiniz gibi düşünebilirsiniz. Anahtarınızı (kullanıcı adınızı ve şifrenizi) vermezsiniz; yalnızca kapıyı açan ve motoru çalıştıran sınırlı erişimli bir anahtar verirsiniz.
OAuth 2.0 dört ana rol tanımlar:
- Kaynak Sahibi: Verilere sahip olan kullanıcı.
- İstemci: Erişim talep eden uygulama.
- Yetkilendirme Sunucusu: Kullanıcıyı doğrulayan ve belirteçler (örneğin Google, GitHub) veren hizmet.
- Kaynak Sunucusu: Korumalı verileri barındıran hizmet.
Kullanıcı izin verdiğinde, Yetkilendirme Sunucusu bir Erişim Belirteci (Access Token) verir. Bu belirteç, İstemcinin Kaynak Sunucusuna erişim kazanmak için sunduğu bir dizgedir. Kritik nokta şudur: Erişim Belirteci hiçbir kullanıcı kimlik bilgisi içermez; yalnızca kaynaklara açılan bir anahtardır.
Kimlik Katmanı: OpenID Connect
Eğer OAuth 2.0 "erişimi" yönetiyorsa, OpenID Connect "kimliği" yönetir. OIDC, OAuth 2.0 protokolü üzerine inşa edilmiş bir kimlik katmanıdır. Yeni bir belirteç türü tanıtır: ID Token.
ID Token, kimlik doğrulama olayı hakkında (kim giriş yaptı, ne zaman ve nereden) iddialar içeren bir JSON Web Token (JWT)'dir. "Google ile Giriş Yap" veya "GitHub ile Giriş Yap" gördüğünüzde, OpenID Connect'in sahne arkasında çalıştığını görürsünüz. OIDC sağlayıcısı kullanıcıyı doğrular ve ardından İstemciye kullanıcının kimliğini onaylayan bir ID Token döndürür.
Ana Farklar Bir Bakışta
| Özellik | OAuth 2.0 | OpenID Connect |
|---|---|---|
| Amaç | Yetkilendirme (Erişim) | Kimlik Doğrulama (Kimlik) |
| Belirteç Türü | Erişim Belirteci | ID Token (JWT) |
| Kullanım Alanı | Bir kullanıcının takvimini okuma | Kullanıcı kimliğini doğrulama |
Pratik Uygulama: Yetkilendirme Kodu Akışı
Web uygulamaları için önerilen akış, PKCE (Code Exchange Proof Key) ile Yetkilendirme Kodu Akışıdır. Bu akış, yetkilendirme kodu ele geçirilse bile, istemci sırrı (veya PKCE doğrulayıcısı) olmadan saldırgan tarafından kullanılamamasını sağlar.
İstek yapısının kavramsal bir örneği şöyledir:
GET /authorize?
response_type=code&
client_id=YOUR_CLIENT_ID&
redirect_uri=https://yourapp.com/callback&
scope=openid profile email&
code_challenge=YOUR_CODE_CHALLENGE&
code_challenge_method=S256
HTTP/1.1
Bu örnekte, scope=openid parametresine dikkat edin. Bu, yetkilendirme sunucusuna yalnızca yetkilendirme değil, OIDC aracılığıyla kimlik doğrulama talep ettiğinizi bildiren bir sinyaldir. Bu kapsam olmadan, yalnızca API erişimi için bir Erişim Belirteci alırsınız, kimlik doğrulaması için bir ID Token alamazsınız.
Güvenlik İçin En İyi Uygulamalar
Bu protokolleri doğru bir şekilde uygulamak, tuzaklarla doludur. Mümkün olduğunda belirteçleri httpOnly çerezlerde saklayarak Çapraz Site Betiği (XSS) saldırılarından kaynaklı çalınmalarını önleyin. JavaScript'in okuyabileceği için, kesinlikle gerekli olmadıkça belirteçleri yerel depolamada (local storage) saklamayın. Ayrıca, ID Token'ın imzasını her zaman arka uçta doğrulayın ve belirtecin güvenilir bir sağlayıcı tarafından sizin belirli uygulamanız için verildiğinden emin olmak için iss (veren) ve aud (kitle) iddialarını doğrulayın.
Sonuç
OAuth 2.0 ve OpenID Connect, doğru şekilde anlaşıldığında ve uygulandığında uygulamanızın güvenlik durumunu önemli ölçüde artırabilecek güçlü araçlardır. Sorumlulukları ayırarak—erişim için OAuth ve kimlik için OIDC kullanarak—modern web uygulamaları için sağlam bir temel oluşturursunuz. Geliştiriciler olarak, kopyala-yapıştır kodun ötesine geçmek ve yayınladığımız ve doğruladığımız her belirtecin güvenlik etkilerini gerçekten anlamak bizim sorumluluğumuzdur.