<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Soumyajit Mukherjee</title>
    <description>The latest articles on DEV Community by Soumyajit Mukherjee (@sam000).</description>
    <link>https://dev.to/sam000</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1902890%2F7519ab88-e767-49de-8e68-b2d1acf266e2.jpeg</url>
      <title>DEV Community: Soumyajit Mukherjee</title>
      <link>https://dev.to/sam000</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sam000"/>
    <language>en</language>
    <item>
      <title>AI Is Your Junior Developer. Here's Why You Still Need to Review Its Work</title>
      <dc:creator>Soumyajit Mukherjee</dc:creator>
      <pubDate>Wed, 28 Oct 2026 04:07:14 +0000</pubDate>
      <link>https://dev.to/sam000/ai-is-your-junior-developer-heres-why-you-still-need-to-review-its-work-jai</link>
      <guid>https://dev.to/sam000/ai-is-your-junior-developer-heres-why-you-still-need-to-review-its-work-jai</guid>
      <description>&lt;p&gt;AI coding assistants have made development faster. They can generate components, explain errors, suggest tests, and help developers explore unfamiliar technologies.&lt;/p&gt;

&lt;p&gt;But here's the catch: &lt;strong&gt;AI can generate code faster than you can confidently verify it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And that's where the real engineering challenge begins.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common AI bottlenecks developers should understand
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Hallucinated APIs and incorrect code
&lt;/h3&gt;

&lt;p&gt;AI may suggest methods that don't exist, outdated syntax, or code that passes a quick glance but fails at runtime.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to do:&lt;/strong&gt; Check official documentation, run the code, and write meaningful tests.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Missing project context
&lt;/h3&gt;

&lt;p&gt;AI might generate a technically valid solution that doesn't match your architecture, coding conventions, or actual requirements.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to do:&lt;/strong&gt; Share relevant context, define constraints, and specify acceptance criteria.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Security and performance issues
&lt;/h3&gt;

&lt;p&gt;Generated code can introduce insecure input handling, exposed secrets, inefficient queries, or unnecessary dependencies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to do:&lt;/strong&gt; Review security boundaries, validate inputs, profile performance, and use appropriate security checks.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Debugging generated complexity
&lt;/h3&gt;

&lt;p&gt;Asking AI to fix its own mistakes repeatedly can create layers of patches instead of solving the root cause.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to do:&lt;/strong&gt; Reproduce the bug, isolate the failure, inspect assumptions, and understand the fix before accepting it.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Overdependence
&lt;/h3&gt;

&lt;p&gt;If developers accept generated code without understanding it, they risk losing the ability to debug, maintain, and explain their own systems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to do:&lt;/strong&gt; Treat AI-generated code as an opportunity to learn, not a substitute for learning.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where AI boosts developer productivity
&lt;/h2&gt;

&lt;p&gt;AI is genuinely useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generating boilerplate and scaffolding.&lt;/li&gt;
&lt;li&gt;Creating initial unit tests and edge-case suggestions.&lt;/li&gt;
&lt;li&gt;Explaining unfamiliar code and error messages.&lt;/li&gt;
&lt;li&gt;Drafting documentation and refactoring proposals.&lt;/li&gt;
&lt;li&gt;Exploring implementation alternatives.&lt;/li&gt;
&lt;li&gt;Automating repetitive development tasks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal isn't to write every line manually. It's to spend less time on repetitive work while preserving engineering quality.&lt;/p&gt;

&lt;h2&gt;
  
  
  The human-in-the-loop development workflow
&lt;/h2&gt;

&lt;p&gt;Here's a simple workflow for working with your AI junior:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Plan:&lt;/strong&gt; Define the requirements and expected behavior.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Delegate:&lt;/strong&gt; Give AI a specific, bounded task.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inspect:&lt;/strong&gt; Review the generated code and its assumptions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test:&lt;/strong&gt; Run tests, check edge cases, and validate integration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Secure:&lt;/strong&gt; Inspect permissions, inputs, secrets, and dependencies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Understand:&lt;/strong&gt; Make sure you can explain and maintain the solution.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ship responsibly:&lt;/strong&gt; Keep appropriate human approval for consequential changes.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Not every suggestion needs the same level of review. A variable rename isn't equivalent to an authentication change or a production database migration.&lt;/p&gt;

&lt;h2&gt;
  
  
  What developers need to strengthen
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Problem-solving and debugging&lt;/li&gt;
&lt;li&gt;Data structures and algorithms&lt;/li&gt;
&lt;li&gt;System design&lt;/li&gt;
&lt;li&gt;Database fundamentals&lt;/li&gt;
&lt;li&gt;Security and performance&lt;/li&gt;
&lt;li&gt;Testing and code review&lt;/li&gt;
&lt;li&gt;Communication and technical decision-making&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These skills make AI more useful because they help you recognize good output, catch bad output, and provide better instructions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thought
&lt;/h2&gt;

