{"id":34170,"date":"2025-11-12T06:02:17","date_gmt":"2025-11-12T03:02:17","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/go-ve-redis-ile-guvenli-ve-verimli-token-yonetimi-detayli-rehber\/"},"modified":"2025-11-12T06:02:17","modified_gmt":"2025-11-12T03:02:17","slug":"go-ve-redis-ile-guvenli-ve-verimli-token-yonetimi-detayli-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/go-ve-redis-ile-guvenli-ve-verimli-token-yonetimi-detayli-rehber\/","title":{"rendered":"Go ve Redis ile G\u00fcvenli ve Verimli Token Y\u00f6netimi: Detayl\u0131 Rehber"},"content":{"rendered":"<p><body><\/p>\n<p>Uygulamalar\u0131n\u0131zda token y\u00f6netimini Go ve Redis ikilisiyle nas\u0131l g\u00fcvenli, h\u0131zl\u0131 ve \u00f6l\u00e7eklenebilir hale getirebilece\u011finizi \u00f6\u011frenin. Bu rehberde JWT&#8217;den oturum y\u00f6netimine kadar her detay\u0131 ke\u015ffedin.<\/p>\n<p>Modern web ve mobil uygulamalar, kullan\u0131c\u0131 kimlik do\u011frulama ve yetkilendirme s\u00fcre\u00e7lerini y\u00f6netmek i\u00e7in tokenlara b\u00fcy\u00fck \u00f6l\u00e7\u00fcde ba\u011f\u0131ml\u0131d\u0131r. Ancak bu tokenlar\u0131n g\u00fcvenli ve verimli bir \u015fekilde y\u00f6netilmesi, geli\u015ftiricilerin kar\u015f\u0131la\u015ft\u0131\u011f\u0131 en kritik zorluklardan biridir. Zira yanl\u0131\u015f yap\u0131land\u0131r\u0131lm\u0131\u015f bir token y\u00f6netim sistemi, ciddi g\u00fcvenlik a\u00e7\u0131klar\u0131na yol a\u00e7abilirken, verimsiz bir sistem de kullan\u0131c\u0131 deneyimini olumsuz etkileyerek uygulaman\u0131n genel performans\u0131n\u0131 d\u00fc\u015f\u00fcrebilir. Peki, kullan\u0131c\u0131lar\u0131n\u0131z\u0131n hassas verilerini korurken ayn\u0131 zamanda ak\u0131c\u0131 bir deneyim sunmay\u0131 nas\u0131l ba\u015farabilirsiniz? \u0130\u015fte tam bu noktada Go programlama dilinin g\u00fcc\u00fc ve Redis&#8217;in e\u015fsiz h\u0131z\u0131 devreye giriyor.<\/p>\n<p>G\u00fcn\u00fcm\u00fcz\u00fcn dijital d\u00fcnyas\u0131nda, kullan\u0131c\u0131lar\u0131m\u0131z\u0131n g\u00fcvenli\u011fi en \u00f6ncelikli konudur. Kimlik do\u011frulama i\u00e7in sadece kullan\u0131c\u0131 ad\u0131 ve parola kombinasyonlar\u0131 art\u0131k yeterli de\u011fildir; \u00e7\u00fcnk\u00fc siber sald\u0131r\u0131lar s\u00fcrekli evrilmekte ve daha karma\u015f\u0131k hale gelmektedir. Bu nedenle, oturumlar\u0131 y\u00f6netmek, yetkilendirmeleri sa\u011flamak ve API eri\u015fimlerini kontrol etmek i\u00e7in tokenlar hayati bir rol oynar. Ne var ki, tokenlar\u0131n ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc y\u00f6netmek \u2013olu\u015fturmaktan do\u011frulamaya, iptal etmekten yenilemeye kadar\u2013 bir\u00e7ok a\u015famay\u0131 i\u00e7erir ve her a\u015fama kendi i\u00e7inde g\u00fcvenlik ve performans zorluklar\u0131 bar\u0131nd\u0131r\u0131r. Bu zorluklar\u0131n \u00fcstesinden gelmek i\u00e7in sa\u011flam bir altyap\u0131 gereklidir.<\/p>\n<p>Go, e\u015fzamanl\u0131l\u0131k yetenekleri ve y\u00fcksek performans\u0131yla sunucu taraf\u0131 uygulamalar i\u00e7in m\u00fckemmel bir se\u00e7imdir. \u00d6zellikle binlerce e\u015fzamanl\u0131 iste\u011fi sorunsuz bir \u015fekilde i\u015fleyebilmesi, token do\u011frulama ve olu\u015fturma gibi CPU yo\u011fun i\u015flemler i\u00e7in ideal bir ortam sunar. Di\u011fer yandan Redis, bellekte tuttu\u011fu veri yap\u0131lar\u0131 sayesinde inan\u0131lmaz h\u0131zda okuma ve yazma i\u015flemleri sunar. Bu ikili, tokenlar\u0131n h\u0131zl\u0131 bir \u015fekilde depolanmas\u0131, do\u011frulanmas\u0131, kara listeye al\u0131nmas\u0131 veya oturum verilerinin y\u00f6netilmesi gibi i\u015flemler i\u00e7in m\u00fckemmel bir sinerji yarat\u0131r ve modern uygulamalar\u0131n gerektirdi\u011fi h\u0131z\u0131 ve g\u00fcvenli\u011fi bir arada sunar.<\/p>\n<p>Bu makalede, Go ve Redis kullanarak token y\u00f6netimini ba\u015ftan sona nas\u0131l in\u015fa edece\u011finizi, kar\u015f\u0131la\u015f\u0131labilecek g\u00fcvenlik risklerini nas\u0131l minimize edece\u011finizi ve performans darbo\u011fazlar\u0131n\u0131 nas\u0131l a\u015faca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m inceleyece\u011fiz. S\u0131f\u0131rdan ba\u015flayarak, temel kavramlardan ileri d\u00fczey g\u00fcvenlik stratejilerine kadar her y\u00f6n\u00fcyle token y\u00f6netimini ele alaca\u011f\u0131z. Amac\u0131m\u0131z, uygulamalar\u0131n\u0131z i\u00e7in sa\u011flam, g\u00fcvenilir ve y\u00fcksek performansl\u0131 bir kimlik do\u011frulama altyap\u0131s\u0131 kurman\u0131za yard\u0131mc\u0131 olmakt\u0131r. Hadi ba\u015flayal\u0131m!<\/p>\n<h2>Tokenlar, Go ve Redis: \u00dc\u00e7l\u00fc Sacaya\u011f\u0131<\/h2>\n<p>Token y\u00f6netiminin derinliklerine dalmadan \u00f6nce, bu sistemin temel ta\u015flar\u0131n\u0131 olu\u015fturan kavramlar\u0131 iyi anlamak hayati \u00f6nem ta\u015f\u0131r. Bir token nedir ve neden bu kadar yayg\u0131n olarak kullan\u0131l\u0131r? Go dilini bu t\u00fcr bir senaryoda \u00f6ne \u00e7\u0131karan \u00f6zellikler nelerdir? Ve Redis, bellek i\u00e7i veri yap\u0131s\u0131 sunucusu olarak bize hangi avantajlar\u0131 sa\u011flar? Bu sorular\u0131n cevaplar\u0131, sa\u011flam bir token y\u00f6netim altyap\u0131s\u0131 kurman\u0131n ilk ad\u0131m\u0131d\u0131r.<\/p>\n<h3>Token Nedir ve Neden Kullan\u0131r\u0131z?<\/h3>\n<p>Basit\u00e7e ifade etmek gerekirse, bir token, bir kullan\u0131c\u0131n\u0131n veya bir uygulaman\u0131n kimli\u011fini do\u011frulamak ve yetkilendirmek i\u00e7in kullan\u0131lan, kriptografik olarak imzalanm\u0131\u015f veya benzersiz bir tan\u0131mlay\u0131c\u0131d\u0131r. Geleneksel oturum y\u00f6netiminde sunucu, kullan\u0131c\u0131 bilgilerini kendi taraf\u0131nda (genellikle veritaban\u0131nda) saklar ve kullan\u0131c\u0131n\u0131n taray\u0131c\u0131s\u0131na bir oturum kimli\u011fi (cookie) g\u00f6nderir. Her istekte bu oturum kimli\u011fi sunucuya iletilir ve sunucu ilgili kullan\u0131c\u0131 bilgilerini bulmak i\u00e7in depolama alan\u0131na bakar.<\/p>\n<p>Token tabanl\u0131 sistemlerde ise durum biraz farkl\u0131d\u0131r. Kullan\u0131c\u0131 ba\u015far\u0131l\u0131 bir \u015fekilde kimli\u011fini do\u011frulad\u0131ktan sonra, sunucu kullan\u0131c\u0131ya bir token verir. Bu token, genellikle kullan\u0131c\u0131n\u0131n kimli\u011fi, yetkileri ve token\u0131n ge\u00e7erlilik s\u00fcresi gibi bilgileri i\u00e7erir. Sonraki her istekte, istemci bu token\u0131 HTTP ba\u015fl\u0131\u011f\u0131nda (genellikle <code>Authorization: Bearer <token><\/code> \u015feklinde) sunucuya g\u00f6nderir. Sunucu, kendi depolama alan\u0131na bakmak yerine, do\u011frudan token\u0131 do\u011frulayarak kullan\u0131c\u0131n\u0131n kimli\u011fini ve yetkilerini anlar. Bu durum, sunucunun durumsuz (stateless) olmas\u0131n\u0131 sa\u011flar ki bu, \u00f6l\u00e7eklenebilirlik a\u00e7\u0131s\u0131ndan b\u00fcy\u00fck bir avantajd\u0131r.<\/p>\n<h4>Ba\u015fl\u0131ca Token T\u00fcrleri:<\/h4>\n<ul>\n<li><strong>Oturum Tokenlar\u0131:<\/strong> Geleneksel oturum y\u00f6netimine benzer ancak genellikle daha esnektir. Sunucuda bir e\u015fleme tablosunda (\u00f6rne\u011fin Redis&#8217;te) saklan\u0131r.<\/li>\n<li><strong>JWT (JSON Web Token):<\/strong> Kriptografik olarak imzalanm\u0131\u015f, kendi kendine yeten (self-contained) tokenlard\u0131r. Bir\u00e7ok bilgiyi i\u00e7inde bar\u0131nd\u0131rabilir ve sunucunun her istekte veritaban\u0131na sorgu yapmas\u0131n\u0131 gerektirmez.<\/li>\n<li><strong>API Anahtarlar\u0131:<\/strong> Genellikle sunucudan sunucuya ileti\u015fim veya \u00fc\u00e7\u00fcnc\u00fc taraf entegrasyonlar\u0131 i\u00e7in kullan\u0131l\u0131r.<\/li>\n<\/ul>\n<p>Tokenlar\u0131n ba\u015fl\u0131ca avantaj\u0131, sistemin \u00f6l\u00e7eklenebilirli\u011fini art\u0131rmas\u0131 ve sunucu kaynaklar\u0131n\u0131 daha verimli kullanmas\u0131d\u0131r. Ancak, do\u011fru \u015fekilde y\u00f6netilmediklerinde g\u00fcvenlik riskleri ta\u015f\u0131rlar. Bu nedenle, tokenlar\u0131n g\u00fcvenli bir \u015fekilde olu\u015fturulmas\u0131, saklanmas\u0131, do\u011frulanmas\u0131 ve gerekti\u011finde iptal edilmesi kritik \u00f6neme sahiptir.<\/p>\n<h3>Go Programlama Dili Neden Tercih Edilmeli?<\/h3>\n<p>Google taraf\u0131ndan geli\u015ftirilen Go (Golang), modern sistem programc\u0131l\u0131\u011f\u0131 i\u00e7in tasarlanm\u0131\u015f a\u00e7\u0131k kaynakl\u0131 bir programlama dilidir. Performans, e\u015fzamanl\u0131l\u0131k ve geli\u015ftirici verimlili\u011fi konular\u0131nda sundu\u011fu avantajlarla web servisleri ve API geli\u015ftirme d\u00fcnyas\u0131nda h\u0131zla pop\u00fclerlik kazanm\u0131\u015ft\u0131r. Token y\u00f6netimi gibi kritik ve performans odakl\u0131 bir alanda Go&#8217;yu tercih etmemizin ba\u015fl\u0131ca nedenleri \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong>\u00dcst\u00fcn Performans:<\/strong> Derlenmi\u015f bir dil olarak Go, y\u00fcksek performans sunar. D\u00fc\u015f\u00fck seviyeli sistem kaynaklar\u0131na eri\u015fim ve verimli bellek y\u00f6netimi, y\u00fcksek trafikli uygulamalarda token olu\u015fturma ve do\u011frulama gibi i\u015flemleri h\u0131zla ger\u00e7ekle\u015ftirebilmesini sa\u011flar.<\/li>\n<li><strong>E\u015fzamanl\u0131l\u0131k (Concurrency):<\/strong> Go&#8217;nun goroutineler ve kanallar (channels) ile e\u015fzamanl\u0131 programlamay\u0131 basitle\u015ftirmesi, binlerce e\u015fzamanl\u0131 kullan\u0131c\u0131 iste\u011fini, token do\u011frulama veya veritaban\u0131 i\u015flemlerini verimli bir \u015fekilde y\u00f6netmemizi sa\u011flar.<\/li>\n<li><strong>Basit ve Anla\u015f\u0131l\u0131r S\u00f6z Dizimi:<\/strong> Go&#8217;nun minimalist ve okunabilir s\u00f6z dizimi, kodun daha kolay yaz\u0131lmas\u0131n\u0131, anla\u015f\u0131lmas\u0131n\u0131 ve s\u00fcrd\u00fcr\u00fclmesini sa\u011flar, bu da geli\u015ftirme s\u00fcrecini h\u0131zland\u0131r\u0131r.<\/li>\n<li><strong>G\u00fc\u00e7l\u00fc Standart K\u00fct\u00fcphane:<\/strong> HTTP sunucular\u0131, JSON i\u015fleme, kriptografi gibi bir\u00e7ok temel i\u015flev i\u00e7in zengin bir standart k\u00fct\u00fcphaneye sahiptir. Bu sayede \u00e7o\u011fu bile\u015fen Go&#8217;nun kendi ara\u00e7lar\u0131yla geli\u015ftirilebilir.<\/li>\n<\/ul>\n<p>T\u00fcm bu \u00f6zellikler, Go&#8217;yu token y\u00f6netimi gibi h\u0131z, g\u00fcvenlik ve \u00f6l\u00e7eklenebilirli\u011fin kritik oldu\u011fu sunucu taraf\u0131 uygulamalar i\u00e7in ideal bir se\u00e7im haline getiriyor.<\/p>\n<h3>Redis: H\u0131zl\u0131 Veri Depolama ve \u00d6nbellekleme Canavar\u0131<\/h3>\n<p>Redis (Remote Dictionary Server), anahtar-de\u011fer depolama yap\u0131s\u0131na sahip, a\u00e7\u0131k kaynakl\u0131, bellek i\u00e7i bir veri yap\u0131s\u0131 sunucusudur. Genellikle bir \u00f6nbellek ve mesaj arac\u0131s\u0131 olarak kullan\u0131lsa da, sundu\u011fu zengin veri yap\u0131lar\u0131 sayesinde bir\u00e7ok farkl\u0131 kullan\u0131m senaryosuna uygundur. Token y\u00f6netiminde Redis&#8217;in tercih edilmesinin temel nedenleri \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong>\u0130nan\u0131lmaz H\u0131z:<\/strong> Verileri RAM&#8217;de tutmas\u0131 sayesinde Redis, disk tabanl\u0131 veritabanlar\u0131na g\u00f6re milisaniyeler d\u00fczeyinde yan\u0131t s\u00fcreleri sunar. Token do\u011frulama, kara liste kontrol\u00fc gibi i\u015flemlerde bu h\u0131z kritik \u00f6neme sahiptir.<\/li>\n<li><strong>Esnek Veri Yap\u0131lar\u0131:<\/strong> Tokenlar\u0131n kendisi, oturum verileri (hash olarak), kara listeye al\u0131nan tokenlar (set olarak) gibi farkl\u0131 veri yap\u0131lar\u0131n\u0131 Redis&#8217;te verimli bir \u015fekilde saklayabiliriz.<\/li>\n<li><strong>TTL (Time To Live) Deste\u011fi:<\/strong> Redis, her anahtara bir ya\u015fam s\u00fcresi (TTL) atama yetene\u011fi sunar. Bu, s\u00fcresi dolan tokenlar\u0131n veya oturumlar\u0131n otomatik olarak bellekten silinmesini sa\u011flar, bellek y\u00f6netimini basitle\u015ftirir.<\/li>\n<li><strong>Atomik Operasyonlar:<\/strong> Redis, bir\u00e7ok operasyonu atomik olarak ger\u00e7ekle\u015ftirir. Bu, birden fazla istemcinin ayn\u0131 anda bir veriyi de\u011fi\u015ftirmeye \u00e7al\u0131\u015ft\u0131\u011f\u0131 durumlarda veri tutarl\u0131l\u0131\u011f\u0131n\u0131 garanti eder.<\/li>\n<li><strong>\u00d6l\u00e7eklenebilirlik ve Y\u00fcksek Eri\u015filebilirlik:<\/strong> Redis Cluster ve Sentinel gibi mekanizmalar sayesinde Redis, yatay olarak \u00f6l\u00e7eklenebilir ve y\u00fcksek eri\u015filebilirlik sunacak \u015fekilde yap\u0131land\u0131r\u0131labilir.<\/li>\n<\/ul>\n<p>Sonu\u00e7 olarak, Go&#8217;nun performans ve e\u015fzamanl\u0131l\u0131k yetenekleriyle Redis&#8217;in h\u0131z ve esnekli\u011fini birle\u015ftirmek, g\u00fcvenli, verimli ve \u00f6l\u00e7eklenebilir bir token y\u00f6netim sistemi olu\u015fturmak i\u00e7in ideal bir kombinasyon sunar.<\/p>\n<h2>Pratikte Go ve Redis ile Token Nas\u0131l Y\u00f6netilir?<\/h2>\n<p>Teorik bilgileri geride b\u0131rakarak, \u015fimdi Go ve Redis&#8217;in pratik uygulamalar\u0131na odaklanal\u0131m. Bu b\u00f6l\u00fcmde, basit bir token olu\u015fturma ve do\u011frulama mekanizmas\u0131ndan ba\u015flayarak, JWT&#8217;nin kullan\u0131m\u0131 ve Redis ile ileri d\u00fczey oturum y\u00f6netimi stratejilerine kadar ad\u0131m ad\u0131m ilerleyece\u011fiz. Her ad\u0131mda ilgili Go kod \u00f6rnekleri ve Redis komutlar\u0131 ile s\u00fcreci somutla\u015ft\u0131raca\u011f\u0131z. Bu k\u0131s\u0131m, \u00f6\u011frendiklerimizi uygulamaya d\u00f6kerek ger\u00e7ek d\u00fcnya senaryolar\u0131na haz\u0131rl\u0131k yapmam\u0131z\u0131 sa\u011flayacak.<\/p>\n<div class=\"expert-tip\">\n      Uzman \u0130pucu: Projelerinize ba\u015flamadan \u00f6nce <code>go-redis\/redis\/v8<\/code> gibi pop\u00fcler ve bak\u0131ml\u0131 bir Redis istemci k\u00fct\u00fcphanesini kullanman\u0131z, geli\u015ftirme s\u00fcrecinizi h\u0131zland\u0131r\u0131r ve hata olas\u0131l\u0131\u011f\u0131n\u0131 azalt\u0131r.\n    <\/div>\n<h3>Temel Bir Token Olu\u015fturma ve Saklama Mekanizmas\u0131 Nas\u0131l Kurulur?<\/h3>\n<p>\u0130lk ad\u0131m olarak, basit, rastgele bir dize token\u0131 olu\u015fturup bunu Redis&#8217;te belirli bir s\u00fcre (TTL) boyunca saklayaca\u011f\u0131z. Bu yakla\u015f\u0131m, \u00f6zellikle tek kullan\u0131ml\u0131k tokenlar (\u00f6rne\u011fin e-posta do\u011frulama linkleri) veya basit oturum kimlikleri i\u00e7in olduk\u00e7a uygundur.<\/p>\n<p>\u00d6ncelikle, Go projenizi ba\u015flat\u0131n ve gerekli Redis istemci k\u00fct\u00fcphanesini y\u00fckleyin:<\/p>\n<pre><code>go mod init token-management-app\ngo get github.com\/go-redis\/redis\/v8\ngo get github.com\/google\/uuid\n<\/pre>\n<p><\/code><\/p>\n<p>\u015eimdi, basit bir token olu\u015fturma ve Redis'e kaydetme fonksiyonu yazal\u0131m:<\/p>\n<pre><code><code class=\"language-go\">\npackage main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"time\"\n\t\"github.com\/go-redis\/redis\/v8\"\n\t\"github.com\/google\/uuid\"\n)\n\nvar rdb *redis.Client\nvar ctx = context.Background()\n\nfunc init() {\n\trdb = redis.NewClient(&redis.Options{\n\t\tAddr:     \"localhost:6379\",\n\t\tPassword: \"\", \n\t\tDB:       0,\n\t})\n\n\t_, err := rdb.Ping(ctx).Result()\n\tif err != nil {\n\t\tpanic(fmt.Sprintf(\"Redis'e ba\u011flan\u0131lamad\u0131: %v\", err))\n\t}\n\tfmt.Println(\"Redis ba\u011flant\u0131s\u0131 ba\u015far\u0131l\u0131!\")\n}\n\n\/\/ Yeni bir token olu\u015fturur ve Redis'e kaydeder\nfunc CreateToken(userID string, duration time.Duration) (string, error) {\n\ttoken := uuid.New().String() \n\ttokenKey := fmt.Sprintf(\"auth:token:%s\", token) \n\t\n\terr := rdb.SetEX(ctx, tokenKey, userID, duration).Err()\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"token kaydedilemedi: %w\", err)\n\t}\n\tfmt.Printf(\"Token %s, %s kullan\u0131c\u0131s\u0131 i\u00e7in %v s\u00fcresince olu\u015fturuldu.\\n\", token, userID, duration)\n\treturn token, nil\n}\n\n\/\/ Token'\u0131 do\u011frular ve ili\u015fkili kullan\u0131c\u0131 ID'sini d\u00f6nd\u00fcr\u00fcr\nfunc VerifyToken(token string) (string, error) {\n\ttokenKey := fmt.Sprintf(\"auth:token:%s\", token)\n\tuserID, err := rdb.Get(ctx, tokenKey).Result()\n\tif err == redis.Nil {\n\t\treturn \"\", fmt.Errorf(\"token bulunamad\u0131 veya s\u00fcresi doldu\")\n\t} else if err != nil {\n\t\treturn \"\", fmt.Errorf(\"token do\u011frulama hatas\u0131: %w\", err)\n\t}\n\tfmt.Printf(\"Token %s do\u011fruland\u0131, kullan\u0131c\u0131 ID: %s\\n\", token, userID)\n\treturn userID, nil\n}\n\n\/\/ Token'\u0131 ge\u00e7ersiz k\u0131lar\nfunc InvalidateToken(token string) error {\n    tokenKey := fmt.Sprintf(\"auth:token:%s\", token)\n    deleted, err := rdb.Del(ctx, tokenKey).Result()\n    if err != nil {\n        return fmt.Errorf(\"token silme hatas\u0131: %w\", err)\n    }\n    if deleted == 0 {\n        return fmt.Errorf(\"silinecek token bulunamad\u0131\")\n    }\n    fmt.Printf(\"Token %s ge\u00e7ersiz k\u0131l\u0131nd\u0131.\\n\", token)\n    return nil\n}\n\nfunc main() {\n\tuserID := \"user123\"\n\ttokenDuration := 1 * time.Hour\n\n\ttoken, err := CreateToken(userID, tokenDuration)\n\tif err != nil { fmt.Printf(\"Token olu\u015fturma hatas\u0131: %v\\n\", err); return }\n\n\tverifiedUserID, err := VerifyToken(token)\n\tif err != nil { fmt.Printf(\"Token do\u011frulama hatas\u0131: %v\\n\", err) } else { fmt.Printf(\"Do\u011frulanan kullan\u0131c\u0131 ID: %s\\n\", verifiedUserID) }\n\n    err = InvalidateToken(token)\n    if err != nil { fmt.Printf(\"Token ge\u00e7ersiz k\u0131lma hatas\u0131: %v\\n\", err) }\n\n    fmt.Println(\"Ge\u00e7ersiz k\u0131l\u0131nan token'\u0131 do\u011frulamaya \u00e7al\u0131\u015f\u0131l\u0131yor...\")\n    _, err = VerifyToken(token)\n    if err != nil { fmt.Printf(\"Ge\u00e7ersiz k\u0131l\u0131nan token do\u011frulama hatas\u0131 (beklendi\u011fi gibi): %v\\n\", err) }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu kod, <code>uuid<\/code> paketi ile benzersiz bir token olu\u015fturur ve bu token\u0131 <code>auth:token:<token_de\u011feri><\/code> format\u0131nda bir anahtar olarak, kullan\u0131c\u0131 ID'sini ise de\u011fer olarak Redis'e kaydeder. <code>SetEX<\/code> fonksiyonu, tokena belirtilen bir ya\u015fam s\u00fcresi (TTL) atar. Bu s\u00fcre sonunda Redis, anahtar\u0131 otomatik olarak siler. <code>VerifyToken<\/code> fonksiyonu, verilen token\u0131n Redis'te var olup olmad\u0131\u011f\u0131n\u0131 kontrol eder ve varsa ili\u015fkili kullan\u0131c\u0131 ID'sini d\u00f6nd\u00fcr\u00fcr.<\/p>\n<h3>JWT (JSON Web Token) Kullan\u0131m\u0131 ve G\u00fcvenli\u011fi Nas\u0131l Sa\u011flan\u0131r?<\/h3>\n<p>JWT'ler, oturum y\u00f6netiminden API yetkilendirmesine kadar bir\u00e7ok modern uygulamada yayg\u0131n olarak kullan\u0131l\u0131r. Kendi i\u00e7inde ta\u015f\u0131d\u0131\u011f\u0131 bilgiler ve kriptografik imzas\u0131 sayesinde sunucu taraf\u0131nda ek bir veritaban\u0131 sorgusu gerektirmeden do\u011frulanabilirler. Go ile JWT kullanmak i\u00e7in <code>github.com\/golang-jwt\/jwt\/v5<\/code> k\u00fct\u00fcphanesini kullanaca\u011f\u0131z.<\/p>\n<pre><code>go get github.com\/golang-jwt\/jwt\/v5\n<\/pre>\n<p><\/code><\/p>\n<p>\u015eimdi bir JWT olu\u015fturma, do\u011frulama ve Redis ile kara liste (blacklist) y\u00f6netimi \u00f6rne\u011fini inceleyelim:<\/p>\n<pre><code><code class=\"language-go\">\npackage main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\t\"context\"\n\n\t\"github.com\/golang-jwt\/jwt\/v5\"\n\t\"github.com\/go-redis\/redis\/v8\"\n)\n\nvar jwtSecretKey = []byte(\"super_gizli_jwt_anahtari_buraya_gelecek\") \n\nvar rdbJWT *redis.Client\nvar ctxJWT = context.Background()\n\nfunc init() {\n\trdbJWT = redis.NewClient(&redis.Options{\n\t\tAddr:     \"localhost:6379\",\n\t\tPassword: \"\", \n\t\tDB:       1, \n\t})\n\n\t_, err := rdbJWT.Ping(ctxJWT).Result()\n\tif err != nil { panic(fmt.Sprintf(\"Redis'e ba\u011flan\u0131lamad\u0131 (JWT DB): %v\", err)) }\n\tfmt.Println(\"Redis JWT ba\u011flant\u0131s\u0131 ba\u015far\u0131l\u0131!\")\n}\n\ntype MyCustomClaims struct {\n\tUserID string <code>json:\"user_id\"<\/code>\n\tjwt.RegisteredClaims\n}\n\nfunc CreateAccessToken(userID string) (string, error) {\n\texpirationTime := time.Now().Add(15 * time.Minute) \n\tclaims := &MyCustomClaims{\n\t\tUserID: userID,\n\t\tRegisteredClaims: jwt.RegisteredClaims{\n\t\t\tExpiresAt: jwt.NewNumericDate(expirationTime),\n\t\t\tIssuedAt:  jwt.NewNumericDate(time.Now()),\n\t\t\tNotBefore: jwt.NewNumericDate(time.Now()),\n\t\t\tIssuer:    \"my-app\",\n\t\t},\n\t}\n\n\ttoken := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)\n\ttokenString, err := token.SignedString(jwtSecretKey)\n\tif err != nil { return \"\", fmt.Errorf(\"JWT olu\u015fturma hatas\u0131: %w\", err) }\n\tfmt.Printf(\"Yeni Access Token olu\u015fturuldu: %s\\n\", tokenString)\n\treturn tokenString, nil\n}\n\nfunc VerifyAccessToken(tokenString string) (*MyCustomClaims, error) {\n\tclaims := &MyCustomClaims{}\n\ttoken, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) {\n\t\tif _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {\n\t\t\treturn nil, fmt.Errorf(\"beklenmeyen imza metodu: %v\", token.Header[\"alg\"])\n\t\t}\n\t\treturn jwtSecretKey, nil\n\t})\n\n\tif err != nil { return nil, fmt.Errorf(\"token do\u011frulama hatas\u0131: %w\", err) }\n\tif !token.Valid { return nil, fmt.Errorf(\"ge\u00e7ersiz token\") }\n\n    isBlacklisted, err := rdbJWT.Exists(ctxJWT, fmt.Sprintf(\"blacklist:%s\", claims.ID)).Result() \n    if err != nil { return nil, fmt.Errorf(\"kara liste kontrol hatas\u0131: %w\", err) }\n    if isBlacklisted > 0 { return nil, fmt.Errorf(\"token kara listede\") }\n\n\tfmt.Printf(\"Access Token do\u011fruland\u0131, kullan\u0131c\u0131 ID: %s\\n\", claims.UserID)\n\treturn claims, nil\n}\n\nfunc BlacklistToken(tokenString string) error {\n    claims := &MyCustomClaims{}\n    _, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) {\n        return jwtSecretKey, nil\n    })\n    \/\/ Token zaten ge\u00e7ersizse bile kara listeye alma devam edebiliriz.\n    \/\/ Ancak ge\u00e7erlilik s\u00fcresine ihtiyac\u0131m\u0131z var.\n    \n    if claims.ID == \"\" { \/\/ JTI (JWT ID) yoksa, token\u0131 hashleyebiliriz\n        return fmt.Errorf(\"token ID (JTI) bulunamad\u0131, kara listeye alma ba\u015far\u0131s\u0131z\")\n    }\n\n    remainingTime := time.Until(claims.ExpiresAt.Time)\n    if remainingTime <= 0 {\n        fmt.Println(\"Token zaten s\u00fcresi dolmu\u015f veya ge\u00e7ersiz, kara listeye almaya gerek yok.\")\n        return nil \n    }\n\n    err = rdbJWT.SetEX(ctxJWT, fmt.Sprintf(\"blacklist:%s\", claims.ID), \"blacklisted\", remainingTime).Err()\n    if err != nil { return fmt.Errorf(\"token kara listeye al\u0131namad\u0131: %w\", err) }\n    fmt.Printf(\"Token %s (JTI) ba\u015far\u0131yla kara listeye al\u0131nd\u0131 ve %v s\u00fcreyle Redis'te saklanacak.\\n\", claims.ID, remainingTime)\n    return nil\n}\n\nfunc main() {\n\taccessToken, err := CreateAccessToken(\"user456\")\n\tif err != nil { fmt.Printf(\"Access Token olu\u015fturma hatas\u0131: %v\\n\", err); return }\n\n\tclaims, err := VerifyAccessToken(accessToken)\n\tif err != nil { fmt.Printf(\"Access Token do\u011frulama hatas\u0131: %v\\n\", err) } else { fmt.Printf(\"Do\u011frulanan Access Token Sahibi (UserID): %s\\n\", claims.UserID) }\n\n    fmt.Println(\"\\nAccess Token kara listeye al\u0131n\u0131yor...\")\n    err = BlacklistToken(accessToken)\n    if err != nil { fmt.Printf(\"Access Token kara listeye alma hatas\u0131: %v\\n\", err) }\n\n    fmt.Println(\"Kara listeye al\u0131nan Access Token'\u0131 do\u011frulamaya \u00e7al\u0131\u015f\u0131l\u0131yor...\")\n    _, err = VerifyAccessToken(accessToken)\n    if err != nil { fmt.Printf(\"Kara listeye al\u0131nan Access Token do\u011frulama hatas\u0131 (beklendi\u011fi gibi): %v\\n\", err) } else { fmt.Println(\"Hata: Kara listeye al\u0131nm\u0131\u015f token do\u011fruland\u0131!\") }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>CreateAccessToken<\/code>, belirli bir kullan\u0131c\u0131 ID'si i\u00e7in k\u0131sa \u00f6m\u00fcrl\u00fc bir JWT olu\u015fturur ve gizli anahtar\u0131m\u0131zla imzalar. <code>VerifyAccessToken<\/code>, gelen token\u0131 ayr\u0131\u015ft\u0131r\u0131r, imzas\u0131n\u0131 do\u011frular ve token\u0131n s\u00fcresinin dolup dolmad\u0131\u011f\u0131n\u0131 kontrol eder. Ek olarak, token\u0131n Redis'teki \"kara liste\"de olup olmad\u0131\u011f\u0131n\u0131 kontrol ederek s\u00fcresinden \u00f6nce iptal edilmi\u015f tokenlar\u0131n kullan\u0131m\u0131n\u0131 engelleriz. <code>BlacklistToken<\/code> fonksiyonu ise bir token\u0131n kalan ya\u015fam s\u00fcresini hesaplayarak, token ID'sini (JTI) Redis'e kara listeye al\u0131nm\u0131\u015f olarak kaydeder.<\/p>\n<h3>Oturum Y\u00f6netimi ve Token Yenileme (Refresh Token) Stratejileri<\/h3>\n<p>K\u0131sa \u00f6m\u00fcrl\u00fc Access Tokenlar g\u00fcvenli\u011fi art\u0131r\u0131rken, kullan\u0131c\u0131lar\u0131n s\u0131k s\u0131k yeniden kimlik do\u011frulamas\u0131 yapmas\u0131n\u0131 gerektirir. Bu da k\u00f6t\u00fc bir kullan\u0131c\u0131 deneyimine yol a\u00e7abilir. Bu sorunu \u00e7\u00f6zmek i\u00e7in genellikle \"Refresh Token\" (Yenileme Token\u0131) stratejisi kullan\u0131l\u0131r. Refresh Tokenlar, genellikle uzun \u00f6m\u00fcrl\u00fcd\u00fcr ve kullan\u0131c\u0131ya yeni Access Tokenlar almak i\u00e7in kullan\u0131l\u0131r. Bu tokenlar, Access Tokenlar\u0131n aksine, her istekte g\u00f6nderilmez ve daha g\u00fcvenli bir \u015fekilde saklan\u0131r (\u00f6rne\u011fin, HTTP-only cookie i\u00e7inde). Access Token'\u0131n s\u00fcresi doldu\u011funda, istemci Refresh Token'\u0131 kullanarak sunucudan yeni bir Access Token talep eder.<\/p>\n<h4>Refresh Token Ak\u0131\u015f\u0131:<\/h4>\n<ol>\n<li>Kullan\u0131c\u0131 ba\u015far\u0131l\u0131 bir \u015fekilde oturum a\u00e7ar.<\/li>\n<li>Sunucu, hem k\u0131sa \u00f6m\u00fcrl\u00fc bir Access Token hem de uzun \u00f6m\u00fcrl\u00fc bir Refresh Token olu\u015fturur.<\/li>\n<li>Access Token istemciye g\u00f6nderilir, Refresh Token ise daha g\u00fcvenli bir \u015fekilde (\u00f6rne\u011fin, HTTP-only cookie'de) saklan\u0131r.<\/li>\n<li>\u0130stemci, her API iste\u011finde Access Token'\u0131 kullan\u0131r.<\/li>\n<li>Access Token'\u0131n s\u00fcresi doldu\u011funda, istemci Refresh Token'\u0131 kullanarak sunucuya yeni bir Access Token talebi g\u00f6nderir.<\/li>\n<li>Sunucu, Refresh Token'\u0131 do\u011frular ve ge\u00e7erliyse yeni bir Access Token d\u00f6nd\u00fcr\u00fcr.<\/li>\n<\/ol>\n<p>Redis, Refresh Tokenlar\u0131 g\u00fcvenli bir \u015fekilde depolamak ve y\u00f6netmek i\u00e7in m\u00fckemmel bir ara\u00e7t\u0131r. Her kullan\u0131c\u0131 i\u00e7in benzersiz bir Refresh Token olu\u015fturup, bunu kullan\u0131c\u0131 ID'si ile Redis'te ili\u015fkilendirebilir ve Refresh Token\u0131n s\u00fcresini de Redis'teki kayda TTL olarak atayabiliriz.<\/p>\n<pre><code><code class=\"language-go\">\npackage main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com\/go-redis\/redis\/v8\"\n\t\"github.com\/google\/uuid\"\n)\n\nvar rdbRefresh *redis.Client\nvar ctxRefresh = context.Background()\n\nfunc init() {\n\trdbRefresh = redis.NewClient(&redis.Options{\n\t\tAddr:     \"localhost:6379\",\n\t\tPassword: \"\",\n\t\tDB:       2, \n\t})\n\n\t_, err := rdbRefresh.Ping(ctxRefresh).Result()\n\tif err != nil { panic(fmt.Sprintf(\"Redis'e ba\u011flan\u0131lamad\u0131 (Refresh DB): %v\", err)) }\n\tfmt.Println(\"Redis Refresh Token ba\u011flant\u0131s\u0131 ba\u015far\u0131l\u0131!\")\n}\n\n\/\/ Yeni bir Refresh Token olu\u015fturur ve Redis'e kaydeder\nfunc CreateRefreshToken(userID string, duration time.Duration) (string, error) {\n\trefreshToken := uuid.New().String()\n\trefreshTokenKey := fmt.Sprintf(\"refresh:token:%s\", refreshToken)\n\n\terr := rdbRefresh.SetEX(ctxRefresh, refreshTokenKey, userID, duration).Err()\n\tif err != nil { return \"\", fmt.Errorf(\"refresh token kaydedilemedi: %w\", err) }\n\tfmt.Printf(\"Refresh Token %s, %s kullan\u0131c\u0131s\u0131 i\u00e7in %v s\u00fcresince olu\u015fturuldu.\\n\", refreshToken, userID, duration)\n\treturn refreshToken, nil\n}\n\n\/\/ Refresh Token'\u0131 do\u011frular ve ili\u015fkili kullan\u0131c\u0131 ID'sini d\u00f6nd\u00fcr\u00fcr\nfunc VerifyRefreshToken(refreshToken string) (string, error) {\n\trefreshTokenKey := fmt.Sprintf(\"refresh:token:%s\", refreshToken)\n\tuserID, err := rdbRefresh.Get(ctxRefresh, refreshTokenKey).Result()\n\tif err == redis.Nil { return \"\", fmt.Errorf(\"refresh token bulunamad\u0131 veya s\u00fcresi doldu\") } else if err != nil { return \"\", fmt.Errorf(\"refresh token do\u011frulama hatas\u0131: %w\", err) }\n\tfmt.Printf(\"Refresh Token %s do\u011fruland\u0131, kullan\u0131c\u0131 ID: %s\\n\", refreshToken, userID)\n\treturn userID, nil\n}\n\n\/\/ Refresh Token'\u0131 ge\u00e7ersiz k\u0131lar (logout durumunda)\nfunc InvalidateRefreshToken(refreshToken string) error {\n\trefreshTokenKey := fmt.Sprintf(\"refresh:token:%s\", refreshToken)\n\tdeleted, err := rdbRefresh.Del(ctxRefresh, refreshTokenKey).Result()\n\tif err != nil { return fmt.Errorf(\"refresh token silme hatas\u0131: %w\", err) }\n\tif deleted == 0 { return fmt.Errorf(\"silinecek refresh token bulunamad\u0131\") }\n\tfmt.Printf(\"Refresh Token %s ge\u00e7ersiz k\u0131l\u0131nd\u0131.\\n\", refreshToken)\n\treturn nil\n}\n\nfunc main() {\n\tuserID := \"user789\"\n\trefreshTokenDuration := 7 * 24 * time.Hour \n\n\trefreshToken, err := CreateRefreshToken(userID, refreshTokenDuration)\n\tif err != nil { fmt.Printf(\"Refresh Token olu\u015fturma hatas\u0131: %v\\n\", err); return }\n\n\tverifiedUserID, err := VerifyRefreshToken(refreshToken)\n\tif err != nil { fmt.Printf(\"Refresh Token do\u011frulama hatas\u0131: %v\\n\", err) } else { fmt.Printf(\"Do\u011frulanan kullan\u0131c\u0131 ID: %s\\n\", verifiedUserID) }\n\n\tfmt.Println(\"\\nRefresh Token ge\u00e7ersiz k\u0131l\u0131n\u0131yor (logout)...\")\n\terr = InvalidateRefreshToken(refreshToken)\n\tif err != nil { fmt.Printf(\"Refresh Token ge\u00e7ersiz k\u0131lma hatas\u0131: %v\\n\", err) }\n\n    fmt.Println(\"Ge\u00e7ersiz k\u0131l\u0131nan Refresh Token'\u0131 do\u011frulamaya \u00e7al\u0131\u015f\u0131l\u0131yor...\")\n    _, err = VerifyRefreshToken(refreshToken)\n    if err != nil { fmt.Printf(\"Ge\u00e7ersiz k\u0131l\u0131nan Refresh Token do\u011frulama hatas\u0131 (beklendi\u011fi gibi): %v\\n\", err) }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu kod, Redis'i kullanarak Refresh Tokenlar\u0131 y\u00f6netmenin temel ad\u0131mlar\u0131n\u0131 g\u00f6steriyor. Kullan\u0131c\u0131 oturumu kapatt\u0131\u011f\u0131nda veya \u015f\u00fcpheli bir etkinlik tespit edildi\u011finde, ilgili Refresh Token Redis'ten silinerek ge\u00e7ersiz k\u0131l\u0131nabilir. Bu sayede, uzun \u00f6m\u00fcrl\u00fc olmalar\u0131na ra\u011fmen Refresh Tokenlar \u00fczerinde tam kontrol sa\u011flanm\u0131\u015f olur.<\/p>\n<p><strong>\u00d6nemli Not:<\/strong> Ger\u00e7ek bir uygulamada, Refresh Token'\u0131n kendisi de bir JWT olabilir ve bu durumda <code>JTI (JWT ID)<\/code> alan\u0131 ile Redis'te bir e\u015fleme yaparak kara listeye alma ve iptal i\u015flemlerini daha g\u00fcvenli hale getirebilirsiniz.<\/p>\n<h2>Token Y\u00f6netiminde \u0130leri D\u00fczey G\u00fcvenlik ve Performans \u0130pu\u00e7lar\u0131 Nelerdir?<\/h2>\n<p>Token y\u00f6netim sistemleri tasarlarken sadece temel i\u015flevselli\u011fi sa\u011flamak yetmez; ayn\u0131 zamanda g\u00fcvenlik a\u00e7\u0131klar\u0131na kar\u015f\u0131 sa\u011flam olmak ve y\u00fcksek performans beklentilerini kar\u015f\u0131lamak da zorunludur. Bu b\u00f6l\u00fcmde, token y\u00f6netimini bir ad\u0131m \u00f6teye ta\u015f\u0131yacak ileri d\u00fczey g\u00fcvenlik ve performans optimizasyon tekniklerini inceleyece\u011fiz. Uygulamalar\u0131n\u0131z\u0131n hem h\u0131zl\u0131 hem de g\u00fcvenli kalmas\u0131n\u0131 sa\u011flamak i\u00e7in bu ipu\u00e7lar\u0131n\u0131 g\u00f6z \u00f6n\u00fcnde bulundurmal\u0131s\u0131n\u0131z.<\/p>\n<h3>Token G\u00fcvenli\u011fi \u0130\u00e7in En \u0130yi Uygulamalar<\/h3>\n<p>Tokenlar, kullan\u0131c\u0131lar\u0131n kimliklerini temsil etti\u011fi i\u00e7in siber sald\u0131rganlar\u0131n hedefindedir. Bu nedenle, tokenlar\u0131n g\u00fcvenli\u011fini sa\u011flamak i\u00e7in titizlikle hareket etmek gerekir.<\/p>\n<ol>\n<li><strong>HTTPS\/SSL Kullan\u0131m\u0131:<\/strong> T\u00fcm ileti\u015fim HTTPS \u00fczerinden yap\u0131lmal\u0131, bu sayede tokenlar a\u011f \u00fczerinde \u015fifrelenir ve \"man-in-the-middle\" sald\u0131r\u0131lar\u0131 engellenir.<\/li>\n<li><strong>Gizli Anahtarlar\u0131n G\u00fcvenli Y\u00f6netimi:<\/strong> JWT imzalamak i\u00e7in kullan\u0131lan gizli anahtarlar, asla kaynak kodda veya versiyon kontrol sistemlerinde saklanmamal\u0131d\u0131r. Ortam de\u011fi\u015fkenleri veya s\u0131r y\u00f6netim servisleri kullan\u0131lmal\u0131d\u0131r.<\/li>\n<li><strong>Token \u00d6mr\u00fc Y\u00f6netimi:<\/strong> Access Tokenlar k\u0131sa \u00f6m\u00fcrl\u00fc (15-30 dakika), Refresh Tokenlar ise uzun \u00f6m\u00fcrl\u00fc (g\u00fcnler, haftalar) olmal\u0131d\u0131r. Refresh Tokenlar sadece yeni Access Token almak i\u00e7in kullan\u0131lmal\u0131 ve \u015f\u00fcpheli durumlarda iptal edilmelidir.<\/li>\n<li><strong>Token Depolama:<\/strong> Web taray\u0131c\u0131lar\u0131 i\u00e7in Access Tokenlar <code>localStorage<\/code>'dan ziyade HTTP-only cookie'lerde, Refresh Tokenlar ise HTTP-only ve Secure cookie'lerde saklanmal\u0131d\u0131r. Mobil uygulamalar g\u00fcvenli depolama mekanizmalar\u0131n\u0131 (Keystore, Keychain) kullanmal\u0131d\u0131r.<\/li>\n<li><strong>Kara Liste (Blacklisting) ve \u0130ptal Mekanizmalar\u0131:<\/strong> Redis kullanarak bir \"kara liste\" mekanizmas\u0131 olu\u015fturmak, \u00e7al\u0131nan veya \u015f\u00fcpheli tokenlar\u0131n s\u00fcresi dolmadan derhal ge\u00e7ersiz k\u0131l\u0131nmas\u0131n\u0131 sa\u011flar.<\/li>\n<li><strong>Rate Limiting (H\u0131z S\u0131n\u0131rlama):<\/strong> Kimlik do\u011frulama u\u00e7 noktalar\u0131na y\u00f6nelik kaba kuvvet sald\u0131r\u0131lar\u0131n\u0131 \u00f6nlemek i\u00e7in Redis ile h\u0131z s\u0131n\u0131rlamas\u0131 uygulanmal\u0131d\u0131r.<\/li>\n<\/ol>\n<h3>Performans ve \u00d6l\u00e7eklenebilirlik \u0130\u00e7in Redis'i Nas\u0131l Verimli Kullan\u0131r\u0131z?<\/h3>\n<p>Redis'in h\u0131z\u0131 zaten etkileyici olsa da, onu daha da verimli kullanmak ve Go uygulaman\u0131zla birlikte \u00f6l\u00e7eklenebilir bir yap\u0131 kurmak i\u00e7in baz\u0131 stratejiler mevcuttur.<\/p>\n<ol>\n<li><strong>TTL Kullan\u0131m\u0131n\u0131n \u00d6nemi:<\/strong> S\u00fcresi dolan verilerin otomatik olarak silinmesi, Redis belle\u011fini optimize eder ve performans\u0131 art\u0131r\u0131r.<\/li>\n<li><strong>Redis Ba\u011flant\u0131 Havuzlar\u0131:<\/strong> Go uygulaman\u0131zda <code>go-redis<\/code> gibi k\u00fct\u00fcphanelerdeki ba\u011flant\u0131 havuzu ayarlar\u0131n\u0131 uygulaman\u0131z\u0131n y\u00fck\u00fcne g\u00f6re optimize etmek, performans\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131racakt\u0131r.<\/li>\n<li><strong>Pipelining:<\/strong> Birden fazla Redis komutunu tek bir a\u011f gidi\u015f-d\u00f6n\u00fc\u015f\u00fcyle g\u00f6ndermek, \u00f6zellikle y\u00fcksek gecikmeli a\u011flarda performans\u0131 b\u00fcy\u00fck \u00f6l\u00e7\u00fcde iyile\u015ftirebilir.<\/li>\n<li><strong>Redis Cluster ve Sentinel:<\/strong> Y\u00fcksek \u00f6l\u00e7ekli uygulamalar i\u00e7in Redis Sentinel (y\u00fcksek eri\u015filebilirlik) ve Redis Cluster (yatay \u00f6l\u00e7ekleme ve replikasyon) kullan\u0131larak daha y\u00fcksek performans ve dayan\u0131kl\u0131l\u0131k sa\u011flan\u0131r.<\/li>\n<li><strong>Bellek Y\u00f6netimi:<\/strong> Redis'in <code>maxmemory<\/code> ve <code>maxmemory-policy<\/code> ayarlar\u0131n\u0131 do\u011fru yap\u0131land\u0131rarak, bellek doldu\u011funda hangi verilerin silinece\u011fini belirleyebilirsiniz.<\/li>\n<\/ol>\n<h4>Vaka Analizi: B\u00fcy\u00fck Bir E-ticaret Sitesinde Oturum Y\u00f6netimi \u00d6l\u00e7eklendirme<\/h4>\n<p>Hayali bir e-ticaret platformu olan \"ShopEase\", milyonlarca kullan\u0131c\u0131ya hizmet veriyor ve kullan\u0131c\u0131 oturumlar\u0131n\u0131 y\u00f6netmekte zorlan\u0131yordu. Ba\u015flang\u0131\u00e7ta, oturum bilgileri bir ili\u015fkisel veritaban\u0131nda saklan\u0131yordu ancak y\u00fcksek e\u015fzamanl\u0131 istekler, veritaban\u0131 sunucusunda ciddi performans sorunlar\u0131na yol a\u00e7\u0131yordu. Her kullan\u0131c\u0131 iste\u011finde veritaban\u0131na yap\u0131lan sorgular, gecikmelere ve sunucu \u00e7\u00f6k\u00fc\u015flerine neden oluyordu.<\/p>\n<p><strong>\u00c7\u00f6z\u00fcm:<\/strong> ShopEase ekibi, oturum y\u00f6netimini Go ve Redis ile yeniden tasarlamaya karar verdi. T\u00fcm istekler Go ile yaz\u0131lm\u0131\u015f y\u00fcksek performansl\u0131 bir API Gateway \u00fczerinden ge\u00e7irilmeye ba\u015fland\u0131. Kullan\u0131c\u0131lar\u0131n Refresh Tokenlar\u0131 ve temel oturum bilgileri, Redis Cluster \u00fczerinde sakland\u0131. Her Refresh Token, ilgili kullan\u0131c\u0131 ID'siyle e\u015fle\u015ftirildi ve <code>SETEX<\/code> komutuyla belirli bir TTL'ye sahip oldu. Kullan\u0131c\u0131 \u015fifresini de\u011fi\u015ftirdi\u011finde veya \"T\u00fcm Cihazlardan \u00c7\u0131k\u0131\u015f Yap\" se\u00e7ene\u011fini kulland\u0131\u011f\u0131nda, ilgili Refresh Tokenlar Redis'teki bir \"blacklist\" setine eklendi. Go uygulamas\u0131ndaki Redis istemcisi, uygun ba\u011flant\u0131 havuzu ayarlar\u0131yla yap\u0131land\u0131r\u0131ld\u0131 ve Redis pipelining kullan\u0131ld\u0131.<\/p>\n<p><strong>Sonu\u00e7:<\/strong> Bu de\u011fi\u015fiklikler sayesinde ShopEase, oturum do\u011frulama s\u00fcrelerini %80 oran\u0131nda azaltt\u0131, ayn\u0131 anda on binlerce kullan\u0131c\u0131ya hizmet verebilecek \u00f6l\u00e7e\u011fe ula\u015ft\u0131 ve veritaban\u0131 \u00fczerindeki y\u00fck\u00fc \u00f6nemli \u00f6l\u00e7\u00fcde azaltt\u0131. G\u00fcvenlik de art\u0131r\u0131ld\u0131, \u00e7\u00fcnk\u00fc \u00e7al\u0131nan tokenlar \u00e7ok daha h\u0131zl\u0131 bir \u015fekilde iptal edilebiliyordu.<\/p>\n<div class=\"expert-tip\">\n      Uzman \u0130pucu: G\u00fcvenlik, katmanl\u0131 bir yakla\u015f\u0131mla sa\u011flanmal\u0131d\u0131r. Sadece token y\u00f6netimini de\u011fil, t\u00fcm uygulama katmanlar\u0131n\u0131 (a\u011f, sunucu, kod) d\u00fc\u015f\u00fcnerek kapsaml\u0131 bir g\u00fcvenlik stratejisi geli\u015ftirin.\n    <\/div>\n<h2>Go ve Redis \u0130kilisiyle Token Y\u00f6netiminin Gelece\u011fi<\/h2>\n<p>Bu makalede, Go ve Redis kullanarak modern ve g\u00fcvenli bir token y\u00f6netim sistemi olu\u015fturman\u0131n temel prensiplerini ve pratik uygulamalar\u0131n\u0131 derinlemesine inceledik. G\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi, Go'nun \u00fcst\u00fcn performans\u0131, e\u015fzamanl\u0131l\u0131k yetenekleri ve basit s\u00f6z dizimi ile Redis'in inan\u0131lmaz h\u0131z\u0131, esnek veri yap\u0131lar\u0131 ve \u00f6l\u00e7eklenebilirlik \u00f6zellikleri bir araya geldi\u011finde, token y\u00f6netimi gibi kritik bir alanda g\u00fc\u00e7l\u00fc ve verimli \u00e7\u00f6z\u00fcmler \u00fcretmek m\u00fcmk\u00fcn oluyor. Bu sinerji, g\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zla de\u011fi\u015fen teknolojik peyzaj\u0131nda uygulamalar i\u00e7in sa\u011flam bir temel sunmaktad\u0131r.<\/p>\n<p>\u00d6zetle, Go ile token olu\u015fturma, imzalama ve do\u011frulama s\u00fcre\u00e7lerini verimli bir \u015fekilde y\u00f6netirken; Redis ile tokenlar\u0131 h\u0131zl\u0131ca depolayabilir, ge\u00e7erlilik s\u00fcrelerini (TTL) kontrol edebilir, kara listeye alabilir ve yenileme tokenlar\u0131 sayesinde sorunsuz bir kullan\u0131c\u0131 deneyimi sunabiliriz. Bu entegrasyon, yaln\u0131zca performans\u0131 art\u0131rmakla kalm\u0131yor, ayn\u0131 zamanda g\u00fcvenlik risklerini minimize etmemize de olanak tan\u0131yor, b\u00f6ylece daha g\u00fcvenilir ve istikrarl\u0131 uygulamalar geli\u015ftirebiliyoruz.<\/p>\n<p>Siz de kendi projelerinizde Go ve Redis'in bu muhte\u015fem sinerjisinden faydalanarak hem geli\u015ftirici verimlili\u011finizi art\u0131rabilir hem de kullan\u0131c\u0131lar\u0131n\u0131za g\u00fcvenli, h\u0131zl\u0131 ve ak\u0131c\u0131 bir deneyim sunabilirsiniz. Unutmay\u0131n, iyi tasarlanm\u0131\u015f bir token y\u00f6netim sistemi, uygulaman\u0131z\u0131n ba\u015far\u0131s\u0131n\u0131n anahtarlar\u0131ndan biridir.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<dl>\n<dt>Go ve Redis d\u0131\u015f\u0131nda hangi teknolojiler kullan\u0131labilir?<\/dt>\n<dd>Go yerine Python (Flask\/Django), Node.js (Express), Java (Spring Boot) gibi diller; Redis yerine ise memcached, MongoDB veya ili\u015fkisel veritabanlar\u0131 kullan\u0131labilir. Ancak Redis'in bellek i\u00e7i yap\u0131s\u0131 ve TTL deste\u011fi, token y\u00f6netimi i\u00e7in \u00e7o\u011fu zaman daha avantajl\u0131d\u0131r. Go ise performans ve e\u015fzamanl\u0131l\u0131k a\u00e7\u0131s\u0131ndan \u00f6ne \u00e7\u0131kar.<\/dd>\n<dt>JWT mi yoksa oturum token'lar\u0131 m\u0131 daha iyi?<\/dt>\n<dd>Her ikisinin de avantajlar\u0131 ve dezavantajlar\u0131 vard\u0131r:<\/p>\n<ul>\n<li><strong>JWT:<\/strong> Durumsuz yap\u0131s\u0131yla \u00f6l\u00e7eklenebilirli\u011fi art\u0131r\u0131r, veritaban\u0131 sorgusu gerektirmez. Ancak s\u00fcresi dolmadan \u00f6nce iptali (revocation) zordur ve kara liste mekanizmas\u0131 gerektirir.<\/li>\n<li><strong>Oturum Tokenlar\u0131 (Redis tabanl\u0131):<\/strong> Sunucu taraf\u0131nda y\u00f6netildi\u011fi i\u00e7in daha kolay iptal edilebilir ve detayl\u0131 oturum kontrol\u00fc sa\u011flar. Her istekte Redis sorgusu gerektirir ancak bu Redis'in h\u0131z\u0131 sayesinde genellikle sorun te\u015fkil etmez.<\/li>\n<\/ul>\n<p>            Genellikle, k\u0131sa \u00f6m\u00fcrl\u00fc Access Tokenlar i\u00e7in JWT, uzun \u00f6m\u00fcrl\u00fc Refresh Tokenlar i\u00e7in Redis tabanl\u0131 oturum tokenlar\u0131 birlikte kullan\u0131l\u0131r.\n        <\/dd>\n<dt>Redis \u00e7\u00f6kerse token y\u00f6netimi ne olur?<\/dt>\n<dd>E\u011fer Redis \u00e7\u00f6kerse, Redis'te saklanan t\u00fcm oturum tokenlar\u0131 veya kara liste bilgileri kaybolabilir. Bu durumu \u00f6nlemek i\u00e7in Redis Persistence (RDB\/AOF), Redis Sentinel (y\u00fcksek eri\u015filebilirlik) ve Redis Cluster (\u00f6l\u00e7eklenebilirlik ve replikasyon) gibi mekanizmalar kullan\u0131lmal\u0131d\u0131r. Bu sayede veri kayb\u0131 minimize edilir ve sistemin s\u00fcreklili\u011fi sa\u011flan\u0131r.<\/dd>\n<dt>Tokenlar\u0131 veritaban\u0131nda saklamak ne kadar g\u00fcvenli?<\/dt>\n<dd>Tokenlar\u0131 ili\u015fkisel bir veritaban\u0131nda saklamak teknik olarak m\u00fcmk\u00fcn olsa da performans, TTL y\u00f6netimi ve \u00f6l\u00e7eklenebilirlik a\u00e7\u0131s\u0131ndan Redis kadar verimli de\u011fildir. Y\u00fcksek trafikli uygulamalarda veritaban\u0131 sorgular\u0131 darbo\u011faz yaratabilir ve s\u00fcresi dolan tokenlar\u0131 temizlemek ek mekanizmalar gerektirebilir. Hassas token bilgilerini asla a\u00e7\u0131k metin olarak saklamay\u0131n; daima hashleyin veya \u015fifreleyin.<\/dd>\n<dt>Mobil uygulamalar i\u00e7in token y\u00f6netimi farkl\u0131 m\u0131d\u0131r?<\/dt>\n<dd>Evet, web uygulamalar\u0131ndan baz\u0131 farkl\u0131l\u0131klar g\u00f6sterir: Mobil uygulamalarda taray\u0131c\u0131 tabanl\u0131 <code>cookies<\/code> veya <code>localStorage<\/code> gibi mekanizmalar bulunmaz. Tokenlar genellikle platformun g\u00fcvenli depolama alanlar\u0131nda (iOS Keychain, Android Keystore) saklanmal\u0131d\u0131r. A\u011f g\u00fcvenli\u011fi i\u00e7in HTTPS kullan\u0131m\u0131 ve sertifika sabitleme (certificate pinning) gibi \u00f6nlemler de mobil uygulamalarda \u00f6nemlidir. Temel token olu\u015fturma ve do\u011frulama mant\u0131\u011f\u0131 sunucu taraf\u0131nda ayn\u0131 kalsa da, istemci taraf\u0131ndaki depolama ve g\u00fcvenlik uygulamalar\u0131 platforma \u00f6zg\u00fc olarak farkl\u0131l\u0131k g\u00f6sterir.<\/dd>\n<\/dl>\n<div style=\"width: 100%;\">\n<style>\n            \/* Genel mobil uyumluluk i\u00e7in viewport meta etiketi gerekli olsa da,\n               bu i\u00e7erik body i\u00e7inde sunuldu\u011fu i\u00e7in CSS ile \u00f6rnekler verilmi\u015ftir. *\/\n            @media screen and (max-width: 768px) {\n                body {\n                    font-size: 16px; \/* Okunabilirli\u011fi art\u0131r *\/\n                }\n                pre code {\n                    white-space: pre-wrap; \/* Uzun kod sat\u0131rlar\u0131n\u0131 sar *\/\n                    word-break: break-all; \/* Kelimeyi b\u00f6lerek ta\u015fmay\u0131 engelle *\/\n                    overflow-x: auto; \/* Yatay kayd\u0131rma \u00e7ubu\u011fu *\/\n                    display: block;\n                    padding: 1em;\n                }\n                table, thead, tbody, th, td, tr {\n                    display: block; \/* Tablo elemanlar\u0131n\u0131 blok olarak g\u00f6ster *\/\n                }\n                thead tr {\n                    position: absolute;\n                    top: -9999px;\n                    left: -9999px;\n                }\n                tr { border: 1px solid #ccc; margin-bottom: 5px; }\n                td { \n                    border: none;\n                    border-bottom: 1px solid #eee; \n                    position: relative;\n                    padding-left: 50%; \n                    text-align: right;\n                }\n                td:before { \/* H\u00fccre ba\u015fl\u0131klar\u0131n\u0131 etiket olarak g\u00f6ster *\/\n                    position: absolute;\n                    top: 6px;\n                    left: 6px;\n                    width: 45%; \n                    padding-right: 10px; \n                    white-space: nowrap;\n                    content: attr(data-label);\n                    font-weight: bold;\n                    text-align: left;\n                }\n                .expert-tip {\n                    font-size: 0.9em;\n                }\n            }\n        <\/style>\n<\/p><\/div>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Uygulamalar\u0131n\u0131zda token y\u00f6netimini Go ve Redis ikilisiyle nas\u0131l g\u00fcvenli, h\u0131zl\u0131 ve \u00f6l\u00e7eklenebilir hale getirebilece\u011finizi \u00f6\u011frenin. Bu rehberde JWT&#8217;den&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1404],"tags":[],"class_list":{"0":"post-34170","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-redis","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Go ve Redis ile G\u00fcvenli ve Verimli Token Y\u00f6netimi: Detayl\u0131 Rehber<\/title>\n<meta name=\"description\" content=\"Uygulamalar\u0131n\u0131zda token y\u00f6netimini Go ve Redis ikilisiyle nas\u0131l g\u00fcvenli, h\u0131zl\u0131 ve \u00f6l\u00e7eklenebilir hale getirebilece\u011finizi \u00f6\u011frenin. Bu rehberde JWT&#039;den oturum y\u00f6netimine kadar her detay\u0131 ke\u015ffedin.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/go-ve-redis-ile-guvenli-ve-verimli-token-yonetimi-detayli-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Go ve Redis ile G\u00fcvenli ve Verimli Token Y\u00f6netimi: Detayl\u0131 Rehber\" \/>\n<meta property=\"og:description\" content=\"Uygulamalar\u0131n\u0131zda token y\u00f6netimini Go ve Redis ikilisiyle nas\u0131l g\u00fcvenli, h\u0131zl\u0131 ve \u00f6l\u00e7eklenebilir hale getirebilece\u011finizi \u00f6\u011frenin. Bu rehberde JWT&#039;den oturum y\u00f6netimine kadar her detay\u0131 ke\u015ffedin.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/go-ve-redis-ile-guvenli-ve-verimli-token-yonetimi-detayli-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-12T03:02:17+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/go-ve-redis-ile-guvenli-ve-verimli-token-yonetimi-detayli-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/go-ve-redis-ile-guvenli-ve-verimli-token-yonetimi-detayli-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Go ve Redis ile G\u00fcvenli ve Verimli Token Y\u00f6netimi: Detayl\u0131 Rehber\",\"datePublished\":\"2025-11-12T03:02:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/go-ve-redis-ile-guvenli-ve-verimli-token-yonetimi-detayli-rehber\/\"},\"wordCount\":3740,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Redis\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/go-ve-redis-ile-guvenli-ve-verimli-token-yonetimi-detayli-rehber\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/go-ve-redis-ile-guvenli-ve-verimli-token-yonetimi-detayli-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/go-ve-redis-ile-guvenli-ve-verimli-token-yonetimi-detayli-rehber\/\",\"name\":\"Go ve Redis ile G\u00fcvenli ve Verimli Token Y\u00f6netimi: Detayl\u0131 Rehber\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-12T03:02:17+00:00\",\"description\":\"Uygulamalar\u0131n\u0131zda token y\u00f6netimini Go ve Redis ikilisiyle nas\u0131l g\u00fcvenli, h\u0131zl\u0131 ve \u00f6l\u00e7eklenebilir hale getirebilece\u011finizi \u00f6\u011frenin. Bu rehberde JWT'den oturum y\u00f6netimine kadar her detay\u0131 ke\u015ffedin.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/go-ve-redis-ile-guvenli-ve-verimli-token-yonetimi-detayli-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/go-ve-redis-ile-guvenli-ve-verimli-token-yonetimi-detayli-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/go-ve-redis-ile-guvenli-ve-verimli-token-yonetimi-detayli-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Go ve Redis ile G\u00fcvenli ve Verimli Token Y\u00f6netimi: Detayl\u0131 Rehber\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Go ve Redis ile G\u00fcvenli ve Verimli Token Y\u00f6netimi: Detayl\u0131 Rehber","description":"Uygulamalar\u0131n\u0131zda token y\u00f6netimini Go ve Redis ikilisiyle nas\u0131l g\u00fcvenli, h\u0131zl\u0131 ve \u00f6l\u00e7eklenebilir hale getirebilece\u011finizi \u00f6\u011frenin. Bu rehberde JWT'den oturum y\u00f6netimine kadar her detay\u0131 ke\u015ffedin.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/go-ve-redis-ile-guvenli-ve-verimli-token-yonetimi-detayli-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"Go ve Redis ile G\u00fcvenli ve Verimli Token Y\u00f6netimi: Detayl\u0131 Rehber","og_description":"Uygulamalar\u0131n\u0131zda token y\u00f6netimini Go ve Redis ikilisiyle nas\u0131l g\u00fcvenli, h\u0131zl\u0131 ve \u00f6l\u00e7eklenebilir hale getirebilece\u011finizi \u00f6\u011frenin. Bu rehberde JWT'den oturum y\u00f6netimine kadar her detay\u0131 ke\u015ffedin.","og_url":"https:\/\/fatihsoysal.com\/blog\/go-ve-redis-ile-guvenli-ve-verimli-token-yonetimi-detayli-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-12T03:02:17+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"13 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/go-ve-redis-ile-guvenli-ve-verimli-token-yonetimi-detayli-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/go-ve-redis-ile-guvenli-ve-verimli-token-yonetimi-detayli-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Go ve Redis ile G\u00fcvenli ve Verimli Token Y\u00f6netimi: Detayl\u0131 Rehber","datePublished":"2025-11-12T03:02:17+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/go-ve-redis-ile-guvenli-ve-verimli-token-yonetimi-detayli-rehber\/"},"wordCount":3740,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Redis"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/go-ve-redis-ile-guvenli-ve-verimli-token-yonetimi-detayli-rehber\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/go-ve-redis-ile-guvenli-ve-verimli-token-yonetimi-detayli-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/go-ve-redis-ile-guvenli-ve-verimli-token-yonetimi-detayli-rehber\/","name":"Go ve Redis ile G\u00fcvenli ve Verimli Token Y\u00f6netimi: Detayl\u0131 Rehber","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-12T03:02:17+00:00","description":"Uygulamalar\u0131n\u0131zda token y\u00f6netimini Go ve Redis ikilisiyle nas\u0131l g\u00fcvenli, h\u0131zl\u0131 ve \u00f6l\u00e7eklenebilir hale getirebilece\u011finizi \u00f6\u011frenin. Bu rehberde JWT'den oturum y\u00f6netimine kadar her detay\u0131 ke\u015ffedin.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/go-ve-redis-ile-guvenli-ve-verimli-token-yonetimi-detayli-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/go-ve-redis-ile-guvenli-ve-verimli-token-yonetimi-detayli-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/go-ve-redis-ile-guvenli-ve-verimli-token-yonetimi-detayli-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Go ve Redis ile G\u00fcvenli ve Verimli Token Y\u00f6netimi: Detayl\u0131 Rehber"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34170","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=34170"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34170\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=34170"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=34170"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=34170"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}