{"id":36234,"date":"2025-12-11T02:40:46","date_gmt":"2025-12-10T23:40:46","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=36234"},"modified":"2025-12-11T02:40:46","modified_gmt":"2025-12-10T23:40:46","slug":"javada-oturum-yonetimi-httpservlet-cerezler-ve-url-yeniden-yazma","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/javada-oturum-yonetimi-httpservlet-cerezler-ve-url-yeniden-yazma\/","title":{"rendered":"Java&#8217;da Oturum Y\u00f6netimi &#8211; HttpServlet, \u00c7erezler ve URL Yeniden Yazma"},"content":{"rendered":"<p><body><\/p>\n<h2>Java&#8217;da Oturum Y\u00f6netimi &#8211; HttpServlet, \u00c7erezler ve URL Yeniden Yazma<\/h2>\n<h2>Giri\u015f<\/h2>\n<p>Web uygulamalar\u0131n\u0131n temel ta\u015flar\u0131ndan biri olan oturum y\u00f6netimi, kullan\u0131c\u0131lar\u0131n bir web sitesi veya uygulama ile etkile\u015fimleri s\u0131ras\u0131nda durumlar\u0131n\u0131 korumak i\u00e7in kritik bir mekanizmad\u0131r. \u0130nternet, do\u011fas\u0131 gere\u011fi durumsuz (stateless) olan HTTP protokol\u00fc \u00fczerine kuruludur. Bu durumsuz yap\u0131, her iste\u011fin birbirinden ba\u011f\u0131ms\u0131z oldu\u011fu anlam\u0131na gelir; sunucu, \u00f6nceki bir istekle ilgili hi\u00e7bir bilgiyi varsay\u0131lan olarak hat\u0131rlamaz. Ancak modern web uygulamalar\u0131, bir kullan\u0131c\u0131n\u0131n sepetindeki \u00fcr\u00fcnleri hat\u0131rlamak, giri\u015f yapm\u0131\u015f bir kullan\u0131c\u0131n\u0131n kimli\u011fini do\u011frulamak veya ki\u015fiselle\u015ftirilmi\u015f bir deneyim sunmak gibi durum bilgisi gerektiren i\u015flevlere ihtiya\u00e7 duyar. \u0130\u015fte bu noktada oturum y\u00f6netimi devreye girer.<\/p>\n<p>Java EE (\u015fimdiki ad\u0131yla Jakarta EE) platformu, <code>HttpServlet<\/code> aray\u00fcz\u00fc, \u00e7erezler (cookies) ve URL yeniden yazma (URL rewriting) gibi g\u00fc\u00e7l\u00fc ara\u00e7lar arac\u0131l\u0131\u011f\u0131yla kapsaml\u0131 ve esnek bir oturum y\u00f6netimi \u00e7\u00f6z\u00fcm\u00fc sunar. Bu makale, Java tabanl\u0131 web uygulamalar\u0131nda oturum y\u00f6netiminin temellerini, mekanizmalar\u0131n\u0131, uygulama y\u00f6ntemlerini ve g\u00fcvenlik hususlar\u0131n\u0131 ayr\u0131nt\u0131l\u0131 olarak inceleyecektir.<\/p>\n<h2>HTTP ve Durumsuz Yap\u0131s\u0131<\/h2>\n<p>Hypertext Transfer Protocol (HTTP), web&#8217;in ileti\u015fim omurgas\u0131d\u0131r. Temel \u00f6zelli\u011fi, her istemci iste\u011finin (request) ve sunucu yan\u0131t\u0131n\u0131n (response) birbirinden ba\u011f\u0131ms\u0131z olmas\u0131d\u0131r. Bir kullan\u0131c\u0131 bir web sayfas\u0131n\u0131 talep etti\u011finde, taray\u0131c\u0131 sunucuya bir HTTP iste\u011fi g\u00f6nderir. Sunucu bu iste\u011fi i\u015fler ve bir HTTP yan\u0131t\u0131 d\u00f6nd\u00fcr\u00fcr. Bu i\u015flem tamamland\u0131\u011f\u0131nda, sunucu ve istemci aras\u0131ndaki ba\u011flant\u0131 genellikle kapan\u0131r ve sunucu, bu kullan\u0131c\u0131n\u0131n kim oldu\u011funu veya daha \u00f6nce ne yapt\u0131\u011f\u0131n\u0131 unutur.<\/p>\n<p>Bu durumsuz yap\u0131, HTTP&#8217;nin basit, h\u0131zl\u0131 ve \u00f6l\u00e7eklenebilir olmas\u0131n\u0131 sa\u011flarken, ayn\u0131 zamanda karma\u015f\u0131k web uygulamalar\u0131 i\u00e7in bir zorluk te\u015fkil eder. \u00d6rne\u011fin, bir e-ticaret sitesinde kullan\u0131c\u0131 sepete \u00fcr\u00fcn ekledi\u011finde, ard\u0131ndan ba\u015fka bir sayfaya gitti\u011finde ve sonra \u00f6deme sayfas\u0131na ge\u00e7ti\u011finde, sistemin kullan\u0131c\u0131n\u0131n sepetindeki \u00fcr\u00fcnleri ve kimli\u011fini hat\u0131rlamas\u0131 gerekir. HTTP&#8217;nin do\u011fal durumsuzlu\u011fu bu t\u00fcr senaryolar\u0131 do\u011frudan desteklemez. Oturum y\u00f6netimi, bu durumsuzlu\u011fun \u00fcstesinden gelmek ve bir dizi ba\u011f\u0131ms\u0131z HTTP iste\u011fini mant\u0131ksal olarak ili\u015fkili tek bir &#8220;oturum&#8221; i\u00e7inde birle\u015ftirmek i\u00e7in geli\u015ftirilmi\u015ftir.<\/p>\n<h2>Oturum Y\u00f6netiminin Temelleri<\/h2>\n<p>Oturum y\u00f6netimi, bir kullan\u0131c\u0131n\u0131n belirli bir zaman dilimi i\u00e7inde web uygulamas\u0131yla yapt\u0131\u011f\u0131 bir dizi etkile\u015fimi izlemek ve s\u00fcrd\u00fcrmek i\u00e7in kullan\u0131lan bir y\u00f6ntemdir.<\/p>\n<h3>Oturum Nedir?<\/h3>\n<p>Bir oturum, bir kullan\u0131c\u0131n\u0131n bir web uygulamas\u0131na giri\u015f yapmas\u0131ndan (veya uygulamayla ilk etkile\u015fiminden) \u00e7\u0131k\u0131\u015f yapmas\u0131na (veya belirli bir s\u00fcre i\u015flem yapmamas\u0131na) kadar ge\u00e7en s\u00fcreci ifade eder. Bu s\u00fcre zarf\u0131nda, uygulamaya \u00f6zg\u00fc veriler (kullan\u0131c\u0131 kimli\u011fi, sepet i\u00e7eri\u011fi, dil tercihleri vb.) sunucu taraf\u0131nda saklanabilir ve kullan\u0131c\u0131n\u0131n farkl\u0131 istekleri aras\u0131nda payla\u015f\u0131labilir.<\/p>\n<h3>Oturum Kimli\u011fi (Session ID)<\/h3>\n<p>Her oturum, sunucu taraf\u0131ndan benzersiz bir \u015fekilde olu\u015fturulan ve y\u00f6netilen bir oturum kimli\u011fi (Session ID) ile tan\u0131mlan\u0131r. Bu kimlik, sunucunun belirli bir kullan\u0131c\u0131ya ait oturum verilerini bulmas\u0131n\u0131 sa\u011flar. Kullan\u0131c\u0131 her istek yapt\u0131\u011f\u0131nda, bu oturum kimli\u011fini sunucuya geri g\u00f6nderir. Sunucu, gelen oturum kimli\u011fini kullanarak ilgili oturum verilerine eri\u015fir.<\/p>\n<h3>Oturum Verileri<\/h3>\n<p>Oturum verileri, sunucu taraf\u0131nda saklanan ve belirli bir oturumla ili\u015fkili olan bilgilerdir. Bu veriler, kullan\u0131c\u0131n\u0131n kimli\u011fi, yetkilendirme bilgileri, al\u0131\u015fveri\u015f sepeti i\u00e7eri\u011fi, form verileri veya di\u011fer ki\u015fiselle\u015ftirilmi\u015f ayarlar gibi \u00e7e\u015fitli bilgileri i\u00e7erebilir. Oturum verilerinin sunucu taraf\u0131nda saklanmas\u0131, istemcinin bu verilere do\u011frudan eri\u015fmesini veya bunlar\u0131 manip\u00fcle etmesini engelledi\u011fi i\u00e7in g\u00fcvenlik a\u00e7\u0131s\u0131ndan \u00f6nemlidir.<\/p>\n<h2>Java EE\/Jakarta EE&#8217;de Oturum Y\u00f6netimi<\/h2>\n<p>Java EE\/Jakarta EE platformu, <code>javax.servlet.http.HttpServletRequest<\/code> ve <code>javax.servlet.http.HttpSession<\/code> aray\u00fczleri arac\u0131l\u0131\u011f\u0131yla standart bir oturum y\u00f6netimi API&#8217;si sa\u011flar. Bu API, geli\u015ftiricilerin oturumlar\u0131 kolayca olu\u015fturmas\u0131na, y\u00f6netmesine ve kullanmas\u0131na olanak tan\u0131r.<\/p>\n<h3>HttpServletRequest ve HttpSession Aray\u00fczleri<\/h3>\n<p>Bir servlet, bir istemciden gelen her HTTP iste\u011fini <code>HttpServletRequest<\/code> nesnesi olarak al\u0131r. Bu nesne, istekle ilgili t\u00fcm bilgileri (parametreler, ba\u015fl\u0131klar, \u00e7erezler vb.) i\u00e7erir. Oturum y\u00f6netimi i\u00e7in <code>HttpServletRequest<\/code> objesinin \u00f6nemli bir metodu <code>getSession()<\/code> metodudur.<\/p>\n<h4><code>getSession()<\/code> ve <code>getSession(boolean)<\/code> Metotlar\u0131<\/h4>\n<p>*   <code>request.getSession()<\/code>: Bu metot, mevcut oturumu d\u00f6nd\u00fcr\u00fcr. E\u011fer istemci i\u00e7in hen\u00fcz bir oturum yoksa, sunucu yeni bir <code>HttpSession<\/code> nesnesi olu\u015fturur, ona benzersiz bir oturum kimli\u011fi atar ve bu kimli\u011fi istemciye g\u00f6nderir.<br \/>\n*   <code>request.getSession(true)<\/code>: <code>getSession()<\/code> ile ayn\u0131d\u0131r. Mevcut oturumu d\u00f6nd\u00fcr\u00fcr veya yoksa yeni bir oturum olu\u015fturur.<br \/>\n*   <code>request.getSession(false)<\/code>: Bu metot sadece mevcut oturumu d\u00f6nd\u00fcr\u00fcr. E\u011fer istemci i\u00e7in mevcut bir oturum yoksa <code>null<\/code> d\u00f6nd\u00fcr\u00fcr ve yeni bir oturum olu\u015fturmaz. Bu, bir oturumun zaten var olup olmad\u0131\u011f\u0131n\u0131 kontrol etmek i\u00e7in kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<p><code>HttpSession<\/code> nesnesi, belirli bir kullan\u0131c\u0131n\u0131n oturum verilerini depolamak ve y\u00f6netmek i\u00e7in kullan\u0131l\u0131r. Bu nesne, sunucu taraf\u0131nda bellekte saklan\u0131r ve oturum kimli\u011fi arac\u0131l\u0131\u011f\u0131yla eri\u015filir.<\/p>\n<h4><code>HttpSession<\/code> Objesi Metotlar\u0131:<\/h4>\n<p>*   <code>void setAttribute(String name, Object value)<\/code>: Belirtilen ad\u0131 ve de\u011feri oturumda saklar. Bu, oturum verilerini kaydetmek i\u00e7in kullan\u0131l\u0131r.<br \/>\n*   <code>Object getAttribute(String name)<\/code>: Belirtilen ada sahip de\u011feri oturumdan al\u0131r. E\u011fer bu adda bir \u00f6znitelik yoksa <code>null<\/code> d\u00f6nd\u00fcr\u00fcr.<br \/>\n*   <code>void removeAttribute(String name)<\/code>: Belirtilen ada sahip \u00f6zniteli\u011fi oturumdan kald\u0131r\u0131r.<br \/>\n*   <code>void invalidate()<\/code>: Oturumu ge\u00e7ersiz k\u0131lar ve t\u00fcm ba\u011fl\u0131 \u00f6znitelikleri kald\u0131r\u0131r. Bu, genellikle kullan\u0131c\u0131 \u00e7\u0131k\u0131\u015f yapt\u0131\u011f\u0131nda (logout) kullan\u0131l\u0131r.<br \/>\n*   <code>String getId()<\/code>: Oturumun benzersiz kimli\u011fini d\u00f6nd\u00fcr\u00fcr.<br \/>\n*   <code>long getCreationTime()<\/code>: Oturumun olu\u015fturuldu\u011fu zaman\u0131 milisaniye cinsinden d\u00f6nd\u00fcr\u00fcr.<br \/>\n*   <code>long getLastAccessedTime()<\/code>: Oturumun en son eri\u015fildi\u011fi zaman\u0131 milisaniye cinsinden d\u00f6nd\u00fcr\u00fcr.<br \/>\n*   <code>void setMaxInactiveInterval(int interval)<\/code>: Oturumun otomatik olarak ge\u00e7ersiz k\u0131l\u0131nmadan \u00f6nce ne kadar s\u00fcre (saniye cinsinden) etkin kalaca\u011f\u0131n\u0131 belirler.<br \/>\n*   <code>int getMaxInactiveInterval()<\/code>: Oturumun maksimum etkin olmayan s\u00fcresini d\u00f6nd\u00fcr\u00fcr.<\/p>\n<p><strong>\u00d6rnek Kullan\u0131m:<\/strong><\/p>\n<pre><code class=\"language-java\">import jakarta.servlet.ServletException;\nimport jakarta.servlet.annotation.WebServlet;\nimport jakarta.servlet.http.HttpServlet;\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport jakarta.servlet.http.HttpSession;\n\nimport java.io.IOException;\nimport java.io.PrintWriter;\n\n@WebServlet(\"\/sessionExample\")\npublic class SessionExampleServlet extends HttpServlet {\n    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {\n        response.setContentType(\"text\/html;charset=UTF-8\");\n        PrintWriter out = response.getWriter();\n\n        \/\/ Oturumu al veya yeni bir oturum olu\u015ftur\n        HttpSession session = request.getSession();\n\n        String userName = (String) session.getAttribute(\"userName\");\n        Integer visitCount = (Integer) session.getAttribute(\"visitCount\");\n\n        out.println(\"<html><body>\");\n\n        if (userName == null) {\n            \/\/ Kullan\u0131c\u0131 ilk defa geliyorsa veya oturum yeni ise\n            userName = \"Misafir\"; \/\/ Varsay\u0131lan de\u011fer\n            session.setAttribute(\"userName\", userName);\n            visitCount = 1;\n            session.setAttribute(\"visitCount\", visitCount);\n            out.println(\"<h2>Ho\u015f Geldiniz, \" + userName + \"!<\/h2>\");\n            out.println(\"<p>Bu sizin ilk ziyaretiniz.<\/p>\");\n        } else {\n            \/\/ Mevcut bir oturum varsa\n            visitCount++;\n            session.setAttribute(\"visitCount\", visitCount);\n            out.println(\"<h2>Tekrar Ho\u015f Geldiniz, \" + userName + \"!<\/h2>\");\n            out.println(\"<p>Toplam ziyaret say\u0131n\u0131z: \" + visitCount + \"<\/p>\");\n        }\n\n        out.println(\"<p>Oturum ID: \" + session.getId() + \"<\/p>\");\n        out.println(\"<p><a href='logout'>\u00c7\u0131k\u0131\u015f Yap<\/a><\/p>\");\n        out.println(\"<\/body><\/html>\");\n    }\n}<\/code><\/pre>\n<h2>Oturum Y\u00f6netim Mekanizmalar\u0131<\/h2>\n<p>Java EE\/Jakarta EE, oturum kimli\u011fini istemci ile sunucu aras\u0131nda ta\u015f\u0131mak i\u00e7in iki ana mekanizma kullan\u0131r: \u00e7erezler ve URL yeniden yazma.<\/p>\n<h3>\u00c7erezler (Cookies)<\/h3>\n<p>\u00c7erezler, sunucunun istemcinin web taray\u0131c\u0131s\u0131na g\u00f6nderdi\u011fi k\u00fc\u00e7\u00fck metin par\u00e7ac\u0131klar\u0131d\u0131r. Taray\u0131c\u0131 bu \u00e7erezleri saklar ve ayn\u0131 sunucuya yap\u0131lan sonraki t\u00fcm isteklerle birlikte otomatik olarak geri g\u00f6nderir. Bu mekanizma, HTTP&#8217;nin durumsuz yap\u0131s\u0131n\u0131 a\u015fmak i\u00e7in en yayg\u0131n ve tercih edilen y\u00f6ntemdir.<\/p>\n<h4>\u00c7erezlerin Rol\u00fc<\/h4>\n<p>Oturum y\u00f6netiminde \u00e7erezler, oturum kimli\u011fini (Session ID) saklamak i\u00e7in kullan\u0131l\u0131r. Sunucu yeni bir oturum olu\u015fturdu\u011funda, bu oturumun benzersiz kimli\u011fini i\u00e7eren \u00f6zel bir \u00e7erez (genellikle <code>JSESSIONID<\/code> adl\u0131) olu\u015fturur ve bunu yan\u0131tla birlikte istemciye g\u00f6nderir. \u0130stemci taray\u0131c\u0131s\u0131 bu \u00e7erezi saklar ve ayn\u0131 uygulaman\u0131n sunucusuna yap\u0131lan her sonraki istekle birlikte otomatik olarak geri g\u00f6nderir. Sunucu, gelen <code>JSESSIONID<\/code> \u00e7erezini okuyarak ilgili <code>HttpSession<\/code> nesnesini bulur ve kullan\u0131c\u0131n\u0131n oturum verilerine eri\u015fir.<\/p>\n<h4><code>JSESSIONID<\/code> \u00c7erezi<\/h4>\n<p><code>JSESSIONID<\/code> \u00e7erezi, Java servlet konteynerleri (Tomcat, Jetty, WildFly vb.) taraf\u0131ndan otomatik olarak olu\u015fturulan ve y\u00f6netilen \u00f6zel bir \u00e7erezdir. Geli\u015ftiricilerin bu \u00e7erezi manuel olarak olu\u015fturmas\u0131na veya okumas\u0131na genellikle gerek kalmaz; servlet konteyneri bu s\u00fcreci arka planda halleder.<\/p>\n<h4>\u00c7erezlerin Olu\u015fturulmas\u0131 ve Y\u00f6netimi<\/h4>\n<p>Servlet konteyneri, <code>request.getSession()<\/code> \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda otomatik olarak <code>JSESSIONID<\/code> \u00e7erezini olu\u015fturur ve <code>response.addCookie()<\/code> metodunu kullanarak istemciye g\u00f6nderir. \u00c7erezlerin \u00f6mr\u00fc, etki alan\u0131, yolu ve g\u00fcvenlik ayarlar\u0131 gibi \u00f6zellikleri vard\u0131r.<\/p>\n<p><strong>\u00d6rnek \u00c7erez Olu\u015fturma (Genel \u00c7erezler \u0130\u00e7in):<\/strong><\/p>\n<pre><code class=\"language-java\">\/\/ Bir \u00e7erez olu\u015fturma ve istemciye g\u00f6nderme\nCookie userCookie = new Cookie(\"user_preference\", \"dark_mode\");\nuserCookie.setMaxAge(60 <em> 60 <\/em> 24 * 30); \/\/ 30 g\u00fcn boyunca ge\u00e7erli\nuserCookie.setPath(\"\/\"); \/\/ T\u00fcm site i\u00e7in ge\u00e7erli\nresponse.addCookie(userCookie);<\/code><\/pre>\n<p><code>JSESSIONID<\/code> \u00e7erezi i\u00e7in bu t\u00fcr manuel bir i\u015fleme gerek yoktur, konteyner bunu otomatik yapar.<\/p>\n<h4>\u00c7erez G\u00fcvenli\u011fi<\/h4>\n<p>\u00c7erezler, oturum y\u00f6netiminin temelini olu\u015fturdu\u011fundan, g\u00fcvenlikleri hayati \u00f6nem ta\u015f\u0131r.<br \/>\n*   <strong><code>HttpOnly<\/code><\/strong>: Bu bayrak, \u00e7erezin istemci taraf\u0131 JavaScript kodu taraf\u0131ndan eri\u015filememesini sa\u011flar. Bu, XSS (Cross-Site Scripting) sald\u0131r\u0131lar\u0131 yoluyla oturum \u00e7erezlerinin \u00e7al\u0131nmas\u0131n\u0131 \u00f6nlemeye yard\u0131mc\u0131 olur. Servlet konteynerleri genellikle <code>JSESSIONID<\/code> \u00e7erezini varsay\u0131lan olarak <code>HttpOnly<\/code> olarak ayarlar.<br \/>\n*   <strong><code>Secure<\/code><\/strong>: Bu bayrak, \u00e7erezin yaln\u0131zca HTTPS (\u015fifreli) ba\u011flant\u0131lar \u00fczerinden g\u00f6nderilmesini sa\u011flar. Bu, \u00e7erezin a\u011f \u00fczerindeki k\u00f6t\u00fc niyetli ki\u015filer taraf\u0131ndan ele ge\u00e7irilmesini (man-in-the-middle sald\u0131r\u0131lar\u0131) \u00f6nler. \u00dcretim ortamlar\u0131nda her zaman HTTPS kullan\u0131lmal\u0131 ve <code>Secure<\/code> bayra\u011f\u0131 etkinle\u015ftirilmelidir.<br \/>\n*   <strong><code>SameSite<\/code><\/strong>: Bu bayrak, \u00e7erezin \u00e7apraz site isteklerinde nas\u0131l davranaca\u011f\u0131n\u0131 kontrol eder. CSRF (Cross-Site Request Forgery) sald\u0131r\u0131lar\u0131n\u0131 \u00f6nlemeye yard\u0131mc\u0131 olur. <code>SameSite=Lax<\/code> veya <code>SameSite=Strict<\/code> gibi de\u011ferler alabilir.<\/p>\n<p>Bu g\u00fcvenlik ayarlar\u0131 <code>web.xml<\/code> dosyas\u0131nda veya programatik olarak yap\u0131land\u0131r\u0131labilir.<\/p>\n<pre><code class=\"language-xml\"><!-- web.xml'de oturum \u00e7erezi ayarlar\u0131 -->\n<session-config>\n    <session-timeout>30<\/session-timeout> <!-- Dakika cinsinden -->\n    <cookie-config>\n        <http-only>true<\/http-only>\n        <secure>true<\/secure>\n        <same-site>Lax<\/same-site>\n    <\/cookie-config>\n<\/session-config><\/code><\/pre>\n<h3>URL Yeniden Yazma (URL Rewriting)<\/h3>\n<p>\u00c7erezlerin devre d\u0131\u015f\u0131 b\u0131rak\u0131ld\u0131\u011f\u0131 veya taray\u0131c\u0131 taraf\u0131ndan desteklenmedi\u011fi durumlarda (\u00e7ok nadir), oturum kimli\u011fini istemci ile sunucu aras\u0131nda ta\u015f\u0131mak i\u00e7in alternatif bir y\u00f6ntem olan URL yeniden yazma kullan\u0131l\u0131r.<\/p>\n<h4>\u00c7erezlerin Devre D\u0131\u015f\u0131 B\u0131rak\u0131lmas\u0131 Durumu<\/h4>\n<p>Baz\u0131 kullan\u0131c\u0131lar gizlilik endi\u015feleri nedeniyle taray\u0131c\u0131lar\u0131nda \u00e7erezleri devre d\u0131\u015f\u0131 b\u0131rakabilirler. Bu durumda, sunucu <code>JSESSIONID<\/code> \u00e7erezini g\u00f6nderse bile taray\u0131c\u0131 onu saklamaz ve sonraki isteklerle birlikte geri g\u00f6ndermez. Bu senaryoda, uygulama oturum bilgisini kaybeder. URL yeniden yazma, bu sorunu \u00e7\u00f6zmek i\u00e7in geli\u015ftirilmi\u015ftir.<\/p>\n<h4>Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/h4>\n<p>URL yeniden yazma, oturum kimli\u011finin her URL&#8217;ye bir sorgu parametresi olarak veya yol de\u011fi\u015fkeni olarak eklenmesi prensibine dayan\u0131r. \u00d6rne\u011fin, <code>http:\/\/example.com\/myapp\/page.jsp<\/code> URL&#8217;si, oturum kimli\u011fi eklendi\u011finde \u015f\u00f6yle g\u00f6r\u00fcnebilir: <code>http:\/\/example.com\/myapp\/page.jsp;jsessionid=ABCD12345EFGH6789<\/code>.<br \/>\nSunucu, gelen iste\u011fin URL&#8217;sindeki oturum kimli\u011fini ayr\u0131\u015ft\u0131r\u0131r ve ilgili oturuma eri\u015fir. Uygulama i\u00e7indeki t\u00fcm ba\u011flant\u0131lar\u0131n ve form eylemlerinin, oturum kimli\u011fini i\u00e7erecek \u015fekilde yeniden yaz\u0131lmas\u0131 gerekir.<\/p>\n<h4><code>response.encodeURL()<\/code> ve <code>response.encodeRedirectURL()<\/code><\/h4>\n<p>Java servlet API&#8217;si, URL&#8217;leri otomatik olarak yeniden yazmak i\u00e7in iki metot sa\u011flar:<br \/>\n*   <code>response.encodeURL(String url)<\/code>: Bu metot, HTML \u00e7\u0131kt\u0131s\u0131nda kullan\u0131lan URL&#8217;leri kodlamak i\u00e7in kullan\u0131l\u0131r. E\u011fer istemci \u00e7erezleri desteklemiyorsa ve bir oturum mevcutsa, oturum kimli\u011fini URL&#8217;ye ekler. Aksi takdirde, URL&#8217;yi oldu\u011fu gibi d\u00f6nd\u00fcr\u00fcr.<br \/>\n*   <code>response.encodeRedirectURL(String url)<\/code>: Bu metot, <code>response.sendRedirect()<\/code> ile kullan\u0131lan URL&#8217;leri kodlamak i\u00e7in tasarlanm\u0131\u015ft\u0131r. <code>encodeURL()<\/code> ile benzer \u015fekilde \u00e7al\u0131\u015f\u0131r ancak yeniden y\u00f6nlendirmeler i\u00e7in \u00f6zel durumlar\u0131 ele al\u0131r.<\/p>\n<p><strong>\u00d6rnek Kullan\u0131m:<\/strong><\/p>\n<pre><code class=\"language-java\">import jakarta.servlet.ServletException;\nimport jakarta.servlet.annotation.WebServlet;\nimport jakarta.servlet.http.HttpServlet;\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport jakarta.servlet.http.HttpSession;\n\nimport java.io.IOException;\nimport java.io.PrintWriter;\n\n@WebServlet(\"\/urlRewritingExample\")\npublic class UrlRewritingExampleServlet extends HttpServlet {\n    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {\n        response.setContentType(\"text\/html;charset=UTF-8\");\n        PrintWriter out = response.getWriter();\n\n        HttpSession session = request.getSession();\n        session.setAttribute(\"message\", \"Merhaba URL Rewriting!\");\n\n        out.println(\"<html><body>\");\n        out.println(\"<h2>URL Rewriting \u00d6rne\u011fi<\/h2>\");\n        out.println(\"<p>Oturum ID: \" + session.getId() + \"<\/p>\");\n\n        \/\/ Oturum ID'sini i\u00e7eren bir ba\u011flant\u0131 olu\u015fturma\n        String nextUrl = response.encodeURL(\"nextPage\");\n        out.println(\"<p><a href='\" + nextUrl + \"'>Sonraki Sayfaya Git<\/a><\/p>\");\n\n        out.println(\"<\/body><\/html>\");\n    }\n}\n\n\/\/ nextPage servlet'i\n@WebServlet(\"\/nextPage\")\nclass NextPageServlet extends HttpServlet {\n    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {\n        response.setContentType(\"text\/html;charset=UTF-8\");\n        PrintWriter out = response.getWriter();\n        HttpSession session = request.getSession(false); \/\/ Yeni oturum olu\u015fturma\n\n        out.println(\"<html><body>\");\n        out.println(\"<h2>Sonraki Sayfa<\/h2>\");\n\n        if (session != null) {\n            String message = (String) session.getAttribute(\"message\");\n            out.println(\"<p>Oturumdan gelen mesaj: \" + message + \"<\/p>\");\n            out.println(\"<p>Oturum ID: \" + session.getId() + \"<\/p>\");\n        } else {\n            out.println(\"<p>Oturum bulunamad\u0131 veya sona erdi.<\/p>\");\n        }\n        out.println(\"<\/body><\/html>\");\n    }\n}<\/code><\/pre>\n<h4>Dezavantajlar\u0131<\/h4>\n<p>URL yeniden yazma, \u00e7erezlerin devre d\u0131\u015f\u0131 b\u0131rak\u0131ld\u0131\u011f\u0131 durumlar i\u00e7in bir \u00e7\u00f6z\u00fcm sunsa da, ciddi dezavantajlar\u0131 vard\u0131r:<br \/>\n*   <strong>URL&#8217;lerin Uzunlu\u011fu ve Karma\u015f\u0131kl\u0131\u011f\u0131<\/strong>: Oturum kimli\u011fi URL&#8217;ye eklendi\u011fi i\u00e7in URL&#8217;ler daha uzun ve karma\u015f\u0131k hale gelir.<br \/>\n*   <strong>Yer \u0130mleri (Bookmarks) Sorunu<\/strong>: Kullan\u0131c\u0131 bir sayfay\u0131 yer imlerine eklerse, oturum kimli\u011fi de yer imine dahil edilir. Bu, oturumun s\u00fcresi dolduktan sonra yer iminin \u00e7al\u0131\u015fmamas\u0131na veya ba\u015fka bir kullan\u0131c\u0131n\u0131n ayn\u0131 oturum kimli\u011fiyle eri\u015fmeye \u00e7al\u0131\u015fmas\u0131na neden olabilir (g\u00fcvenlik riski).<br \/>\n*   <strong>G\u00fcvenlik Riskleri<\/strong>: Oturum kimli\u011finin URL&#8217;de a\u00e7\u0131k\u00e7a g\u00f6r\u00fcnmesi, oturum \u00e7al\u0131nmas\u0131 (session hijacking) ve oturum sabitlenmesi (session fixation) gibi sald\u0131r\u0131lara kar\u015f\u0131 daha savunmas\u0131z hale getirir. URL&#8217;ler genellikle sunucu g\u00fcnl\u00fcklerinde, taray\u0131c\u0131 ge\u00e7mi\u015finde ve y\u00f6nlendiren ba\u015fl\u0131klar\u0131nda g\u00f6r\u00fcn\u00fcr, bu da oturum kimli\u011finin s\u0131zma riskini art\u0131r\u0131r.<br \/>\n*   <strong>Geli\u015ftirme Y\u00fck\u00fc<\/strong>: Uygulamadaki her ba\u011flant\u0131n\u0131n ve form eyleminin <code>response.encodeURL()<\/code> ile i\u015flenmesi gerekir, bu da geli\u015ftirme ve bak\u0131m y\u00fck\u00fcn\u00fc art\u0131r\u0131r.<\/p>\n<p>Bu dezavantajlar nedeniyle, \u00e7erezler oturum y\u00f6netiminde tercih edilen y\u00f6ntemdir ve URL yeniden yazma genellikle yaln\u0131zca bir yedek mekanizma olarak kullan\u0131l\u0131r. Modern taray\u0131c\u0131lar\u0131n \u00e7o\u011fu \u00e7erezleri varsay\u0131lan olarak destekledi\u011fi i\u00e7in URL yeniden yazma ihtiyac\u0131 giderek azalmaktad\u0131r.<\/p>\n<h2>Oturum Y\u00f6netimi Uygulama \u00d6rnekleri<\/h2>\n<h3>Kullan\u0131c\u0131 Giri\u015fi ve Oturum Olu\u015fturma<\/h3>\n<p>Bir kullan\u0131c\u0131 sisteme giri\u015f yapt\u0131\u011f\u0131nda, kimlik do\u011frulama ba\u015far\u0131l\u0131 olursa, sunucu yeni bir oturum olu\u015fturur (veya mevcut bir oturumu kullan\u0131r) ve kullan\u0131c\u0131n\u0131n kimli\u011fini, rol\u00fcn\u00fc veya di\u011fer ilgili verileri oturuma kaydeder.<\/p>\n<pre><code class=\"language-java\">\/\/ LoginServlet.java\n@WebServlet(\"\/login\")\npublic class LoginServlet extends HttpServlet {\n    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {\n        String username = request.getParameter(\"username\");\n        String password = request.getParameter(\"password\");\n\n        \/\/ Basit bir kimlik do\u011frulama \u00f6rne\u011fi\n        if (\"admin\".equals(username) && \"password\".equals(password)) {\n            HttpSession session = request.getSession(); \/\/ Yeni bir oturum olu\u015ftur veya mevcut olan\u0131 al\n            session.setAttribute(\"loggedInUser\", username);\n            session.setAttribute(\"userRole\", \"Administrator\");\n            session.setMaxInactiveInterval(30 * 60); \/\/ 30 dakika etkin kalma s\u00fcresi\n\n            response.sendRedirect(\"dashboard\"); \/\/ Ba\u015far\u0131l\u0131 giri\u015f sonras\u0131 panoya y\u00f6nlendir\n        } else {\n            request.setAttribute(\"errorMessage\", \"Ge\u00e7ersiz kullan\u0131c\u0131 ad\u0131 veya \u015fifre.\");\n            request.getRequestDispatcher(\"login.jsp\").forward(request, response); \/\/ Giri\u015f sayfas\u0131na geri d\u00f6n\n        }\n    }\n}<\/code><\/pre>\n<h3>Oturum Verilerine Eri\u015fme ve G\u00fcncelleme<\/h3>\n<p>Giri\u015f yapm\u0131\u015f bir kullan\u0131c\u0131, uygulaman\u0131n farkl\u0131 sayfalar\u0131nda gezinirken, oturumda saklanan verilere eri\u015febilir ve bunlar\u0131 g\u00fcncelleyebilir.<\/p>\n<pre><code class=\"language-java\">\/\/ DashboardServlet.java\n@WebServlet(\"\/dashboard\")\npublic class DashboardServlet extends HttpServlet {\n    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {\n        HttpSession session = request.getSession(false); \/\/ Yeni oturum olu\u015fturma, sadece mevcut olan\u0131 al\n\n        if (session != null && session.getAttribute(\"loggedInUser\") != null) {\n            String user = (String) session.getAttribute(\"loggedInUser\");\n            String role = (String) session.getAttribute(\"userRole\");\n\n            response.setContentType(\"text\/html;charset=UTF-8\");\n            PrintWriter out = response.getWriter();\n            out.println(\"<html><body>\");\n            out.println(\"<h2>Ho\u015f Geldiniz, \" + user + \" (\" + role + \")!<\/h2>\");\n            out.println(\"<p>Bu pano sadece giri\u015f yapm\u0131\u015f kullan\u0131c\u0131lar i\u00e7indir.<\/p>\");\n            out.println(\"<p><a href='logout'>\u00c7\u0131k\u0131\u015f Yap<\/a><\/p>\");\n            out.println(\"<\/body><\/html>\");\n        } else {\n            response.sendRedirect(\"login.jsp\"); \/\/ Giri\u015f yapmam\u0131\u015fsa giri\u015f sayfas\u0131na y\u00f6nlendir\n        }\n    }\n}<\/code><\/pre>\n<h3>Oturumu Sonland\u0131rma (Logout)<\/h3>\n<p>Kullan\u0131c\u0131 \u00e7\u0131k\u0131\u015f yapt\u0131\u011f\u0131nda, oturumun sunucu taraf\u0131nda ge\u00e7ersiz k\u0131l\u0131nmas\u0131 ve t\u00fcm oturum verilerinin silinmesi \u00f6nemlidir. Bu, g\u00fcvenlik risklerini azalt\u0131r.<\/p>\n<pre><code class=\"language-java\">\/\/ LogoutServlet.java\n@WebServlet(\"\/logout\")\npublic class LogoutServlet extends HttpServlet {\n    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {\n        HttpSession session = request.getSession(false); \/\/ Mevcut oturumu al\n        if (session != null) {\n            session.invalidate(); \/\/ Oturumu ge\u00e7ersiz k\u0131l\n        }\n        response.sendRedirect(\"login.jsp?logout=true\"); \/\/ Giri\u015f sayfas\u0131na y\u00f6nlendir\n    }\n}<\/code><\/pre>\n<h3>Oturum Zaman A\u015f\u0131m\u0131 (Session Timeout)<\/h3>\n<p>Bir kullan\u0131c\u0131 belirli bir s\u00fcre boyunca hi\u00e7bir i\u015flem yapmad\u0131\u011f\u0131nda, oturumun otomatik olarak ge\u00e7ersiz k\u0131l\u0131nmas\u0131 gerekir. Bu, kaynaklar\u0131n serbest b\u0131rak\u0131lmas\u0131na ve g\u00fcvenlik risklerinin azalt\u0131lmas\u0131na yard\u0131mc\u0131 olur.<\/p>\n<p>*   <strong><code>web.xml<\/code> Yap\u0131land\u0131rmas\u0131<\/strong>: En yayg\u0131n y\u00f6ntem, <code>web.xml<\/code> dosyas\u0131nda oturum zaman a\u015f\u0131m\u0131n\u0131 yap\u0131land\u0131rmakt\u0131r. De\u011fer dakika cinsindendir.<\/p>\n<pre><code class=\"language-xml\"><session-config>\n        <session-timeout>30<\/session-timeout> <!-- 30 dakika -->\n    <\/session-config><\/code><\/pre>\n<p>*   <strong>Programatik Olarak<\/strong>: <code>HttpSession<\/code> objesinin <code>setMaxInactiveInterval()<\/code> metodu ile de oturum zaman a\u015f\u0131m\u0131 programatik olarak ayarlanabilir. Bu, belirli oturumlar i\u00e7in varsay\u0131lan de\u011feri ge\u00e7ersiz k\u0131lmak istedi\u011finizde kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<pre><code class=\"language-java\">HttpSession session = request.getSession();\n    session.setMaxInactiveInterval(60 * 60); \/\/ 1 saat (saniye cinsinden)<\/code><\/pre>\n<h2>Oturum Y\u00f6netimi G\u00fcvenli\u011fi<\/h2>\n<p>Oturum y\u00f6netimi, web uygulamalar\u0131n\u0131n en kritik g\u00fcvenlik alanlar\u0131ndan biridir. Yanl\u0131\u015f yap\u0131land\u0131r\u0131lm\u0131\u015f veya zay\u0131f oturum y\u00f6netimi, ciddi g\u00fcvenlik a\u00e7\u0131klar\u0131na yol a\u00e7abilir.<\/p>\n<h3>Oturum Sabitlenmesi (Session Fixation)<\/h3>\n<p>Sald\u0131rgan, ge\u00e7erli bir oturum kimli\u011fini (\u00f6rne\u011fin, uygulaman\u0131n giri\u015f sayfas\u0131n\u0131 ziyaret ederek elde etti\u011fi) kurban\u0131n taray\u0131c\u0131s\u0131na enjekte eder. Kurban bu oturum kimli\u011fiyle giri\u015f yapt\u0131\u011f\u0131nda, sald\u0131rgan kurban\u0131n oturumunu ele ge\u00e7irebilir.<br \/>\n<strong>\u00d6nlem<\/strong>: Kullan\u0131c\u0131 ba\u015far\u0131l\u0131 bir \u015fekilde kimlik do\u011frulamas\u0131ndan ge\u00e7tikten sonra yeni bir oturum kimli\u011fi olu\u015fturmak (<code>request.changeSessionId()<\/code> veya <code>session.invalidate()<\/code> ve ard\u0131ndan <code>request.getSession()<\/code>).<\/p>\n<h3>Oturum \u00c7al\u0131nmas\u0131 (Session Hijacking)<\/h3>\n<p>Sald\u0131rgan, bir kullan\u0131c\u0131n\u0131n ge\u00e7erli oturum kimli\u011fini ele ge\u00e7irir (\u00f6rne\u011fin, a\u011f trafi\u011fini dinleyerek, XSS sald\u0131r\u0131s\u0131 veya k\u00f6t\u00fc ama\u00e7l\u0131 yaz\u0131l\u0131m kullanarak) ve bu kimli\u011fi kullanarak kullan\u0131c\u0131n\u0131n oturumunu taklit eder.<br \/>\n<strong>\u00d6nlem<\/strong>:<br \/>\n*   HTTPS kullanmak (<code>Secure<\/code> \u00e7erez bayra\u011f\u0131).<br \/>\n*   <code>HttpOnly<\/code> \u00e7erez bayra\u011f\u0131 kullanmak.<br \/>\n*   G\u00fc\u00e7l\u00fc, tahmin edilemez oturum kimlikleri kullanmak.<br \/>\n*   Oturum zaman a\u015f\u0131m\u0131n\u0131 uygun \u015fekilde ayarlamak.<br \/>\n*   \u0130stemci IP adresi veya kullan\u0131c\u0131 arac\u0131s\u0131 (User-Agent) gibi bilgileri oturuma ba\u011flayarak, bu de\u011ferler de\u011fi\u015fti\u011finde oturumu ge\u00e7ersiz k\u0131lmak (ancak bu, mobil cihazlarda veya proxy kullananlarda sorunlara yol a\u00e7abilir).<\/p>\n<h3>\u00c7apraz Site \u0130stek Sahtecili\u011fi (CSRF &#8211; Cross-Site Request Forgery)<\/h3>\n<p>Sald\u0131rgan, kurban\u0131n giri\u015f yapm\u0131\u015f oldu\u011fu bir web sitesine, kurban\u0131n bilgisi olmadan istek g\u00f6ndermesini sa\u011flar. Taray\u0131c\u0131, oturum \u00e7erezlerini otomatik olarak istekle birlikte g\u00f6nderdi\u011fi i\u00e7in, sunucu iste\u011fi yasal olarak kabul eder.<br \/>\n<strong>\u00d6nlem<\/strong>: Her form ve AJAX iste\u011fi i\u00e7in benzersiz, tahmin edilemez bir CSRF belirteci (token) kullanmak. Bu belirte\u00e7 oturumda saklan\u0131r ve form ile birlikte g\u00f6nderilir. Sunucu, gelen belirteci oturumdakiyle kar\u015f\u0131la\u015ft\u0131r\u0131r.<\/p>\n<h3>G\u00fcvenli \u00c7erezler (Secure Cookies)<\/h3>\n<p>Yukar\u0131da bahsedildi\u011fi gibi, <code>HttpOnly<\/code> ve <code>Secure<\/code> bayraklar\u0131n\u0131 kullanmak, oturum \u00e7erezlerinin g\u00fcvenli\u011fini art\u0131r\u0131r. <code>SameSite<\/code> bayra\u011f\u0131 da CSRF korumas\u0131na yard\u0131mc\u0131 olur.<\/p>\n<h3>Oturum Kimli\u011fi Olu\u015fturma<\/h3>\n<p>Oturum kimlikleri, yeterince uzun, rastgele ve tahmin edilemez olmal\u0131d\u0131r. Servlet konteynerleri genellikle bu gereksinimleri kar\u015f\u0131layan g\u00fc\u00e7l\u00fc kimlikler \u00fcretir.<\/p>\n<h3>Oturum Zaman A\u015f\u0131m\u0131 Politikalar\u0131<\/h3>\n<p>Uygun bir oturum zaman a\u015f\u0131m\u0131 s\u00fcresi belirlemek \u00f6nemlidir. \u00c7ok uzun zaman a\u015f\u0131mlar\u0131, oturum \u00e7al\u0131nmas\u0131 riskini art\u0131r\u0131rken, \u00e7ok k\u0131sa zaman a\u015f\u0131mlar\u0131 kullan\u0131c\u0131 deneyimini olumsuz etkiler. Hassas uygulamalar (bankac\u0131l\u0131k gibi) daha k\u0131sa zaman a\u015f\u0131mlar\u0131 kullanmal\u0131d\u0131r.<\/p>\n<h3>Oturum Yenileme<\/h3>\n<p>Kullan\u0131c\u0131 kimlik do\u011frulamas\u0131ndan ba\u015far\u0131yla ge\u00e7tikten sonra, mevcut oturum kimli\u011fini ge\u00e7ersiz k\u0131larak yeni bir oturum kimli\u011fi olu\u015fturmak, oturum sabitlenmesi sald\u0131r\u0131lar\u0131na kar\u015f\u0131 ek bir koruma sa\u011flar. <code>request.changeSessionId()<\/code> metodu bu ama\u00e7la kullan\u0131labilir.<\/p>\n<h2>Da\u011f\u0131t\u0131k Ortamlarda Oturum Y\u00f6netimi<\/h2>\n<p>Tek bir sunucuda \u00e7al\u0131\u015fan uygulamalar i\u00e7in oturum y\u00f6netimi nispeten basittir. Ancak y\u00fck dengeleyici (load balancer) arkas\u0131nda birden fazla sunucu \u00f6rne\u011finde (cluster) \u00e7al\u0131\u015fan uygulamalarda oturum y\u00f6netimi daha karma\u015f\u0131k hale gelir. \u00c7\u00fcnk\u00fc bir kullan\u0131c\u0131n\u0131n sonraki iste\u011fi farkl\u0131 bir sunucuya gidebilir ve o sunucunun kullan\u0131c\u0131n\u0131n oturum verilerine eri\u015fmesi gerekir.<\/p>\n<h3>Yap\u0131\u015fkan Oturumlar (Sticky Sessions)<\/h3>\n<p>En basit \u00e7\u00f6z\u00fcm, y\u00fck dengeleyicinin belirli bir kullan\u0131c\u0131n\u0131n t\u00fcm isteklerini her zaman ayn\u0131 sunucuya y\u00f6nlendirmesini sa\u011flamakt\u0131r. Bu, &#8220;yap\u0131\u015fkan oturumlar&#8221; veya &#8220;oturum benze\u015fimi&#8221; olarak bilinir.<br \/>\n<strong>Avantaj<\/strong>: Uygulama taraf\u0131nda de\u011fi\u015fiklik gerektirmez, kolayca uygulanabilir.<br \/>\n<strong>Dezavantaj<\/strong>: Bir sunucu \u00e7\u00f6kerse, o sunucudaki t\u00fcm oturumlar kaybolur ve kullan\u0131c\u0131lar yeniden giri\u015f yapmak zorunda kal\u0131r. Ayr\u0131ca, y\u00fck dengelemeyi e\u015fit \u015fekilde da\u011f\u0131tmayabilir.<\/p>\n<h3>Oturum \u00c7o\u011faltma (Session Replication)<\/h3>\n<p>Bu y\u00f6ntemde, bir sunucuda olu\u015fturulan veya g\u00fcncellenen oturum verileri, k\u00fcmedeki di\u011fer t\u00fcm sunuculara kopyalan\u0131r. B\u00f6ylece, bir kullan\u0131c\u0131n\u0131n iste\u011fi hangi sunucuya giderse gitsin, oturum verileri mevcut olur.<br \/>\n<strong>Avantaj<\/strong>: Y\u00fcksek eri\u015filebilirlik sa\u011flar; bir sunucu \u00e7\u00f6kerse, oturumlar kaybolmaz.<br \/>\n<strong>Dezavantaj<\/strong>: A\u011f trafi\u011fini art\u0131r\u0131r, b\u00fcy\u00fck oturum verileri veya \u00e7ok say\u0131da sunucu durumunda performans sorunlar\u0131na yol a\u00e7abilir. Bellek t\u00fcketimi artar.<\/p>\n<h3>Harici Oturum Depolama (External Session Stores)<\/h3>\n<p>En \u00f6l\u00e7eklenebilir ve modern yakla\u015f\u0131m, oturum verilerini ayr\u0131, harici bir depolama sisteminde (veritaban\u0131, Redis, Memcached gibi da\u011f\u0131t\u0131k \u00f6nbellekler) saklamakt\u0131r. Uygulama sunucular\u0131 sadece oturum kimli\u011fini y\u00f6netir ve oturum verilerine bu harici depolama \u00fczerinden eri\u015fir.<br \/>\n<strong>Avantaj<\/strong>: Y\u00fcksek \u00f6l\u00e7eklenebilirlik, y\u00fcksek eri\u015filebilirlik, sunucu ar\u0131zalar\u0131na kar\u015f\u0131 dayan\u0131kl\u0131l\u0131k. Uygulama sunucular\u0131 durumsuz kal\u0131r, bu da kolayca eklenip \u00e7\u0131kar\u0131labilmeleri anlam\u0131na gelir.<br \/>\n<strong>Dezavantaj<\/strong>: Ek bir ba\u011f\u0131ml\u0131l\u0131k (harici depolama sistemi), gecikme s\u00fcresi (veri okuma\/yazma i\u00e7in a\u011f \u00e7a\u011fr\u0131s\u0131), geli\u015ftirme ve yap\u0131land\u0131rma karma\u015f\u0131kl\u0131\u011f\u0131.<\/p>\n<p>Modern mikroservis mimarilerinde veya bulut tabanl\u0131 uygulamalarda harici oturum depolama genellikle tercih edilen y\u00f6ntemdir.<\/p>\n<h2>Sonu\u00e7<\/h2>\n<p>Java&#8217;da oturum y\u00f6netimi, <code>HttpServlet<\/code> aray\u00fcz\u00fc, <code>HttpSession<\/code> nesnesi, \u00e7erezler ve URL yeniden yazma mekanizmalar\u0131 arac\u0131l\u0131\u011f\u0131yla g\u00fc\u00e7l\u00fc ve esnek bir yap\u0131 sunar. HTTP&#8217;nin durumsuz do\u011fas\u0131n\u0131 a\u015farak kullan\u0131c\u0131lar\u0131n web uygulamalar\u0131yla etkile\u015fimlerini s\u00fcrd\u00fcr\u00fclebilir k\u0131lmak, modern web geli\u015ftiricili\u011finin temel bir gereklili\u011fidir.<\/p>\n<p>\u00c7erezler, oturum kimli\u011fini ta\u015f\u0131man\u0131n birincil ve en g\u00fcvenli yoludur. <code>HttpOnly<\/code>, <code>Secure<\/code> ve <code>SameSite<\/code> gibi g\u00fcvenlik bayraklar\u0131 ile \u00e7erezlerin korunmas\u0131 hayati \u00f6nem ta\u015f\u0131r. \u00c7erezlerin devre d\u0131\u015f\u0131 b\u0131rak\u0131ld\u0131\u011f\u0131 nadir durumlar i\u00e7in URL yeniden yazma bir yedek \u00e7\u00f6z\u00fcm sunsa da, g\u00fcvenlik ve kullan\u0131labilirlik dezavantajlar\u0131 nedeniyle m\u00fcmk\u00fcn oldu\u011funca ka\u00e7\u0131n\u0131lmal\u0131d\u0131r.<\/p>\n<p>Oturum y\u00f6netimi sadece i\u015flevsellik sa\u011flamakla kalmaz, ayn\u0131 zamanda g\u00fcvenlik a\u00e7\u0131s\u0131ndan da kritik bir aland\u0131r. Oturum sabitlenmesi, oturum \u00e7al\u0131nmas\u0131 ve CSRF gibi yayg\u0131n sald\u0131r\u0131lara kar\u015f\u0131 korunmak i\u00e7in do\u011fru g\u00fcvenlik \u00f6nlemlerinin al\u0131nmas\u0131 \u015fartt\u0131r. Ayr\u0131ca, da\u011f\u0131t\u0131k sistemlerde oturumlar\u0131n nas\u0131l y\u00f6netilece\u011fi (yap\u0131\u015fkan oturumlar, oturum \u00e7o\u011faltma veya harici depolama) uygulaman\u0131n \u00f6l\u00e7eklenebilirlik ve eri\u015filebilirlik gereksinimlerine g\u00f6re dikkatlice planlanmal\u0131d\u0131r.<\/p>\n<p>Java geli\u015ftiricileri, bu mekanizmalar\u0131 ve g\u00fcvenlik en iyi uygulamalar\u0131n\u0131 anlayarak, hem i\u015flevsel hem de g\u00fcvenli, y\u00fcksek performansl\u0131 web uygulamalar\u0131 olu\u015fturabilirler.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Java&#8217;da Oturum Y\u00f6netimi &#8211; HttpServlet, \u00c7erezler ve URL Yeniden Yazma\nGiri\u015f\nWeb uygulamalar\u0131n\u0131n temel ta\u015flar\u0131ndan biri olan oturum y\u00f6netimi, k","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":[1408],"tags":[],"class_list":{"0":"post-36234","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-java","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>Java&#039;da Oturum Y\u00f6netimi - HttpServlet, \u00c7erezler ve URL Yeniden Yazma - 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\/javada-oturum-yonetimi-httpservlet-cerezler-ve-url-yeniden-yazma\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Java&#039;da Oturum Y\u00f6netimi - HttpServlet, \u00c7erezler ve URL Yeniden Yazma\" \/>\n<meta property=\"og:description\" content=\"Java&#039;da Oturum Y\u00f6netimi - HttpServlet, \u00c7erezler ve URL Yeniden Yazma Giri\u015f Web uygulamalar\u0131n\u0131n temel ta\u015flar\u0131ndan biri olan oturum y\u00f6netimi, k\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/javada-oturum-yonetimi-httpservlet-cerezler-ve-url-yeniden-yazma\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-10T23:40:46+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=\"20 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javada-oturum-yonetimi-httpservlet-cerezler-ve-url-yeniden-yazma\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javada-oturum-yonetimi-httpservlet-cerezler-ve-url-yeniden-yazma\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Java&#8217;da Oturum Y\u00f6netimi &#8211; HttpServlet, \u00c7erezler ve URL Yeniden Yazma\",\"datePublished\":\"2025-12-10T23:40:46+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javada-oturum-yonetimi-httpservlet-cerezler-ve-url-yeniden-yazma\/\"},\"wordCount\":3258,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Java\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/javada-oturum-yonetimi-httpservlet-cerezler-ve-url-yeniden-yazma\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javada-oturum-yonetimi-httpservlet-cerezler-ve-url-yeniden-yazma\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/javada-oturum-yonetimi-httpservlet-cerezler-ve-url-yeniden-yazma\/\",\"name\":\"Java'da Oturum Y\u00f6netimi - HttpServlet, \u00c7erezler ve URL Yeniden Yazma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-10T23:40:46+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javada-oturum-yonetimi-httpservlet-cerezler-ve-url-yeniden-yazma\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/javada-oturum-yonetimi-httpservlet-cerezler-ve-url-yeniden-yazma\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javada-oturum-yonetimi-httpservlet-cerezler-ve-url-yeniden-yazma\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java&#8217;da Oturum Y\u00f6netimi &#8211; HttpServlet, \u00c7erezler ve URL Yeniden Yazma\"}]},{\"@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":"Java'da Oturum Y\u00f6netimi - HttpServlet, \u00c7erezler ve URL Yeniden Yazma - 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\/javada-oturum-yonetimi-httpservlet-cerezler-ve-url-yeniden-yazma\/","og_locale":"tr_TR","og_type":"article","og_title":"Java'da Oturum Y\u00f6netimi - HttpServlet, \u00c7erezler ve URL Yeniden Yazma","og_description":"Java'da Oturum Y\u00f6netimi - HttpServlet, \u00c7erezler ve URL Yeniden Yazma Giri\u015f Web uygulamalar\u0131n\u0131n temel ta\u015flar\u0131ndan biri olan oturum y\u00f6netimi, k","og_url":"https:\/\/fatihsoysal.com\/blog\/javada-oturum-yonetimi-httpservlet-cerezler-ve-url-yeniden-yazma\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-10T23:40:46+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"20 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/javada-oturum-yonetimi-httpservlet-cerezler-ve-url-yeniden-yazma\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/javada-oturum-yonetimi-httpservlet-cerezler-ve-url-yeniden-yazma\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Java&#8217;da Oturum Y\u00f6netimi &#8211; HttpServlet, \u00c7erezler ve URL Yeniden Yazma","datePublished":"2025-12-10T23:40:46+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/javada-oturum-yonetimi-httpservlet-cerezler-ve-url-yeniden-yazma\/"},"wordCount":3258,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Java"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/javada-oturum-yonetimi-httpservlet-cerezler-ve-url-yeniden-yazma\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/javada-oturum-yonetimi-httpservlet-cerezler-ve-url-yeniden-yazma\/","url":"https:\/\/fatihsoysal.com\/blog\/javada-oturum-yonetimi-httpservlet-cerezler-ve-url-yeniden-yazma\/","name":"Java'da Oturum Y\u00f6netimi - HttpServlet, \u00c7erezler ve URL Yeniden Yazma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-10T23:40:46+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/javada-oturum-yonetimi-httpservlet-cerezler-ve-url-yeniden-yazma\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/javada-oturum-yonetimi-httpservlet-cerezler-ve-url-yeniden-yazma\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/javada-oturum-yonetimi-httpservlet-cerezler-ve-url-yeniden-yazma\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Java&#8217;da Oturum Y\u00f6netimi &#8211; HttpServlet, \u00c7erezler ve URL Yeniden Yazma"}]},{"@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\/36234","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=36234"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36234\/revisions"}],"predecessor-version":[{"id":36235,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36234\/revisions\/36235"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=36234"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=36234"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=36234"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}