&lt;p&gt;Your AI assistant can be your fastest junior developer. But speed alone doesn't make a reliable engineer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Let AI generate. Let tests challenge. Let human judgment decide.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;How do you use AI in your development workflow? What's one mistake you've caught in AI-generated code?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>software</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Stop Building Full-Stack Projects Just for Your Resume in 2026</title>
      <dc:creator>Soumyajit Mukherjee</dc:creator>
      <pubDate>Fri, 23 Oct 2026 12:37:35 +0000</pubDate>
      <link>https://dev.to/sam000/stop-building-full-stack-projects-just-for-your-resume-in-2026-18b4</link>
      <guid>https://dev.to/sam000/stop-building-full-stack-projects-just-for-your-resume-in-2026-18b4</guid>
      <description>&lt;p&gt;If you're a fresher, a self-taught developer, or someone with 0–1 years of experience, you've probably heard this advice:&lt;/p&gt;

&lt;p&gt;"Build projects to strengthen your resume."&lt;/p&gt;

&lt;p&gt;It's good advice. But I think we need to take it one step further.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Build projects that solve problems people actually have.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A to-do app or a CRUD application is a perfectly reasonable learning exercise. The problem arises when we build dozens of tutorial-based projects without learning how to turn an idea into dependable software.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's changing in full-stack development?
&lt;/h2&gt;

&lt;p&gt;AI-assisted coding, automation, and increasingly capable web applications are changing how software gets built.&lt;/p&gt;

&lt;p&gt;However, shipping code quickly isn't the same as shipping a reliable product. Developers still need to understand requirements, debug failures, design APIs, protect data, test behavior, and maintain applications.&lt;/p&gt;

&lt;p&gt;Useful references:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.deloitte.com/us/en/insights/industry/technology-media-telecom-outlooks/software-industry-outlook.html" rel="noopener noreferrer"&gt;Deloitte's 2026 Software Industry Outlook&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://survey.stackoverflow.co/2026/" rel="noopener noreferrer"&gt;Stack Overflow Developer Survey 2026&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  7 full-stack projects worth exploring
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. AI-powered document search
&lt;/h3&gt;

&lt;p&gt;Let users upload documents and ask questions about their contents.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Engineering challenges:&lt;/strong&gt; document processing, retrieval, source citations, access control, privacy, and model cost management.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Small-business workflow automation
&lt;/h3&gt;

&lt;p&gt;Build an appointment, invoicing, and customer-management system for one specific business type.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Engineering challenges:&lt;/strong&gt; scheduling conflicts, permissions, validation, reminders, and reporting.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Developer deployment monitor
&lt;/h3&gt;

&lt;p&gt;Track application health, errors, deployments, and incidents in one dashboard.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Engineering challenges:&lt;/strong&gt; health checks, event ingestion, alerts, failure recovery, and observability.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. URL safety analyzer
&lt;/h3&gt;

&lt;p&gt;Analyze suspicious links using safe parsing, domain signals, threat intelligence, and optional ML integrations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Engineering challenges:&lt;/strong&gt; malicious input handling, rate limiting, caching, explainable risk indicators, and uncertainty.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Accessibility auditing tool
&lt;/h3&gt;

&lt;p&gt;Help website owners discover common accessibility issues and learn how to fix them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Engineering challenges:&lt;/strong&gt; automated checks, severity classification, actionable reports, and testable recommendations.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Privacy-first expense tracker
&lt;/h3&gt;

&lt;p&gt;Help users manage expenses, subscriptions, budgets, and recurring payments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Engineering challenges:&lt;/strong&gt; reliable calculations, private data handling, CSV imports, reporting, and data export.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Learning roadmap platform
&lt;/h3&gt;

&lt;p&gt;Help learners convert a career goal into skill milestones, practical projects, and a trackable learning plan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Engineering challenges:&lt;/strong&gt; progress modeling, resource organization, personalized recommendations, and measurable outcomes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What makes these projects stand out?
&lt;/h2&gt;

&lt;p&gt;The stack alone doesn't make a project impressive.&lt;/p&gt;

&lt;p&gt;A serious project should demonstrate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Problem discovery:&lt;/strong&gt; Who has the problem, and why does it matter?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Architecture:&lt;/strong&gt; Why did you choose this database, API design, and technology stack?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security:&lt;/strong&gt; Are authentication, authorization, validation, and data protection handled properly?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reliability:&lt;/strong&gt; What happens when requests fail, services become unavailable, or users provide unexpected inputs?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testing:&lt;/strong&gt; Do automated tests cover important behaviors?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment:&lt;/strong&gt; Can someone access and try the working application?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feedback:&lt;/strong&gt; Did real users try it, and what did you improve?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You don't need Kubernetes, microservices, or AI agents in every project. Use complexity only when the problem justifies it.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical challenge for freshers
&lt;/h2&gt;

&lt;p&gt;Try this four-week approach:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week 1:&lt;/strong&gt; Identify a problem and talk to potential users.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week 2:&lt;/strong&gt; Build the core workflow from frontend to database.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week 3:&lt;/strong&gt; Add validation, security, testing, and deployment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week 4:&lt;/strong&gt; Gather feedback, fix problems, and document the engineering decisions.&lt;/p&gt;

&lt;p&gt;Adapt the schedule to your availability. A smaller, completed project is better than a massive unfinished one.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to describe it professionally
&lt;/h2&gt;

