{"id":38377,"date":"2026-01-29T23:00:43","date_gmt":"2026-01-29T20:00:43","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/express-js-ve-node-jste-jwt-kimlik-dogrulama-kapsamli-rehber\/"},"modified":"2026-01-29T23:00:43","modified_gmt":"2026-01-29T20:00:43","slug":"express-js-ve-node-jste-jwt-kimlik-dogrulama-kapsamli-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/express-js-ve-node-jste-jwt-kimlik-dogrulama-kapsamli-rehber\/","title":{"rendered":"Express.js ve Node.js&#8217;te JWT Kimlik Do\u011frulama: Kapsaml\u0131 Rehber"},"content":{"rendered":"<h2>Express.js ve Node.js&#8217;te JWT Kimlik Do\u011frulama: Kapsaml\u0131 Rehber<\/h2>\n<p>Modern web uygulamalar\u0131nda kullan\u0131c\u0131 kimlik do\u011frulama ve yetkilendirme s\u00fcre\u00e7leri, g\u00fcvenli\u011fin temelini olu\u015fturur. Bu ba\u011flamda JSON Web Token (JWT), sunucu taraf\u0131nda oturum bilgisi tutma ihtiyac\u0131n\u0131 ortadan kald\u0131ran, hafif ve esnek bir y\u00f6ntem olarak \u00f6ne \u00e7\u0131kar. Bu makalede, Node.js ve Express.js kullanarak JWT tabanl\u0131 kimlik do\u011frulaman\u0131n nas\u0131l ad\u0131m ad\u0131m uygulanaca\u011f\u0131n\u0131, temel kavramlardan en iyi g\u00fcvenlik uygulamalar\u0131na kadar t\u00fcm detaylar\u0131yla ele alaca\u011f\u0131z.<\/p>\n<h3>JWT Nedir ve Neden Kullan\u0131l\u0131r?<\/h3>\n<p>JSON Web Token (JWT), taraflar aras\u0131nda g\u00fcvenli bir \u015fekilde bilgi al\u0131\u015fveri\u015fini sa\u011flayan kompakt, URL g\u00fcvenli bir y\u00f6ntemdir. \u00d6zellikle API tabanl\u0131 uygulamalarda, mobil ve tek sayfa uygulamalar\u0131nda (SPA) kullan\u0131c\u0131 kimlik do\u011frulama ve yetkilendirme i\u00e7in s\u0131kl\u0131kla tercih edilir. JWT&#8217;nin temel amac\u0131, bir kullan\u0131c\u0131n\u0131n kimli\u011fini do\u011frulad\u0131ktan sonra, sunucunun bu kullan\u0131c\u0131ya belirli kaynaklara eri\u015fim yetkisi vermesini sa\u011flamakt\u0131r.<\/p>\n<h4>Kimlik Do\u011frulama ve Yetkilendirme Fark\u0131<\/h4>\n<ul>\n<li><strong>Kimlik Do\u011frulama (Authentication):<\/strong> Kullan\u0131c\u0131n\u0131n kim oldu\u011funu kan\u0131tlama s\u00fcrecidir. \u00d6rne\u011fin, kullan\u0131c\u0131 ad\u0131 ve \u015fifre ile giri\u015f yapma.<\/li>\n<li><strong>Yetkilendirme (Authorization):<\/strong> Kimli\u011fi do\u011frulanm\u0131\u015f bir kullan\u0131c\u0131n\u0131n belirli bir kayna\u011fa veya eyleme eri\u015fim izni olup olmad\u0131\u011f\u0131n\u0131 belirleme s\u00fcrecidir. \u00d6rne\u011fin, bir y\u00f6neticinin di\u011fer kullan\u0131c\u0131lar\u0131n profillerini d\u00fczenleyebilmesi.<\/li>\n<\/ul>\n<p>JWT, hem kimlik do\u011frulama sonras\u0131nda kullan\u0131c\u0131ya bir token vererek kimli\u011fini kan\u0131tlamas\u0131na yard\u0131mc\u0131 olur hem de bu token i\u00e7indeki bilgilerle yetkilendirme kararlar\u0131 al\u0131nmas\u0131n\u0131 kolayla\u015ft\u0131r\u0131r.<\/p>\n<h4>Geleneksel Oturum Y\u00f6netimine Alternatif<\/h4>\n<p>Geleneksel oturum y\u00f6netiminde, kullan\u0131c\u0131 giri\u015f yapt\u0131\u011f\u0131nda sunucu taraf\u0131nda bir oturum kimli\u011fi (session ID) olu\u015fturulur ve bu kimlik bir \u00e7erez (cookie) arac\u0131l\u0131\u011f\u0131yla istemciye g\u00f6nderilir. Her istekte istemci bu \u00e7erezi sunucuya geri g\u00f6nderir ve sunucu, oturum kimli\u011fini veritaban\u0131nda veya bellekte tuttu\u011fu oturum bilgileriyle kar\u015f\u0131la\u015ft\u0131r\u0131r. JWT ise bu duruma bir alternatif sunar.<\/p>\n<h4>Durumsuz (Stateless) Yap\u0131n\u0131n Avantajlar\u0131<\/h4>\n<p>JWT&#8217;nin en b\u00fcy\u00fck avantajlar\u0131ndan biri, sunucu taraf\u0131nda oturum durumu (state) tutma ihtiyac\u0131n\u0131 ortadan kald\u0131rmas\u0131d\u0131r. Her JWT, kullan\u0131c\u0131n\u0131n kimli\u011fi ve yetkileri hakk\u0131nda gerekli t\u00fcm bilgiyi kendi i\u00e7inde bar\u0131nd\u0131r\u0131r. Bu durum, \u00f6zellikle mikroservis mimarilerinde ve yatay \u00f6l\u00e7eklenebilirlik (horizontal scaling) gerektiren uygulamalarda b\u00fcy\u00fck avantaj sa\u011flar:<\/p>\n<ul>\n<li><strong>\u00d6l\u00e7eklenebilirlik:<\/strong> Her sunucu token&#8217;\u0131 ba\u011f\u0131ms\u0131z olarak do\u011frulayabilir, bu da y\u00fck dengeleyicilerle birden fazla sunucu aras\u0131nda kolayca da\u011f\u0131t\u0131m yap\u0131lmas\u0131na olanak tan\u0131r.<\/li>\n<li><strong>Basitlik:<\/strong> Sunucu taraf\u0131nda oturum veritaban\u0131 y\u00f6netimi veya \u00e7erez depolama gibi karma\u015f\u0131k i\u015flemleri azalt\u0131r.<\/li>\n<li><strong>\u00c7apraz Alan Eri\u015fimi (CORS):<\/strong> JWT&#8217;ler HTTP ba\u015fl\u0131klar\u0131nda ta\u015f\u0131nd\u0131\u011f\u0131 i\u00e7in, farkl\u0131 alan adlar\u0131 aras\u0131nda kimlik do\u011frulama yapmak daha kolayd\u0131r.<\/li>\n<\/ul>\n<h4>JWT&#8217;nin Faydalar\u0131<\/h4>\n<ul>\n<li><strong>G\u00fcvenlik:<\/strong> \u0130mza sayesinde token&#8217;\u0131n i\u00e7eri\u011finin de\u011fi\u015ftirilmedi\u011fi garanti edilir.<\/li>\n<li><strong>Hafiflik:<\/strong> JSON format\u0131nda oldu\u011fu i\u00e7in kompakt ve kolayca iletilir.<\/li>\n<li><strong>Esneklik:<\/strong> Herhangi bir programlama dili veya platformda kullan\u0131labilir.<\/li>\n<li><strong>Standartla\u015fma:<\/strong> RFC 7519 ile tan\u0131mlanm\u0131\u015f a\u00e7\u0131k bir standartt\u0131r.<\/li>\n<\/ul>\n<h3>JWT Yap\u0131s\u0131 ve Bile\u015fenleri<\/h3>\n<p>Bir JWT, \u00fc\u00e7 ana b\u00f6l\u00fcmden olu\u015fur ve bu b\u00f6l\u00fcmler noktalarla (<code>.<\/code>) ayr\u0131l\u0131r:<\/p>\n<pre><code>\nheader.payload.signature\n<\/pre>\n<p><\/code><\/p>\n<p>Her b\u00f6l\u00fcm Base64Url ile kodlanm\u0131\u015ft\u0131r.<\/p>\n<h4>Header (Ba\u015fl\u0131k)<\/h4>\n<p>Header, token'\u0131n t\u00fcr\u00fcn\u00fc (JWT) ve kullan\u0131lan imzalama algoritmas\u0131n\u0131 (\u00f6rne\u011fin, HS256 veya RS256) belirtir. \u00d6rnek bir ba\u015fl\u0131k:<\/p>\n<pre><code>\n{\n  \"alg\": \"HS256\",\n  \"typ\": \"JWT\"\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu JSON nesnesi Base64Url ile kodlan\u0131r ve JWT'nin ilk k\u0131sm\u0131n\u0131 olu\u015fturur.<\/p>\n<h4>Payload (Y\u00fck)<\/h4>\n<p>Payload, token'\u0131n as\u0131l verilerini (claim'leri) i\u00e7erir. Claim'ler, kullan\u0131c\u0131 hakk\u0131nda bilgiler (\u00f6rne\u011fin, kullan\u0131c\u0131 ID'si, ad\u0131, rolleri) veya token'\u0131n ge\u00e7erlilik s\u00fcresi gibi meta veriler olabilir. \u00dc\u00e7 t\u00fcr claim vard\u0131r:<\/p>\n<ul>\n<li><strong>Kay\u0131tl\u0131 Claim'ler (Registered Claims):<\/strong> JWT standartlar\u0131 taraf\u0131ndan tan\u0131mlanm\u0131\u015f, ancak zorunlu olmayan claim'lerdir. \u00d6rnekler: <code>iss<\/code> (issuer), <code>exp<\/code> (expiration time), <code>sub<\/code> (subject), <code>aud<\/code> (audience).<\/li>\n<li><strong>Genel Claim'ler (Public Claims):<\/strong> \u00c7ak\u0131\u015fmalar\u0131 \u00f6nlemek i\u00e7in IANA JWT Kay\u0131t Defteri'nde tan\u0131mlanm\u0131\u015f veya kendi ad alan\u0131n\u0131zda tan\u0131mlanm\u0131\u015f \u00f6zel claim'lerdir.<\/li>\n<li><strong>\u00d6zel Claim'ler (Private Claims):<\/strong> Uygulaman\u0131z\u0131n ihtiya\u00e7lar\u0131na g\u00f6re tan\u0131mlad\u0131\u011f\u0131n\u0131z \u00f6zel claim'lerdir. \u00d6rne\u011fin, <code>userId<\/code> veya <code>userRole<\/code>.<\/li>\n<\/ul>\n<p>\u00d6rnek bir payload:<\/p>\n<pre><code>\n{\n  \"userId\": \"12345\",\n  \"username\": \"exampleuser\",\n  \"role\": \"admin\",\n  \"iat\": 1678886400, \/\/ Issued At (token olu\u015fturulma zaman\u0131)\n  \"exp\": 1678890000  \/\/ Expiration Time (token biti\u015f zaman\u0131)\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu JSON nesnesi de Base64Url ile kodlan\u0131r ve JWT'nin ikinci k\u0131sm\u0131n\u0131 olu\u015fturur.<\/p>\n<h4>Signature (\u0130mza)<\/h4>\n<p>\u0130mza, JWT'nin b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc ve orijinalli\u011fini do\u011frulamak i\u00e7in kullan\u0131l\u0131r. Header ve Payload'\u0131n Base64Url kodlanm\u0131\u015f halleri, bir gizli anahtar (secret key) kullan\u0131larak Header'da belirtilen algoritma ile \u015fifrelenir. \u0130mza \u015fu \u015fekilde olu\u015fturulur:<\/p>\n<pre><code>\nHMACSHA256(\n  base64UrlEncode(header) + \".\" +\n  base64UrlEncode(payload),\n  secret_key\n)\n<\/pre>\n<p><\/code><\/p>\n<p>\u0130mza, token'\u0131n de\u011fi\u015ftirilmedi\u011fini garanti eder. E\u011fer header veya payload de\u011fi\u015ftirilirse, imza ge\u00e7ersiz olur ve token reddedilir.<\/p>\n<h4>\u00d6rnek Bir JWT<\/h4>\n<p>Yukar\u0131daki header ve payload kullan\u0131larak olu\u015fturulmu\u015f bir JWT \u015fu \u015fekilde g\u00f6r\u00fcnebilir:<\/p>\n<pre><code>\neyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiIxMjM0NSIsInVzZXJuYW1lIjoiZXhhbXBsZXVzZXIiLCJyb2xlIjoiYWRtaW4iLCJpYXQiOjE2Nzg4ODY0MDAsImV4cCI6MTY3ODg5MDAwMH0.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c\n<\/pre>\n<p><\/code><\/p>\n<h3>Express.js Projesi Kurulumu<\/h3>\n<p>JWT kimlik do\u011frulamas\u0131n\u0131 uygulamak i\u00e7in \u00f6ncelikle temel bir Express.js projesi kurmam\u0131z gerekiyor.<\/p>\n<h4>Gerekli Paketlerin Kurulumu<\/h4>\n<p>Proje dizininizde a\u015fa\u011f\u0131daki komutlar\u0131 \u00e7al\u0131\u015ft\u0131rarak gerekli paketleri kurun:<\/p>\n<pre><code>\nmkdir jwt-auth-app\ncd jwt-auth-app\nnpm init -y\nnpm install express jsonwebtoken dotenv bcryptjs\n<\/pre>\n<p><\/code><\/p>\n<ul>\n<li><code>express<\/code>: Web sunucumuzu olu\u015fturmak i\u00e7in.<\/li>\n<li><code>jsonwebtoken<\/code>: JWT olu\u015fturma ve do\u011frulama i\u00e7in.<\/li>\n<li><code>dotenv<\/code>: Ortam de\u011fi\u015fkenlerini y\u00f6netmek i\u00e7in.<\/li>\n<li><code>bcryptjs<\/code>: \u015eifreleri g\u00fcvenli bir \u015fekilde hashlemek i\u00e7in.<\/li>\n<\/ul>\n<h4>Temel Express Uygulamas\u0131<\/h4>\n<p>Proje k\u00f6k dizininde <code>app.js<\/code> ad\u0131nda bir dosya olu\u015fturun ve a\u015fa\u011f\u0131daki temel Express uygulamas\u0131n\u0131 ekleyin:<\/p>\n<pre><code>\n\/\/ app.js\nrequire('dotenv').config(); \/\/ Ortam de\u011fi\u015fkenlerini y\u00fckle\n\nconst express = require('express');\nconst app = express();\nconst PORT = process.env.PORT || 3000;\n\napp.use(express.json()); \/\/ JSON body'leri parse etmek i\u00e7in\n\napp.get('\/', (req, res) => {\n    res.send('JWT Kimlik Do\u011frulama Uygulamas\u0131na Ho\u015f Geldiniz!');\n});\n\napp.listen(PORT, () => {\n    console.log(<code>Sunucu http:\/\/localhost:${PORT} adresinde \u00e7al\u0131\u015f\u0131yor.<\/code>);\n});\n<\/pre>\n<p><\/code><\/p>\n<h4>Ortam De\u011fi\u015fkenlerinin Y\u00f6netimi (.env)<\/h4>\n<p>G\u00fcvenlik anahtarlar\u0131 gibi hassas bilgileri kod i\u00e7inde tutmak yerine ortam de\u011fi\u015fkenleri olarak saklamak en iyi uygulamad\u0131r. Proje k\u00f6k dizininde <code>.env<\/code> ad\u0131nda bir dosya olu\u015fturun:<\/p>\n<pre><code>\n\/\/ .env\nJWT_SECRET=cok_gizli_anahtariniz_burada_olmali\nPORT=5000\n<\/pre>\n<p><\/code><\/p>\n<p><code>JWT_SECRET<\/code> de\u011ferini g\u00fc\u00e7l\u00fc ve tahmin edilemez bir dizeyle de\u011fi\u015ftirin.<\/p>\n<h3>JWT Kimlik Do\u011frulama Ak\u0131\u015f\u0131<\/h3>\n<p>JWT tabanl\u0131 kimlik do\u011frulama genellikle a\u015fa\u011f\u0131daki ad\u0131mlar\u0131 i\u00e7erir:<\/p>\n<ol>\n<li><strong>Kullan\u0131c\u0131 Kayd\u0131 (Register):<\/strong> Kullan\u0131c\u0131, kullan\u0131c\u0131 ad\u0131 ve \u015fifre gibi bilgilerle kay\u0131t olur. \u015eifre hashlenerek veritaban\u0131na kaydedilir.<\/li>\n<li><strong>Kullan\u0131c\u0131 Giri\u015fi (Login):<\/strong> Kullan\u0131c\u0131, kullan\u0131c\u0131 ad\u0131 ve \u015fifresiyle giri\u015f yapmaya \u00e7al\u0131\u015f\u0131r.<\/li>\n<li><strong>Token Olu\u015fturma:<\/strong> Sunucu, kullan\u0131c\u0131n\u0131n kimli\u011fini do\u011frulad\u0131ktan sonra, kullan\u0131c\u0131 bilgilerini i\u00e7eren bir JWT olu\u015fturur ve imzalar.<\/li>\n<li><strong>Token G\u00f6nderme:<\/strong> Sunucu, olu\u015fturulan JWT'yi istemciye yan\u0131t olarak g\u00f6nderir (genellikle HTTP ba\u015fl\u0131\u011f\u0131nda veya yan\u0131t g\u00f6vdesinde).<\/li>\n<li><strong>Token Depolama:<\/strong> \u0130stemci (taray\u0131c\u0131, mobil uygulama), token'\u0131 g\u00fcvenli bir \u015fekilde saklar (\u00f6rne\u011fin, localStorage, sessionStorage veya HTTP Only \u00e7erezleri).<\/li>\n<li><strong>Korunan Rotalara Eri\u015fim:<\/strong> \u0130stemci, korunan bir rotaya eri\u015fmek istedi\u011finde, saklad\u0131\u011f\u0131 JWT'yi her istekle birlikte HTTP <code>Authorization<\/code> ba\u015fl\u0131\u011f\u0131nda (<code>Bearer Token<\/code> format\u0131nda) sunucuya g\u00f6nderir.<\/li>\n<li><strong>Token Do\u011frulama:<\/strong> Sunucu, gelen JWT'yi do\u011frular (imzas\u0131n\u0131 kontrol eder, s\u00fcresinin dolup dolmad\u0131\u011f\u0131n\u0131 kontrol eder).<\/li>\n<li><strong>Yetkilendirme:<\/strong> Token ge\u00e7erliyse, sunucu token i\u00e7indeki bilgilere g\u00f6re kullan\u0131c\u0131n\u0131n istenen kayna\u011fa eri\u015fim yetkisi olup olmad\u0131\u011f\u0131n\u0131 kontrol eder.<\/li>\n<li><strong>Yan\u0131t:<\/strong> Sunucu, yetkilendirme durumuna g\u00f6re iste\u011fi i\u015fler ve yan\u0131t d\u00f6ner.<\/li>\n<\/ol>\n<h3>JWT Olu\u015fturma ve \u0130mzalama<\/h3>\n<p>\u015eimdi bir kullan\u0131c\u0131 kay\u0131t ve giri\u015f endpoint'i olu\u015ftural\u0131m ve ba\u015far\u0131l\u0131 giri\u015fte JWT \u00fcretelim.<\/p>\n<h4>Kullan\u0131c\u0131 Kayd\u0131 (Register) Endpoint'i<\/h4>\n<p><code>app.js<\/code> dosyan\u0131za a\u015fa\u011f\u0131daki kodu ekleyin. Basitlik ad\u0131na kullan\u0131c\u0131lar\u0131 bellekte tutaca\u011f\u0131z, ancak ger\u00e7ek bir uygulamada veritaban\u0131 kullanmal\u0131s\u0131n\u0131z.<\/p>\n<pre><code>\n\/\/ app.js (devam\u0131)\nconst bcrypt = require('bcryptjs');\nconst jwt = require('jsonwebtoken');\n\n\/\/ Ge\u00e7ici kullan\u0131c\u0131 veritaban\u0131\nconst users = []; \/\/ Ger\u00e7ek uygulamada MongoDB, PostgreSQL vb. kullan\u0131lmal\u0131\n\napp.post('\/register', async (req, res) => {\n    const { username, password } = req.body;\n\n    if (!username || !password) {\n        return res.status(400).json({ message: 'Kullan\u0131c\u0131 ad\u0131 ve \u015fifre gerekli.' });\n    }\n\n    \/\/ Kullan\u0131c\u0131 zaten var m\u0131 kontrol et\n    if (users.find(u => u.username === username)) {\n        return res.status(409).json({ message: 'Bu kullan\u0131c\u0131 ad\u0131 zaten mevcut.' });\n    }\n\n    try {\n        const hashedPassword = await bcrypt.hash(password, 10);\n        const newUser = { id: users.length + 1, username, password: hashedPassword };\n        users.push(newUser);\n        res.status(201).json({ message: 'Kullan\u0131c\u0131 ba\u015far\u0131yla kaydedildi.', user: { id: newUser.id, username: newUser.username } });\n    } catch (error) {\n        res.status(500).json({ message: 'Kay\u0131t s\u0131ras\u0131nda bir hata olu\u015ftu.', error: error.message });\n    }\n});\n<\/pre>\n<p><\/code><\/p>\n<h4>Kullan\u0131c\u0131 Giri\u015fi (Login) Endpoint'i<\/h4>\n<p>Giri\u015f ba\u015far\u0131l\u0131 oldu\u011funda, <code>jsonwebtoken.sign()<\/code> metodunu kullanarak bir JWT olu\u015fturaca\u011f\u0131z.<\/p>\n<pre><code>\n\/\/ app.js (devam\u0131)\napp.post('\/login', async (req, res) => {\n    const { username, password } = req.body;\n\n    if (!username || !password) {\n        return res.status(400).json({ message: 'Kullan\u0131c\u0131 ad\u0131 ve \u015fifre gerekli.' });\n    }\n\n    const user = users.find(u => u.username === username);\n    if (!user) {\n        return res.status(400).json({ message: 'Kullan\u0131c\u0131 ad\u0131 veya \u015fifre hatal\u0131.' });\n    }\n\n    try {\n        const isMatch = await bcrypt.compare(password, user.password);\n        if (!isMatch) {\n            return res.status(400).json({ message: 'Kullan\u0131c\u0131 ad\u0131 veya \u015fifre hatal\u0131.' });\n        }\n\n        \/\/ JWT olu\u015ftur\n        const token = jwt.sign(\n            { userId: user.id, username: user.username, role: 'user' }, \/\/ Payload\n            process.env.JWT_SECRET, \/\/ Gizli anahtar\n            { expiresIn: '1h' } \/\/ Token s\u00fcresi\n        );\n\n        res.status(200).json({ message: 'Giri\u015f ba\u015far\u0131l\u0131.', token });\n\n    } catch (error) {\n        res.status(500).json({ message: 'Giri\u015f s\u0131ras\u0131nda bir hata olu\u015ftu.', error: error.message });\n    }\n});\n<\/pre>\n<p><\/code><\/p>\n<h4><code>jsonwebtoken<\/code> K\u00fct\u00fcphanesinin Kullan\u0131m\u0131<\/h4>\n<p>Yukar\u0131daki \u00f6rnekte <code>jwt.sign()<\/code> metodunu kulland\u0131k:<\/p>\n<ul>\n<li>\u0130lk arg\u00fcman: Token'\u0131n payload'\u0131 olacak JavaScript nesnesi.<\/li>\n<li>\u0130kinci arg\u00fcman: Token'\u0131 imzalamak i\u00e7in kullan\u0131lacak gizli anahtar (<code>JWT_SECRET<\/code>).<\/li>\n<li>\u00dc\u00e7\u00fcnc\u00fc arg\u00fcman (iste\u011fe ba\u011fl\u0131): Token'\u0131n se\u00e7enekleri, \u00f6rne\u011fin <code>expiresIn<\/code> (token'\u0131n ne kadar s\u00fcre ge\u00e7erli olaca\u011f\u0131).<\/li>\n<\/ul>\n<h3>JWT Do\u011frulama ve Koruma<\/h3>\n<p>Bir kez token olu\u015fturuldu\u011funda, istemci bu token'\u0131 korunan rotalara eri\u015fmek i\u00e7in kullanacakt\u0131r. Sunucu taraf\u0131nda ise bu token'\u0131n ge\u00e7erlili\u011fini do\u011frulamam\u0131z gerekir.<\/p>\n<h4>Middleware Olu\u015fturma<\/h4>\n<p>Express.js'te middleware'ler, isteklere yan\u0131t vermeden \u00f6nce veya sonra \u00e7al\u0131\u015ft\u0131r\u0131lan fonksiyonlard\u0131r. JWT do\u011frulamas\u0131 i\u00e7in bir middleware olu\u015fturaca\u011f\u0131z.<\/p>\n<p><code>middleware\/auth.js<\/code> ad\u0131nda bir dosya olu\u015fturun:<\/p>\n<pre><code>\n\/\/ middleware\/auth.js\nconst jwt = require('jsonwebtoken');\n\nconst authenticateToken = (req, res, next) => {\n    const authHeader = req.headers['authorization'];\n    const token = authHeader && authHeader.split(' ')[1]; \/\/ Bearer TOKEN_STRING\n\n    if (token == null) {\n        return res.status(401).json({ message: 'Eri\u015fim reddedildi. Token bulunamad\u0131.' });\n    }\n\n    jwt.verify(token, process.env.JWT_SECRET, (err, user) => {\n        if (err) {\n            \/\/ Token ge\u00e7ersiz veya s\u00fcresi dolmu\u015f\n            return res.status(403).json({ message: 'Ge\u00e7ersiz veya s\u00fcresi dolmu\u015f token.' });\n        }\n        req.user = user; \/\/ Do\u011frulanm\u0131\u015f kullan\u0131c\u0131 bilgilerini iste\u011fe ekle\n        next(); \/\/ Bir sonraki middleware'e veya route handler'a ge\u00e7\n    });\n};\n\nmodule.exports = authenticateToken;\n<\/pre>\n<p><\/code><\/p>\n<h4>Token'\u0131 Header'dan \u00c7ekme<\/h4>\n<p>Yukar\u0131daki middleware'de, token'\u0131 HTTP <code>Authorization<\/code> ba\u015fl\u0131\u011f\u0131ndan \u00e7ekiyoruz. \u0130stemciler token'\u0131 genellikle <code>Bearer <TOKEN><\/code> format\u0131nda g\u00f6nderirler.<\/p>\n<pre><code>\nconst authHeader = req.headers['authorization'];\nconst token = authHeader && authHeader.split(' ')[1]; \/\/ \"Bearer TOKEN_STRING\" -> [\"Bearer\", \"TOKEN_STRING\"]\n<\/pre>\n<p><\/code><\/p>\n<h4>Token'\u0131 Do\u011frulama<\/h4>\n<p><code>jwt.verify()<\/code> metodu, token'\u0131 ve gizli anahtar\u0131 kullanarak token'\u0131n ge\u00e7erlili\u011fini kontrol eder. E\u011fer token ge\u00e7erliyse, payload'\u0131 i\u00e7eren bir <code>user<\/code> nesnesi d\u00f6ner. Ge\u00e7ersizse veya s\u00fcresi dolmu\u015fsa bir hata f\u0131rlat\u0131r.<\/p>\n<pre><code>\njwt.verify(token, process.env.JWT_SECRET, (err, user) => {\n    \/\/ ...\n});\n<\/pre>\n<p><\/code><\/p>\n<h4>Korunan Rotalara Uygulama<\/h4>\n<p>\u015eimdi bu middleware'i korumak istedi\u011fimiz rotalara uygulayal\u0131m. <code>app.js<\/code> dosyan\u0131za a\u015fa\u011f\u0131daki kodu ekleyin:<\/p>\n<pre><code>\n\/\/ app.js (devam\u0131)\nconst authenticateToken = require('.\/middleware\/auth');\n\napp.get('\/protected', authenticateToken, (req, res) => {\n    res.json({\n        message: 'Korunan rotaya ho\u015f geldiniz!',\n        user: req.user \/\/ Middleware'den gelen kullan\u0131c\u0131 bilgileri\n    });\n});\n\napp.get('\/admin', authenticateToken, (req, res) => {\n    if (req.user.role !== 'admin') {\n        return res.status(403).json({ message: 'Bu rotaya eri\u015fim yetkiniz yok.' });\n    }\n    res.json({ message: 'Admin paneline ho\u015f geldiniz!', user: req.user });\n});\n<\/pre>\n<p><\/code><\/p>\n<p>Art\u0131k <code>\/protected<\/code> rotas\u0131na eri\u015fmek i\u00e7in ge\u00e7erli bir JWT'ye ihtiyac\u0131n\u0131z var. <code>\/admin<\/code> rotas\u0131 ise hem ge\u00e7erli bir JWT hem de token i\u00e7indeki <code>role<\/code> de\u011ferinin 'admin' olmas\u0131n\u0131 gerektirir.<\/p>\n<h3>G\u00fcvenlik En \u0130yi Uygulamalar\u0131 ve Dikkat Edilmesi Gerekenler<\/h3>\n<p>JWT kullan\u0131rken g\u00fcvenli\u011fi art\u0131rmak i\u00e7in baz\u0131 \u00f6nemli noktalara dikkat etmek gerekir.<\/p>\n<h4>Secret Key G\u00fcvenli\u011fi<\/h4>\n<p><code>JWT_SECRET<\/code> kesinlikle gizli tutulmal\u0131d\u0131r. Asla versiyon kontrol sistemlerine (Git) y\u00fcklenmemeli ve g\u00fc\u00e7l\u00fc, rastgele bir dize olmal\u0131d\u0131r. Ortam de\u011fi\u015fkenleri veya \u00f6zel bir anahtar y\u00f6netim sistemi kullan\u0131n.<\/p>\n<h4>Token S\u00fcresi ve Yenileme<\/h4>\n<p><code>expiresIn<\/code> de\u011feri \u00e7ok uzun olmamal\u0131d\u0131r (\u00f6rne\u011fin, 15 dakika - 1 saat aras\u0131). K\u0131sa s\u00fcreli token'lar, \u00e7al\u0131nmalar\u0131 durumunda olu\u015fturabilecekleri zarar\u0131 s\u0131n\u0131rlar. Uzun s\u00fcreli oturumlar i\u00e7in token yenileme (refresh token) mekanizmas\u0131 kullan\u0131labilir. Refresh token'lar genellikle daha uzun \u00f6m\u00fcrl\u00fcd\u00fcr ve yeni bir access token almak i\u00e7in kullan\u0131l\u0131rlar. Refresh token'lar veritaban\u0131nda saklanmal\u0131 ve tek kullan\u0131ml\u0131k olmal\u0131d\u0131r.<\/p>\n<h4>Token Kara Listeleme (Blacklisting)<\/h4>\n<p>JWT'ler do\u011falar\u0131 gere\u011fi durumsuz olduklar\u0131ndan, bir token'\u0131 iptal etmek (\u00f6rne\u011fin, kullan\u0131c\u0131 \u00e7\u0131k\u0131\u015f yapt\u0131\u011f\u0131nda veya bir g\u00fcvenlik ihlali durumunda) zordur. Token'\u0131n s\u00fcresi dolana kadar ge\u00e7erli kal\u0131r. Bu sorunu \u00e7\u00f6zmek i\u00e7in, iptal edilen token'lar\u0131 bir kara listeye (veritaban\u0131, Redis gibi h\u0131zl\u0131 bir \u00f6nbellek) kaydedebilirsiniz. Her istekte, gelen token'\u0131n kara listede olup olmad\u0131\u011f\u0131n\u0131 kontrol edersiniz.<\/p>\n<h4>HTTPS Kullan\u0131m\u0131<\/h4>\n<p>T\u00fcm ileti\u015fim kanallar\u0131 (istemci-sunucu aras\u0131) HTTPS ile \u015fifrelenmelidir. Aksi takdirde, JWT'ler a\u011f \u00fczerinden d\u00fcz metin olarak iletilir ve dinleme sald\u0131r\u0131lar\u0131na (eavesdropping) a\u00e7\u0131k hale gelir.<\/p>\n<h4>XSS ve CSRF Korumas\u0131<\/h4>\n<ul>\n<li><strong>XSS (Cross-Site Scripting):<\/strong> JWT'leri <code>localStorage<\/code>'da saklamak XSS sald\u0131r\u0131lar\u0131na kar\u015f\u0131 savunmas\u0131z hale getirebilir, \u00e7\u00fcnk\u00fc k\u00f6t\u00fc ama\u00e7l\u0131 komut dosyalar\u0131 token'a eri\u015febilir. HTTP Only \u00e7erezleri bu riski azalt\u0131r \u00e7\u00fcnk\u00fc JavaScript bu \u00e7erezlere eri\u015femez.<\/li>\n<li><strong>CSRF (Cross-Site Request Forgery):<\/strong> HTTP Only \u00e7erezleri CSRF'ye kar\u015f\u0131 savunmas\u0131z olabilir. CSRF korumas\u0131 i\u00e7in genellikle anti-CSRF token'lar veya SameSite \u00e7erez niteli\u011fi kullan\u0131l\u0131r.<\/li>\n<\/ul>\n<h4>Payload'da Hassas Bilgi Saklamaktan Ka\u00e7\u0131n\u0131n<\/h4>\n<p>JWT payload'\u0131 Base64Url ile kodland\u0131\u011f\u0131 i\u00e7in herkes taraf\u0131ndan okunabilir. Bu nedenle, \u015fifreler, kredi kart\u0131 numaralar\u0131 gibi hassas bilgileri payload i\u00e7inde saklamay\u0131n. Sadece kullan\u0131c\u0131 kimli\u011fi ve yetkilendirme i\u00e7in gerekli minimum bilgiyi ekleyin.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>JWT kimlik do\u011frulama, modern web uygulamalar\u0131 i\u00e7in g\u00fc\u00e7l\u00fc, esnek ve \u00f6l\u00e7eklenebilir bir \u00e7\u00f6z\u00fcmd\u00fcr. Node.js ve Express.js ile entegrasyonu olduk\u00e7a basittir ve geli\u015ftiricilere stateless API'ler olu\u015fturma imkan\u0131 sunar. Ancak, g\u00fcvenlik en iyi uygulamalar\u0131na dikkat etmek, \u00f6zellikle secret key'in korunmas\u0131, token s\u00fcrelerinin y\u00f6netimi ve uygun depolama stratejilerinin kullan\u0131lmas\u0131 kritik \u00f6neme sahiptir. Bu rehber sayesinde, JWT tabanl\u0131 kimlik do\u011frulama sistemlerini g\u00fcvenli ve etkili bir \u015fekilde uygulayabilecek bilgiye sahip oldu\u011funuzu umuyoruz.<\/p>\n<h3>SSS (S\u0131k Sorulan Sorular)<\/h3>\n<h4>JWT ile oturum tabanl\u0131 kimlik do\u011frulama aras\u0131ndaki temel fark nedir?<\/h4>\n<p>JWT, sunucu taraf\u0131nda oturum durumu (state) tutmaz; her token kendi i\u00e7inde gerekli t\u00fcm bilgiyi bar\u0131nd\u0131r\u0131r. Oturum tabanl\u0131 sistemler ise sunucuda oturum kimli\u011fini ve ilgili verileri saklar. JWT'nin durumsuz yap\u0131s\u0131, \u00f6zellikle da\u011f\u0131t\u0131k sistemlerde ve \u00f6l\u00e7eklenebilirlik a\u00e7\u0131s\u0131ndan avantaj sa\u011flar.<\/p>\n<h4>JWT'yi istemci taraf\u0131nda nerede saklamal\u0131y\u0131m?<\/h4>\n<p>Bu, bir tart\u0131\u015fma konusudur. Se\u00e7enekler aras\u0131nda <code>localStorage<\/code>, <code>sessionStorage<\/code> ve HTTP Only \u00e7erezleri bulunur. <code>localStorage<\/code> ve <code>sessionStorage<\/code> XSS sald\u0131r\u0131lar\u0131na kar\u015f\u0131 savunmas\u0131zken, HTTP Only \u00e7erezleri JavaScript eri\u015fimine kapal\u0131 oldu\u011fu i\u00e7in XSS riskini azalt\u0131r. Ancak HTTP Only \u00e7erezleri de CSRF'ye kar\u015f\u0131 dikkatli olunmas\u0131n\u0131 gerektirir.<\/p>\n<h4>Token'\u0131n s\u00fcresi doldu\u011funda ne yapmal\u0131y\u0131m?<\/h4>\n<p>Token'\u0131n s\u00fcresi doldu\u011funda, istemci genellikle bir hata al\u0131r (403 Forbidden). Bu durumda, istemci yeni bir access token almak i\u00e7in refresh token kullanabilir (e\u011fer bir refresh token mekanizmas\u0131 uyguland\u0131ysa) veya kullan\u0131c\u0131dan tekrar giri\u015f yapmas\u0131n\u0131 isteyebilir.<\/p>\n<h4>JWT'ler neden \u015fifrelenmez?<\/h4>\n<p>JWT'ler varsay\u0131lan olarak \u015fifrelenmez, sadece imzalan\u0131r. \u0130mzalama, token i\u00e7eri\u011finin de\u011fi\u015ftirilmedi\u011fini garanti ederken, \u015fifreleme token i\u00e7eri\u011finin okunmas\u0131n\u0131 engeller. E\u011fer token i\u00e7indeki bilgilerin gizli kalmas\u0131 gerekiyorsa, JSON Web Encryption (JWE) kullan\u0131labilir, ancak bu, JWT'nin temel kullan\u0131m durumundan daha karma\u015f\u0131kt\u0131r.<\/p>\n<h4>Bir JWT'yi nas\u0131l iptal edebilirim (logout veya g\u00fcvenlik ihlali durumunda)?<\/h4>\n<p>JWT'ler durumsuz oldu\u011fu i\u00e7in do\u011frudan iptal edilemezler; s\u00fcresi dolana kadar ge\u00e7erli kal\u0131rlar. \u0130ptal mekanizmas\u0131 i\u00e7in genellikle bir kara liste (blacklist) kullan\u0131l\u0131r. \u0130ptal edilmek istenen token'lar, s\u00fcresi dolana kadar bir veritaban\u0131na veya \u00f6nbelle\u011fe kaydedilir ve her istekte token'\u0131n kara listede olup olmad\u0131\u011f\u0131 kontrol edilir.<\/p>\n","protected":false},"excerpt":{"rendered":"JSON Web Token (JWT), taraflar aras\u0131nda g\u00fcvenli bir \u015fekilde bilgi al\u0131\u015fveri\u015fini sa\u011flayan kompakt, URL g\u00fcvenli bir y\u00f6ntemdir. \u00d6zellikle API tabanl\u0131 &#8230;","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":[136],"tags":[],"class_list":{"0":"post-38377","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-node-js","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>Express.js ve Node.js&#039;te JWT Kimlik Do\u011frulama: Kapsaml\u0131 Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\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\/express-js-ve-node-jste-jwt-kimlik-dogrulama-kapsamli-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Express.js ve Node.js&#039;te JWT Kimlik Do\u011frulama: Kapsaml\u0131 Rehber\" \/>\n<meta property=\"og:description\" content=\"JSON Web Token (JWT), taraflar aras\u0131nda g\u00fcvenli bir \u015fekilde bilgi al\u0131\u015fveri\u015fini sa\u011flayan kompakt, URL g\u00fcvenli bir y\u00f6ntemdir. \u00d6zellikle API tabanl\u0131 ...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/express-js-ve-node-jste-jwt-kimlik-dogrulama-kapsamli-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-29T20:00:43+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=\"15 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/express-js-ve-node-jste-jwt-kimlik-dogrulama-kapsamli-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/express-js-ve-node-jste-jwt-kimlik-dogrulama-kapsamli-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Express.js ve Node.js&#8217;te JWT Kimlik Do\u011frulama: Kapsaml\u0131 Rehber\",\"datePublished\":\"2026-01-29T20:00:43+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/express-js-ve-node-jste-jwt-kimlik-dogrulama-kapsamli-rehber\/\"},\"wordCount\":2269,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Node.js\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/express-js-ve-node-jste-jwt-kimlik-dogrulama-kapsamli-rehber\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/express-js-ve-node-jste-jwt-kimlik-dogrulama-kapsamli-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/express-js-ve-node-jste-jwt-kimlik-dogrulama-kapsamli-rehber\/\",\"name\":\"Express.js ve Node.js'te JWT Kimlik Do\u011frulama: Kapsaml\u0131 Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-01-29T20:00:43+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/express-js-ve-node-jste-jwt-kimlik-dogrulama-kapsamli-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/express-js-ve-node-jste-jwt-kimlik-dogrulama-kapsamli-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/express-js-ve-node-jste-jwt-kimlik-dogrulama-kapsamli-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Express.js ve Node.js&#8217;te JWT Kimlik Do\u011frulama: Kapsaml\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":"Express.js ve Node.js'te JWT Kimlik Do\u011frulama: Kapsaml\u0131 Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","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\/express-js-ve-node-jste-jwt-kimlik-dogrulama-kapsamli-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"Express.js ve Node.js'te JWT Kimlik Do\u011frulama: Kapsaml\u0131 Rehber","og_description":"JSON Web Token (JWT), taraflar aras\u0131nda g\u00fcvenli bir \u015fekilde bilgi al\u0131\u015fveri\u015fini sa\u011flayan kompakt, URL g\u00fcvenli bir y\u00f6ntemdir. \u00d6zellikle API tabanl\u0131 ...","og_url":"https:\/\/fatihsoysal.com\/blog\/express-js-ve-node-jste-jwt-kimlik-dogrulama-kapsamli-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-01-29T20:00:43+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"15 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/express-js-ve-node-jste-jwt-kimlik-dogrulama-kapsamli-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/express-js-ve-node-jste-jwt-kimlik-dogrulama-kapsamli-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Express.js ve Node.js&#8217;te JWT Kimlik Do\u011frulama: Kapsaml\u0131 Rehber","datePublished":"2026-01-29T20:00:43+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/express-js-ve-node-jste-jwt-kimlik-dogrulama-kapsamli-rehber\/"},"wordCount":2269,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Node.js"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/express-js-ve-node-jste-jwt-kimlik-dogrulama-kapsamli-rehber\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/express-js-ve-node-jste-jwt-kimlik-dogrulama-kapsamli-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/express-js-ve-node-jste-jwt-kimlik-dogrulama-kapsamli-rehber\/","name":"Express.js ve Node.js'te JWT Kimlik Do\u011frulama: Kapsaml\u0131 Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-01-29T20:00:43+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/express-js-ve-node-jste-jwt-kimlik-dogrulama-kapsamli-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/express-js-ve-node-jste-jwt-kimlik-dogrulama-kapsamli-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/express-js-ve-node-jste-jwt-kimlik-dogrulama-kapsamli-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Express.js ve Node.js&#8217;te JWT Kimlik Do\u011frulama: Kapsaml\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\/38377","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=38377"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/38377\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=38377"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=38377"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=38377"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}