&lt;p&gt;Instead of:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Built a full-stack application using React, Node.js, Express, and MongoDB.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Explain what the product does, who it helps, what challenges you solved, and what you learned.&lt;/p&gt;

&lt;p&gt;Include real results only when you have evidence to support them.&lt;/p&gt;

&lt;p&gt;Your GitHub repository should include a clear README, setup instructions, screenshots, architecture notes, testing instructions, and a link to the live application when available.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thought
&lt;/h2&gt;

&lt;p&gt;You still need a job. Your resume and interview preparation still matter.&lt;/p&gt;

&lt;p&gt;But your projects can do more than help you qualify for interviews. They can teach you to think like an engineer, create something useful, and build confidence through real feedback.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stop collecting projects. Start shipping solutions.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;What full-stack project would you build if your first goal were to help a real user rather than impress a recruiter?&lt;/p&gt;

&lt;p&gt;Share your idea in the comments!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>career</category>
    </item>
    <item>
      <title>What I Learned From Building Small Projects Instead of Waiting for the Perfect Idea</title>
      <dc:creator>Soumyajit Mukherjee</dc:creator>
      <pubDate>Fri, 23 Oct 2026 12:13:05 +0000</pubDate>
      <link>https://dev.to/sam000/what-i-learned-from-building-small-projects-instead-of-waiting-for-the-perfect-idea-433n</link>
      <guid>https://dev.to/sam000/what-i-learned-from-building-small-projects-instead-of-waiting-for-the-perfect-idea-433n</guid>
      <description>&lt;p&gt;One of the biggest traps in software development is believing that the next project has to be revolutionary.&lt;/p&gt;

&lt;p&gt;It doesn't.&lt;/p&gt;

&lt;p&gt;A small project that gets finished can teach more than a huge project that remains unfinished.&lt;/p&gt;

&lt;h3&gt;
  
  
  Start With a Problem
&lt;/h3&gt;

&lt;p&gt;Instead of asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What is the most impressive application I can build?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What small problem can I solve?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Examples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Expense tracker
URL shortener
Markdown editor
Task manager
API monitoring dashboard
Bookmark manager
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The project doesn't need millions of users.&lt;/p&gt;

&lt;p&gt;It needs enough complexity to teach you something.&lt;/p&gt;

&lt;h3&gt;
  
  
  Build the First Version Quickly
&lt;/h3&gt;

&lt;p&gt;The first version should be intentionally boring.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Create task
Read task
Update task
Delete task
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once that works, add complexity.&lt;/p&gt;

&lt;p&gt;Maybe:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Authentication
Search
Pagination
Caching
Testing
Deployment
Monitoring
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the project becomes a learning environment.&lt;/p&gt;

&lt;h3&gt;
  
  
  Don't Copy Tutorials Forever
&lt;/h3&gt;

&lt;p&gt;Tutorials are useful for learning concepts.&lt;/p&gt;

&lt;p&gt;But eventually close the tutorial and try building something independently.&lt;/p&gt;

&lt;p&gt;That's where the gaps in your knowledge become visible.&lt;/p&gt;

&lt;p&gt;You might suddenly discover:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I don't understand authentication.
I don't know how deployment works.
I don't know how to structure my API.
I don't know how to handle errors.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those gaps are valuable.&lt;/p&gt;

&lt;p&gt;They tell you what to learn next.&lt;/p&gt;

&lt;h3&gt;
  
  
  Finished Beats Perfect
&lt;/h3&gt;

&lt;p&gt;A finished small project gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Source code&lt;/li&gt;
&lt;li&gt;A deployment&lt;/li&gt;
&lt;li&gt;A README&lt;/li&gt;
&lt;li&gt;Problems you actually solved&lt;/li&gt;
&lt;li&gt;Lessons you can explain&lt;/li&gt;
&lt;li&gt;Something you can show others
A perfect project sitting in your notes gives you none of these.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Build → Break → Fix → Repeat
&lt;/h3&gt;

&lt;p&gt;A useful development loop is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Build
  ↓
Break
  ↓
Debug
  ↓
Understand
  ↓
Improve
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every bug is an opportunity to understand the system more deeply.&lt;/p&gt;

&lt;h3&gt;
  
  
  Final Thoughts
&lt;/h3&gt;

&lt;p&gt;You don't need the perfect project idea.&lt;/p&gt;

&lt;p&gt;You need a project that is just difficult enough to force you to learn something new.&lt;/p&gt;

&lt;p&gt;Build small.&lt;/p&gt;

&lt;p&gt;Finish things.&lt;/p&gt;

&lt;p&gt;Then make the next project harder.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>webdev</category>
      <category>career</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Why Rate Limiting Is Essential for Public APIs</title>
      <dc:creator>Soumyajit Mukherjee</dc:creator>
      <pubDate>Fri, 23 Oct 2026 11:41:37 +0000</pubDate>
      <link>https://dev.to/sam000/why-rate-limiting-is-essential-for-public-apis-45h7</link>
      <guid>https://dev.to/sam000/why-rate-limiting-is-essential-for-public-apis-45h7</guid>
      <description>&lt;p&gt;A public API can receive requests from anyone.&lt;/p&gt;

&lt;p&gt;That creates an obvious problem:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What stops one client from sending millions of requests?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Rate limiting.&lt;/p&gt;

&lt;h3&gt;
  
  
  Basic Idea
&lt;/h3&gt;

&lt;p&gt;Suppose an endpoint allows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;100 requests per minute
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A client that exceeds that limit might receive:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;429 Too Many Requests
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why Rate Limit?
&lt;/h3&gt;

&lt;p&gt;Rate limiting can help protect against:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Accidental request floods&lt;/li&gt;
&lt;li&gt;Resource exhaustion&lt;/li&gt;
&lt;li&gt;Credential abuse&lt;/li&gt;
&lt;li&gt;Automated scraping&lt;/li&gt;
&lt;li&gt;Some denial-of-service scenarios&lt;/li&gt;
&lt;li&gt;Brute-force attempts
It isn't a complete security solution, but it is an important layer.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Example
&lt;/h3&gt;

&lt;p&gt;A simple policy could be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /api/products
100 requests/minute
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;while a sensitive endpoint might use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST /api/login
10 requests/minute
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Different endpoints often deserve different limits.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where Should Limits Be Applied?
&lt;/h3&gt;

&lt;p&gt;Possible strategies include limiting by:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;IP address
User ID
API key
Session
Combination of identifiers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The appropriate strategy depends on the application.&lt;/p&gt;

&lt;h3&gt;
  
  
  Distributed Systems
&lt;/h3&gt;

&lt;p&gt;If your application runs on multiple servers, an in-memory counter on each server can produce inconsistent results.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Server A → 50 requests
Server B → 50 requests
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The user may effectively get 100 requests even though the intended limit was 50.&lt;/p&gt;

&lt;p&gt;Shared infrastructure such as Redis is commonly used for distributed rate limiting.&lt;/p&gt;

&lt;h3&gt;
  
  
  Good User Experience
&lt;/h3&gt;

&lt;p&gt;Rate limiting should be predictable.&lt;/p&gt;

&lt;p&gt;API responses can communicate when clients should retry using appropriate headers and status codes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Final Thoughts
&lt;/h3&gt;

&lt;p&gt;Rate limiting isn't only a cybersecurity feature.&lt;/p&gt;

&lt;p&gt;It is also a reliability mechanism.&lt;/p&gt;

&lt;p&gt;A well-designed API protects itself from both malicious and accidental traffic spikes.&lt;/p&gt;

</description>
      <category>api</category>
      <category>security</category>
      <category>backend</category>
      <category>node</category>
    </item>
    <item>
      <title>How CI/CD Changes the Way Developers Ship Software</title>
      <dc:creator>Soumyajit Mukherjee</dc:creator>
      <pubDate>Fri, 23 Oct 2026 10:03:37 +0000</pubDate>
      <link>https://dev.to/sam000/how-cicd-changes-the-way-developers-ship-software-3pb9</link>
      <guid>https://dev.to/sam000/how-cicd-changes-the-way-developers-ship-software-3pb9</guid>
      <description>&lt;p&gt;Imagine manually doing this every time you release an application:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Pull code
Install dependencies
Run tests
Build application
Copy files
Configure server
Restart application
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It works.&lt;/p&gt;

&lt;p&gt;But it's repetitive and error-prone.&lt;/p&gt;

&lt;p&gt;CI/CD automates much of this process.&lt;/p&gt;

&lt;h3&gt;
  
  
  Continuous Integration
&lt;/h3&gt;

&lt;p&gt;Continuous Integration means frequently integrating code changes and automatically validating them.&lt;/p&gt;

&lt;p&gt;A pipeline might run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git push
   ↓
Install dependencies
   ↓
Lint
   ↓
Run tests
   ↓
Build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If a test fails, the team gets immediate feedback.&lt;/p&gt;

&lt;h3&gt;
  
  
  Continuous Delivery
&lt;/h3&gt;

&lt;p&gt;Continuous Delivery focuses on keeping software ready to deploy.&lt;/p&gt;

&lt;p&gt;The pipeline may produce a deployment-ready artifact whenever code passes validation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Continuous Deployment
&lt;/h3&gt;

&lt;p&gt;Continuous Deployment goes further.&lt;/p&gt;

&lt;p&gt;A successful pipeline can automatically deploy changes to production.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git push
   ↓
Tests
   ↓
Build
   ↓
Deploy
   ↓
Production
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why CI/CD Helps
&lt;/h3&gt;

&lt;p&gt;It reduces manual work and creates repeatable processes.&lt;/p&gt;

&lt;p&gt;It can also:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Catch bugs earlier&lt;/li&gt;
&lt;li&gt;Standardize deployments&lt;/li&gt;
&lt;li&gt;Reduce deployment mistakes&lt;/li&gt;
&lt;li&gt;Make releases smaller&lt;/li&gt;
&lt;li&gt;Improve developer confidence&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Security Matters
&lt;/h3&gt;

&lt;p&gt;Never casually expose secrets inside pipeline configuration.&lt;/p&gt;

&lt;p&gt;Use secure secret-management mechanisms provided by your CI/CD platform.&lt;/p&gt;

&lt;p&gt;Also consider:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dependency scanning&lt;/li&gt;
&lt;li&gt;Secret scanning&lt;/li&gt;
&lt;li&gt;Permission restrictions&lt;/li&gt;
&lt;li&gt;Build isolation&lt;/li&gt;
&lt;li&gt;Deployment approvals&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Final Thoughts
&lt;/h3&gt;

&lt;p&gt;CI/CD isn't simply an automation script.&lt;/p&gt;

&lt;p&gt;It's a way of turning software delivery into a repeatable engineering process.&lt;/p&gt;

</description>
      <category>cicd</category>
      <category>devops</category>
      <category>github</category>
      <category>deployment</category>
    </item>
    <item>
      <title>Database Transactions Explained With a Simple Example</title>
      <dc:creator>Soumyajit Mukherjee</dc:creator>
      <pubDate>Fri, 23 Oct 2026 09:57:21 +0000</pubDate>
      <link>https://dev.to/sam000/database-transactions-explained-with-a-simple-example-44li</link>
      <guid>https://dev.to/sam000/database-transactions-explained-with-a-simple-example-44li</guid>
      <description>&lt;p&gt;Imagine transferring $100 from Account A to Account B.&lt;/p&gt;

&lt;p&gt;Two operations must happen:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Subtract $100 from A
Add $100 to B
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What happens if the first succeeds but the second fails?&lt;/p&gt;

&lt;p&gt;Money disappears.&lt;/p&gt;

&lt;p&gt;This is where database transactions become important.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Is a Transaction?
&lt;/h3&gt;

&lt;p&gt;A transaction groups multiple database operations into a logical unit.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;BEGIN

Subtract money from A
Add money to B

COMMIT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If something goes wrong:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;ROLLBACK&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The database attempts to return to the previous consistent state.&lt;/p&gt;

&lt;h3&gt;
  
  
  ACID
&lt;/h3&gt;

&lt;p&gt;Transactions are commonly discussed using ACID:&lt;/p&gt;

&lt;h3&gt;
  
  
  Atomicity
&lt;/h3&gt;

&lt;p&gt;All operations succeed, or none do.&lt;/p&gt;

&lt;h3&gt;
  
  
  Consistency
&lt;/h3&gt;

&lt;p&gt;The database moves from one valid state to another.&lt;/p&gt;

&lt;h3&gt;
  
  
  Isolation
&lt;/h3&gt;

&lt;p&gt;Concurrent transactions shouldn't incorrectly interfere with one another.&lt;/p&gt;

&lt;h3&gt;
  
  
  Durability
&lt;/h3&gt;

&lt;p&gt;Committed changes should survive failures according to the database's guarantees.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Transactions Matter
&lt;/h3&gt;

&lt;p&gt;Consider an e-commerce order.&lt;/p&gt;

&lt;p&gt;You might need to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Create order
Reserve inventory
Create payment record
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If these operations are tightly coupled and one fails, the application may need transactional behavior.&lt;/p&gt;

&lt;h3&gt;
  
  
  Transactions Aren't Free
&lt;/h3&gt;

&lt;p&gt;Transactions can introduce:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Locking&lt;/li&gt;
&lt;li&gt;Contention&lt;/li&gt;
&lt;li&gt;Complexity&lt;/li&gt;
&lt;li&gt;Performance costs
Therefore, they should be used intentionally.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Distributed Transactions Are Harder
&lt;/h3&gt;

&lt;p&gt;When operations span multiple independent services, maintaining atomicity becomes significantly more complicated.&lt;/p&gt;

&lt;p&gt;Architectures may instead use patterns such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Saga
Outbox Pattern
Event-driven workflows
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Final Thoughts
&lt;/h3&gt;

&lt;p&gt;Transactions protect data integrity.&lt;/p&gt;

&lt;p&gt;Whenever multiple changes must behave like one logical operation, understanding transactions becomes essential.&lt;/p&gt;

</description>
      <category>database</category>
      <category>backend</category>
      <category>sql</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>Why Observability Is Different From Logging</title>
      <dc:creator>Soumyajit Mukherjee</dc:creator>
      <pubDate>Fri, 23 Oct 2026 09:22:02 +0000</pubDate>
      <link>https://dev.to/sam000/why-observability-is-different-from-logging-3049</link>
      <guid>https://dev.to/sam000/why-observability-is-different-from-logging-3049</guid>
      <description>&lt;p&gt;Many developers think observability means "add more logs."&lt;/p&gt;

&lt;p&gt;Logging is important.&lt;/p&gt;

&lt;p&gt;But observability is broader.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Three Common Pillars
&lt;/h3&gt;

&lt;p&gt;Observability is commonly discussed through:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Logs
Metrics
Traces
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each answers different questions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Logs
&lt;/h3&gt;

&lt;p&gt;Logs tell you about events.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2026-08-14 14:20:03
Order 12345 payment failed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Useful, but often isolated.&lt;/p&gt;

&lt;h3&gt;
  
  
  Metrics
&lt;/h3&gt;

&lt;p&gt;Metrics measure numerical behavior.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HTTP requests/sec
CPU usage
Memory usage
Error rate
Request latency
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You might discover:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;95th percentile latency = 2.4 seconds
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That tells you something is happening at scale.&lt;/p&gt;

&lt;h3&gt;
  
  
  Traces
&lt;/h3&gt;

&lt;p&gt;Distributed tracing follows a request across multiple components.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;API Gateway
   ↓
User Service
   ↓
Order Service
   ↓
Payment Service
   ↓
Database
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the request takes five seconds, tracing can help identify where that time went.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Logs Alone Aren't Enough
&lt;/h3&gt;

&lt;p&gt;Imagine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Payment failed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A log tells you the payment failed.&lt;/p&gt;

&lt;p&gt;A metric tells you that payment failures increased from:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0.5% → 12%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A trace can help show that requests are timing out inside a specific dependency.&lt;/p&gt;

&lt;p&gt;Together, these signals provide much better visibility.&lt;/p&gt;

&lt;h3&gt;
  
  
  Final Thoughts
&lt;/h3&gt;

&lt;p&gt;Logging answers:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What happened?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Metrics help answer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How often is it happening?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Tracing helps answer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Where did the request spend its time?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Understanding all three is an important step toward production-grade engineering.&lt;/p&gt;

</description>
      <category>observability</category>
      <category>devops</category>
      <category>monitoring</category>
      <category>backend</category>
    </item>
    <item>
      <title>The Difference Between Authentication and Authorization</title>
      <dc:creator>Soumyajit Mukherjee</dc:creator>
      <pubDate>Fri, 23 Oct 2026 09:14:15 +0000</pubDate>
      <link>https://dev.to/sam000/the-difference-between-authentication-and-authorization-3pa0</link>
      <guid>https://dev.to/sam000/the-difference-between-authentication-and-authorization-3pa0</guid>
      <description>&lt;p&gt;Authentication and authorization are often confused.&lt;/p&gt;

&lt;p&gt;They answer two completely different questions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Authentication
&lt;/h3&gt;

&lt;p&gt;Authentication asks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Who are you?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Passwords&lt;/li&gt;
&lt;li&gt;Passkeys&lt;/li&gt;
&lt;li&gt;OAuth&lt;/li&gt;
&lt;li&gt;Multi-factor authentication&lt;/li&gt;
&lt;li&gt;Biometrics
When a user logs in, the system authenticates their identity.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Authorization
&lt;/h3&gt;

&lt;p&gt;Authorization asks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What are you allowed to do?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Suppose Alice is authenticated.&lt;/p&gt;

&lt;p&gt;That doesn't mean Alice should be able to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Delete every user
View financial reports
Modify system settings
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The application needs authorization rules.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example
&lt;/h3&gt;

&lt;p&gt;Imagine an API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;DELETE /users/123
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Authentication determines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Is this request associated with Alice?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Authorization determines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Is Alice allowed to delete user 123?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Role-Based Authorization
&lt;/h3&gt;

&lt;p&gt;A simple system might define:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;roles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;USER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;read&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;ADMIN&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;read&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;write&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;delete&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then middleware can enforce permissions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why This Matters
&lt;/h3&gt;

&lt;p&gt;A common security mistake is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User is logged in
        ↓
Allow everything
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Authentication isn't authorization.&lt;/p&gt;

&lt;h3&gt;
  
  
  Resource Ownership
&lt;/h3&gt;

&lt;p&gt;Authorization can also depend on ownership.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /users/123/profile
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;might be allowed only if:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;123&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or the user has an administrative permission.&lt;/p&gt;

&lt;h3&gt;
  
  
  Final Thoughts
&lt;/h3&gt;

&lt;p&gt;Remember the distinction:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Authentication = Who are you?
Authorization  = What can you do?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Keeping these concepts separate leads to much safer application designs.&lt;/p&gt;

</description>
      <category>security</category>
      <category>authentication</category>
      <category>authorization</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Caching: The Performance Trick That Can Also Break Your Application</title>
      <dc:creator>Soumyajit Mukherjee</dc:creator>
      <pubDate>Fri, 23 Oct 2026 09:03:57 +0000</pubDate>
      <link>https://dev.to/sam000/caching-the-performance-trick-that-can-also-break-your-application-i9k</link>
      <guid>https://dev.to/sam000/caching-the-performance-trick-that-can-also-break-your-application-i9k</guid>
      <description>&lt;p&gt;Caching is one of the most effective ways to improve application performance.&lt;/p&gt;

&lt;p&gt;It can also produce some of the strangest bugs developers encounter.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Cache?
&lt;/h3&gt;

&lt;p&gt;Suppose a page repeatedly requests the same expensive data.&lt;/p&gt;

&lt;p&gt;Without caching:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Request
  ↓
Application
  ↓
Database
  ↓
Response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With caching:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Request
  ↓
Cache
  ↓
Response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The expensive operation can potentially be avoided.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cache-Aside Pattern
&lt;/h3&gt;

&lt;p&gt;One common strategy is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;database&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getData&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The application checks the cache first.&lt;/p&gt;

&lt;p&gt;If the data isn't there, it loads the data from the database and stores it in the cache.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Hard Part: Invalidation
&lt;/h3&gt;

&lt;p&gt;Imagine you cache:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;user:&lt;/span&gt;&lt;span class="mi"&gt;123&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then the user changes their name.&lt;/p&gt;

&lt;p&gt;The database now says:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Alex Smith
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;but the cache still says:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Alex Johnson
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your application now returns stale information.&lt;/p&gt;

&lt;p&gt;This is why developers often repeat:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;There are only a few hard things in computer science, and cache invalidation is one of them.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  TTL
&lt;/h3&gt;

&lt;p&gt;A time-to-live can automatically expire cached values.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;product:123
TTL: 300 seconds
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This doesn't eliminate stale data completely, but it limits how long it can remain.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cache Everything?
&lt;/h3&gt;

&lt;p&gt;No.&lt;/p&gt;

&lt;p&gt;Caching data that changes frequently can create complexity without providing much benefit.&lt;/p&gt;

&lt;h3&gt;
  
  
  Final Thoughts
&lt;/h3&gt;

&lt;p&gt;Caching should be introduced around measurable performance problems.&lt;/p&gt;

&lt;p&gt;First understand:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;What is expensive?
How frequently is it requested?
How often does it change?
How stale can it safely be?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then design the cache.&lt;/p&gt;

</description>
      <category>caching</category>
      <category>performance</category>
      <category>backend</category>
      <category>webdev</category>
    </item>
    <item>
      <title>What Makes a Good Git Commit?</title>
      <dc:creator>Soumyajit Mukherjee</dc:creator>
      <pubDate>Fri, 23 Oct 2026 08:55:53 +0000</pubDate>
      <link>https://dev.to/sam000/what-makes-a-good-git-commit-gg3</link>
      <guid>https://dev.to/sam000/what-makes-a-good-git-commit-gg3</guid>
      <description>&lt;p&gt;Git commits are more than checkpoints.&lt;/p&gt;

&lt;p&gt;They form a historical record of how a project evolved.&lt;/p&gt;

&lt;p&gt;Unfortunately, many repositories contain commits like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;update
fix
changes
final
final2
please work
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These messages aren't very useful.&lt;/p&gt;

&lt;h3&gt;
  
  
  A Better Commit
&lt;/h3&gt;

&lt;p&gt;Instead of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fixed stuff
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;write:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Fix duplicate order creation during checkout
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A good commit should communicate the purpose of the change.&lt;/p&gt;

&lt;h3&gt;
  
  
  Keep Commits Focused
&lt;/h3&gt;

&lt;p&gt;A commit like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Add authentication
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;might include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Login&lt;/li&gt;
&lt;li&gt;Registration&lt;/li&gt;
&lt;li&gt;Password reset&lt;/li&gt;
&lt;li&gt;UI redesign&lt;/li&gt;
&lt;li&gt;Database migration&lt;/li&gt;
&lt;li&gt;Random formatting changes
That's difficult to review.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead, separate logical changes when possible.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Small Commits Help
&lt;/h3&gt;

&lt;p&gt;Focused commits make it easier to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Review code&lt;/li&gt;
&lt;li&gt;Revert changes&lt;/li&gt;
&lt;li&gt;Find bugs&lt;/li&gt;
&lt;li&gt;Understand history&lt;/li&gt;
&lt;li&gt;Cherry-pick changes&lt;/li&gt;
&lt;li&gt;Debug regressions&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Conventional Commits
&lt;/h3&gt;

&lt;p&gt;Some teams use a convention such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;feat: add password reset flow
fix: prevent duplicate payments
docs: update installation guide
refactor: simplify user service
test: add order validation tests
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates predictable history.&lt;/p&gt;

&lt;h3&gt;
  
  
  Commit Messages Should Explain Why
&lt;/h3&gt;

&lt;p&gt;This:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Update payment service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;is vague.&lt;/p&gt;

&lt;p&gt;This is better:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Retry failed payment requests after temporary gateway errors
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The second message tells future developers what changed and why it matters.&lt;/p&gt;

&lt;h3&gt;
  
  
  Final Thoughts
&lt;/h3&gt;

&lt;p&gt;Your Git history is documentation.&lt;/p&gt;

&lt;p&gt;Write commits as if someone will need to understand them six months from now.&lt;/p&gt;

</description>
      <category>git</category>
      <category>github</category>
      <category>programming</category>
      <category>devtools</category>
    </item>
    <item>
      <title>How HTTP Status Codes Make APIs Easier to Understand</title>
      <dc:creator>Soumyajit Mukherjee</dc:creator>
      <pubDate>Fri, 23 Oct 2026 08:49:24 +0000</pubDate>
      <link>https://dev.to/sam000/how-http-status-codes-make-apis-easier-to-understand-48n</link>
      <guid>https://dev.to/sam000/how-http-status-codes-make-apis-easier-to-understand-48n</guid>
      <description>&lt;p&gt;HTTP status codes are more than numbers.&lt;/p&gt;

&lt;p&gt;They communicate what happened during an HTTP request.&lt;/p&gt;

&lt;p&gt;Using them consistently makes APIs easier to consume and debug.&lt;/p&gt;

&lt;h3&gt;
  
  
  2xx: Success
&lt;/h3&gt;

&lt;p&gt;A common example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;200 OK
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;means the request succeeded.&lt;/p&gt;

&lt;p&gt;Another important status is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;201 Created
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;which is useful when a resource has been created.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST /users
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;might return:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;201 Created
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4xx: Client Problems
&lt;/h3&gt;

&lt;p&gt;These usually indicate that something about the request isn't acceptable.&lt;/p&gt;

&lt;p&gt;Examples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;400 Bad Request
401 Unauthorized
403 Forbidden
404 Not Found
409 Conflict
429 Too Many Requests
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For example, an unauthenticated request might receive:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;401 Unauthorized
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;while an authenticated user lacking permission may receive:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;403 Forbidden
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5xx: Server Problems
&lt;/h3&gt;

&lt;p&gt;These indicate that the server encountered an error.&lt;/p&gt;

&lt;p&gt;The classic example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;500 Internal Server Error
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Another useful code is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;503 Service Unavailable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;which can indicate temporary service unavailability.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Consistency Matters
&lt;/h3&gt;

&lt;p&gt;Imagine an API that returns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;200
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;for every request, even when something fails.&lt;/p&gt;

&lt;p&gt;The client now has to inspect custom fields to determine whether the operation succeeded.&lt;/p&gt;

&lt;p&gt;Standard HTTP semantics make APIs much easier to understand.&lt;/p&gt;

&lt;h3&gt;
  
  
  Don't Overcomplicate It
&lt;/h3&gt;

&lt;p&gt;You don't need to memorize every status code.&lt;/p&gt;

&lt;p&gt;Start with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;200
201
204
400
401
403
404
409
429
500
503
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These cover a large portion of everyday API development.&lt;/p&gt;

&lt;h3&gt;
  
  
  Final Thoughts
&lt;/h3&gt;

&lt;p&gt;Good API design isn't only about endpoints and JSON.&lt;/p&gt;

&lt;p&gt;The status codes are part of the API contract too.&lt;/p&gt;

</description>
      <category>http</category>
      <category>api</category>
      <category>backend</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Understanding JWT Authentication Without the Hype</title>
      <dc:creator>Soumyajit Mukherjee</dc:creator>
      <pubDate>Fri, 23 Oct 2026 08:41:14 +0000</pubDate>
      <link>https://dev.to/sam000/understanding-jwt-authentication-without-the-hype-36jp</link>
      <guid>https://dev.to/sam000/understanding-jwt-authentication-without-the-hype-36jp</guid>
      <description>&lt;p&gt;JSON Web Tokens are widely used for authentication.&lt;/p&gt;

&lt;p&gt;They're also widely misunderstood.&lt;/p&gt;

&lt;p&gt;A JWT is not automatically more secure than sessions.&lt;/p&gt;

&lt;p&gt;It is simply a token format with specific properties.&lt;/p&gt;

&lt;h3&gt;
  
  
  Basic JWT Structure
&lt;/h3&gt;

&lt;p&gt;A JWT commonly consists of three sections:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Header.Payload.Signature
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;xxxxx.yyyyy.zzzzz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The payload can contain claims:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sub"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"12345"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Important: JWT Payloads Are Not Secret
&lt;/h3&gt;

&lt;p&gt;JWT contents are typically encoded, not encrypted.&lt;/p&gt;

&lt;p&gt;Therefore, don't place sensitive information inside them.&lt;/p&gt;

&lt;p&gt;For example, avoid putting:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"password"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"secret123"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;in a JWT.&lt;/p&gt;

&lt;h3&gt;
  
  
  Authentication Flow
&lt;/h3&gt;

&lt;p&gt;A common flow is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User logs in
     ↓
Server validates credentials
     ↓
Server issues token
     ↓
Client sends token with requests
     ↓
Server validates token
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Token Expiration
&lt;/h3&gt;

&lt;p&gt;Tokens should generally have appropriate expiration periods.&lt;/p&gt;

&lt;p&gt;Short-lived access tokens can reduce the impact of token theft.&lt;/p&gt;

&lt;p&gt;Some architectures also use refresh tokens to obtain new access tokens.&lt;/p&gt;

&lt;h3&gt;
  
  
  Storage Matters
&lt;/h3&gt;

&lt;p&gt;Where tokens are stored affects security.&lt;/p&gt;

&lt;p&gt;Developers should understand the risks of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;XSS&lt;/li&gt;
&lt;li&gt;CSRF&lt;/li&gt;
&lt;li&gt;Token theft&lt;/li&gt;
&lt;li&gt;Insecure browser storage&lt;/li&gt;
&lt;li&gt;Long-lived tokens
There isn't a universal storage strategy that is correct for every architecture.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  JWT Isn't a Session Replacement by Default
&lt;/h3&gt;

&lt;p&gt;Traditional server-side sessions can be simpler for many applications.&lt;/p&gt;

&lt;p&gt;The right choice depends on requirements.&lt;/p&gt;

&lt;h3&gt;
  
  
  Final Thoughts
&lt;/h3&gt;

&lt;p&gt;Learn JWT as an authentication mechanism, not as a security buzzword.&lt;/p&gt;

&lt;p&gt;The important questions are:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Where is the token stored?&lt;br&gt;
How long does it live?&lt;br&gt;
How is it revoked?&lt;br&gt;
How are requests authenticated?&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>security</category>
      <category>jwt</category>
      <category>authentication</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
