<?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: Ramona Schwering</title>
    <description>The latest articles on DEV Community by Ramona Schwering (@leichteckig).</description>
    <link>https://dev.to/leichteckig</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2586564%2F4879b8a6-33cf-4213-a2ed-93f5a0beb695.jpg</url>
      <title>DEV Community: Ramona Schwering</title>
      <link>https://dev.to/leichteckig</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/leichteckig"/>
    <language>en</language>
    <item>
      <title>Let's Sketch Identity: Authentication vs. Authorization</title>
      <dc:creator>Ramona Schwering</dc:creator>
      <pubDate>Wed, 24 Sep 2025 11:01:00 +0000</pubDate>
      <link>https://dev.to/auth0/lets-sketch-identity-authentication-vs-authorization-48kb</link>
      <guid>https://dev.to/auth0/lets-sketch-identity-authentication-vs-authorization-48kb</guid>
      <description>&lt;p&gt;So, you are building an application and need a login form. In it, you’ll get the user's email and password, send them to an API, and... something happens. The user is logged in afterwards. But what is that something? How does your application decide who gets in and what they get to see?&lt;/p&gt;

&lt;p&gt;This is the first article in a series called "Let's Sketch Identity." These blog posts will use my notes from when I started learning about identity concepts as a Developer Advocate. Think of them as my Identity Sketchbook, and join me on my journey back then! ❤️&lt;/p&gt;

&lt;p&gt;In this series, I will show you the core ideas of modern identity using a simple, continuous story: no complex specifications, just clear, practical explanations for web developers. Today, I am starting with the two most important concepts: Authentication and Authorization. You can think of them as a Bouncer checking IDs at a door and a Clipboard listing your permissions.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is Authentication? The Bouncer Analogy
&lt;/h2&gt;

&lt;p&gt;Do you know about the Persuadable Bouncer? It’s an exploitable four-panel comic series featuring a man in a suit blocking a door and allowing the entrance in the fourth panel. This is how I like to picture Authentication (and I just love to draw memes 😁). Okay, think of authentication like this: Authentication is the bouncer standing at the front door, e.g., of a venue. In real life, the venue is your application. To get in, you have to show your ID, which has your credentials. &lt;/p&gt;

&lt;p&gt;Let's visualize this. In the first panel, we see our Bouncer blocking the door as a user presents their ID with their credentials. Once the Bouncer validates that ID, the lock clicks open, and as we see in the second panel, he finally opens the door.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbo4k94qj71gdh7gdohpd.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbo4k94qj71gdh7gdohpd.jpg" alt="A sketch note illustrating authentication in identity management, where a bouncer checks a user's ID before opening a door." width="800" height="499"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;And that’s it: You've been authenticated! The shorthand for this process is &lt;strong&gt;Authn&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;At its core, authentication is proving that somebody or something is who they say they are. It's the lock on the door of your application. Talking about Authn in an Identity scenario usually means verifying credentials. These credentials come in all shapes and sizes; while a username and password combination is the classic example, they can also be a private and public key pair. Modern approaches even include passwordless authentication, which verifies a user’s identity with something other than a password, like a magic link sent to their email or a biometric trait like a fingerprint.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is Authorization? The Clipboard Analogy
&lt;/h2&gt;

&lt;p&gt;Just because you are inside the room does not mean you can do whatever you want. This is where Authorization comes in, like the bouncer handing you a clipboard. Picture that clipboard as a checklist or ruleset explaining to you your permissions:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fml2a47sm6dtoyk2uts1d.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fml2a47sm6dtoyk2uts1d.jpg" alt="A sketch note illustrating authorization, where a user is handed a clipboard listing their permissions. This visualizes a key part of the authentication vs. authorization flow." width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You see, the clipboard lists exactly what you are allowed to do. As you can see in the sketch, you might have permission to view rooms and make a guestbook entry, but the permission to change the AC settings is firmly crossed out. One crucial rule is that the bouncer will always check your ID before handing you the clipboard. You must first prove who you are &lt;strong&gt;before&lt;/strong&gt; you can be given a list of things you can do.&lt;/p&gt;

&lt;p&gt;My short take: Once a user enters the door, we must know what they can do. That's Authorization. Authorization checks whether somebody or something has access to a particular resource or is allowed to perform a specific action. The shorthand for Authorization is &lt;strong&gt;Authz&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  How This Works in a Real-World Frontend Application
&lt;/h2&gt;

&lt;p&gt;So, how does this story of the bouncer and the clipboard play out in a real web application? Let's walk through it.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A new user comes to your site and clicks on their "My Profile" link.&lt;/li&gt;
&lt;li&gt;Your application’s bouncer stops them, sees they do not have a valid ID yet, and sends them to the login page.&lt;/li&gt;
&lt;li&gt;The user provides their credentials (their ID). The system checks them and confirms their identity. Authentication is now successful.&lt;/li&gt;
&lt;li&gt;Now that your application knows who the user is, it prepares their personal clipboard of permissions.&lt;/li&gt;
&lt;li&gt;The user is sent to the "My Profile" page. They can see all their personal information, but the "Admin Panel" button is hidden. Why? Their clipboard says they do not have access to &lt;code&gt;admin_panel&lt;/code&gt; permission. This is Authorization in action.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Understanding this difference is very important for you as a frontend developer, as it directly affects the UI you build daily. Some pseudo-codes show you how that logic might look inside a component. Does this look familiar to you?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// In some component that renders a navigation bar
function Navbar({ user }) {
  // The bouncer checks for an ID (Authentication)
  if (!user.isAuthenticated) {
    return &amp;lt;LoginButton /&amp;gt;;
  }
  // If authenticated, the bouncer checks the clipboard (Authorization)
  return (
    &amp;lt;div&amp;gt;
      &amp;lt;WelcomeMessage user={user} /&amp;gt;
      &amp;lt;ProfileLink /&amp;gt;
      {/* Check the clipboard for a specific permission */}
      {user.hasPermission('access:admin_panel') &amp;amp;&amp;amp;
        &amp;lt;AdminPanelLink /&amp;gt;
      }
      &amp;lt;LogoutButton /&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;However, no worries! This blog post will revolve around my sketch notes, so I have some prepared. Let’s take a look at this workflow:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyw2i4dckgazls0pi7z8v.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyw2i4dckgazls0pi7z8v.jpg" alt="A sketch showing the identity management flow from Authentication (Authn), represented by a bouncer, to Authorization (Authz), represented by a permissions clipboard." width="800" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You see, Authn and Authz are not the same thing. However, they belong together: Authentication is the first step (I’d even call it groundwork), so that Authz can take place. That makes sense, as you need to know your user before deciding on their permission, right? &lt;/p&gt;

&lt;h2&gt;
  
  
  But There Are Different Types of Clipboards!?
&lt;/h2&gt;

&lt;p&gt;That simple &lt;code&gt;.hasPermission('...')&lt;/code&gt; check in our code is powerful. However, it makes me think. How does the system decide on the user’s permissions in the first place? The bouncer's clipboard is not just a simple list. Let's take a quick look at the most common variations, as I depicted four types of clipboards in my sketches.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Role-Based Access Control&lt;/em&gt; (RBAC) assigns permissions to users based on their roles, such as “admin,” “editor,” or “viewer.” In the analogy I’m using in my sketches, this is like the “hat” the user wears. Instead of providing a single set of permissions, RBAC offers tailored permissions corresponding to each specific role. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3m4akaj13gw7574f9nyk.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3m4akaj13gw7574f9nyk.jpg" alt="A cartoon drawing illustrating Role-Based Access Control (RBAC). The scene, labeled " width="800" height="518"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Attribute-Based Access Control&lt;/em&gt; (ABAC) is an authorization model that determines access based on user attributes (or characteristics) rather than roles. It’s similar, but not the same as Policy-Based Access Control (PBAC): They are often considered the same, but are not. In our scene, these are the “tags” the user has on their conference badge, such as “Attendee”, “Speaker”, or the time when they check in. ABAC protects resources from unauthorized users and actions that do not align with the approved tags (which are basically attributes) established by an organization’s security policies.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwe80ufgggebv5pervd7r.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwe80ufgggebv5pervd7r.jpg" alt="A cartoon drawing illustrating Attribute-Based Access Control (ABAC). The scene, labeled " width="800" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Relationship-Based Access Control&lt;/em&gt; (ReBAC) handles access decisions based on a subject's relationships. Such a subject could be a user, device, or application. Or in our sketch, it’s visualized as a guest list, where only the family is added to. When a subject tries to access an event or a resource (in real life), the system evaluates the specific relationships tied to that subject to decide whether to grant access or not. In my analogy, it may look like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkgjta9egore5ic7lhak8.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkgjta9egore5ic7lhak8.jpg" alt="A cartoon drawing illustrating Relationship-Based Access Control (ReBAC). The scene, labeled " width="800" height="486"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Last but not least, there’s &lt;em&gt;Delegated Authorization&lt;/em&gt;. It allows a user to grant one application permission to access their data from another service, without sharing their password, just like someone presenting their ID and a document issued by someone else asking to let them enter the room on their behalf. The user would have to approve the access requested by the first party to be shared by the third party. This access is limited to the permissions that the user grants. For example, LinkedIn would only get access to our Gmail contacts, but not our inbox or calendar.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh7d1r9tm0fjir3wmd6e1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh7d1r9tm0fjir3wmd6e1.jpg" alt="A cartoon drawing illustrating Relationship-Based Access Control (ReBAC). The scene, labeled " width="800" height="471"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;And that is it for my first sketch! The story is this straightforward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Authentication (Authn) is the action done by the Bouncer: They check your ID to prove who you are.&lt;/li&gt;
&lt;li&gt;Authorization (Authz) is the action of providing the Clipboard to the person, being the user. It lists what you can do once you are inside.
And you can never get your clipboard until the bouncer has approved your ID. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's zoom out and look at the entire journey in a single picture to tie it all together. From the initial ID check by the Bouncer to the different kinds of Clipboards he uses, here is the full story from my Identity Sketchbook:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhwv1zlgb4qoasip2gnse.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhwv1zlgb4qoasip2gnse.jpg" alt="A complete sketchnote diagram illustrating the full identity management journey, covering the 'authentication vs. authorization' process and various authorization models like RBAC and ABAC." width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Great, your user is now authenticated and inside the application! ❤️ However, you might have already guessed, Identity does not stop here. How does the app remember them when they navigate from one page to another? They do not have to show their ID for every single click. How is their "clipboard" carried around with them?&lt;br&gt;
In the next article, I will show you the answer: the Digital Passport, also known as the JSON Web Token (JWT). Stay tuned! 🔥&lt;/p&gt;

&lt;p&gt;In the meantime, there's some interesting reads if you want to dive deeper:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://auth0.com/blog/authorization-authentication-developers-global-scale/" rel="noopener noreferrer"&gt;Authentication and Authorization For Developers Who Build at Global Scale&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://auth0.com/blog/authentication-authorization-and-accounting-for-developers/" rel="noopener noreferrer"&gt;Authentication, Authorization, and Accounting For Developers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://auth0.com/blog/five-ruby-gems-for-authentication-and-authorization/" rel="noopener noreferrer"&gt;Five Ruby Gems for Authentication and Authorization&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>authentication</category>
      <category>sketchnotes</category>
      <category>identity</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Sketching AI Security: Identity and Security Challenges in AI Development</title>
      <dc:creator>Ramona Schwering</dc:creator>
      <pubDate>Tue, 01 Jul 2025 17:09:43 +0000</pubDate>
      <link>https://dev.to/auth0/sketching-ai-security-identity-and-security-challenges-in-ai-development-21p8</link>
      <guid>https://dev.to/auth0/sketching-ai-security-identity-and-security-challenges-in-ai-development-21p8</guid>
      <description>&lt;p&gt;Let's talk about AI. I know, it pops up everywhere, doesn't it? AI is a powerful tool, from helping us write code faster to building complex systems that handle critical business processes. Like any other tool, it introduces a complete set of challenges. Specifically, we must not forget about &lt;strong&gt;security when we develop with AI&lt;/strong&gt;, especially when working with digital identities. Our identity and the identities of our users are our most precious data set, and they need to be protected. This is not just about protecting your users but also about securing the AI itself and the sensitive data it touches.&lt;/p&gt;

&lt;p&gt;You might ask yourself: "What new identity challenges can AI introduce?" Or perhaps: "Are the old security practices still good enough?" The short answer is: No, not entirely. The AI landscape adds new layers of complexity, and we need to understand them to build truly robust and trustworthy systems. When we speak about AI development, we mean two main scenarios: either you are integrating AI features into existing, more traditional applications (think a chatbot in an e-commerce site, making it "AI-powered"), or you are building entirely new systems around AI agents that have greater autonomy and interact with many other services. Both scenarios bring unique demands to the table.&lt;/p&gt;

&lt;p&gt;This is enough reason for me to educate myself and be prepared. I used to learn new concepts by drawing sketch notes, and with this article, I want to share them with you and invite you to learn about security in AI, too. Let’s sketch &lt;a href="https://a0.to/ai-content" rel="noopener noreferrer"&gt;AI security&lt;/a&gt;! 🎨&lt;/p&gt;

&lt;h2&gt;
  
  
  New Faces, New IDs: Sketching the AI Identity Landscape
&lt;/h2&gt;

&lt;p&gt;As a first step, I want to draw our environment. When you develop a traditional application, you primarily manage human identities: The users of your applications log in and grant them access based on who they are. Simple enough, right? However, with AI, things get a bit more interesting. We now have three main types of identities to consider:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa7p9cuqp2whpq1qwjfcp.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa7p9cuqp2whpq1qwjfcp.jpg" alt="The provided sketchnote image showing a human figure, a robot head, and an AI agent head, with " width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Human Identities&lt;/strong&gt;: These are still your users - developers interacting with AI tools, administrators managing AI models, or end-users consuming AI-powered features. The basics of strong authentication and authorization still apply here, but the attack surface might expand as AI tools become gateways to sensitive data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Non-Human Identities&lt;/strong&gt;: They are self-explanatory at first sight - all identities being non-human but still with a need to be secured. I would still distinguish them between “Machine identities” and “AI Agent Identities” because AIs are more "free spirits" than normal services and APIs. This means they are more like a robot with a brain, capable of making decisions. So, let’s zoom in:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Machine Identities&lt;/strong&gt;: Your backend services, CI/CD pipelines, and compute instances running AI models need identities to interact securely with other services. Think about your model training infrastructure or inference endpoints; they must authenticate to data sources and other APIs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Agent Identities&lt;/strong&gt;: This is the truly new kid on the block! When you work with large language models (LLMs) or build multi-agent systems, these AI entities often need to act on behalf of users or other systems. They might access databases, send emails, or trigger other AI agents. How do you give an AI agent an identity? How do you control what it can do? This is a crucial area.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;It is like adding more players to your team; each needs a clear name tag and specific permissions. If you fail to do this, you will have a security-free-for-all in your hands.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI's Tricky Foes: A Sketched Look at New Security Risks
&lt;/h2&gt;

&lt;p&gt;Next, as we know what to protect, let’s see what we’re up against. You already know about SQL injection, XSS, and all the "classic" web vulnerabilities. But AI brings its nasty surprises to the party. &lt;br&gt;
The first source I love to look at is OWASP. OWASP (short for Open Web Application Security Project) is a volunteer project that helps us raise web security. They are most famous for their ranking of security risks, and along with this, they have rankings for the AI space too:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://owasp.org/www-project-machine-learning-security-top-10/" rel="noopener noreferrer"&gt;OWASP Machine Learning Security Top 10&lt;/a&gt; lists the top 10 security issues of machine learning systems.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://owasp.org/www-project-top-10-for-large-language-model-applications/" rel="noopener noreferrer"&gt;OWASP Top 10 for Large Language Model Applications&lt;/a&gt; reports the top 10 security issues for generative AI systems and applications.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Another organization focusing on AI security issues is &lt;a href="https://www.mitre.org/" rel="noopener noreferrer"&gt;MITRE&lt;/a&gt;, which has released &lt;a href="https://atlas.mitre.org/" rel="noopener noreferrer"&gt;ATLAS&lt;/a&gt; (Adversarial Threat Landscape for Artificial-Intelligence Systems). ATLAS is a living knowledge base of adversary tactics and techniques against AI-enabled systems based on real-world attack observations. The &lt;a href="https://www.google.com/search?q=https://www.nist.gov/artificial-intelligence/ai-risk-management-framework" rel="noopener noreferrer"&gt;NIST AI Risk Management Framework&lt;/a&gt; provides comprehensive guidance on managing AI risks throughout the lifecycle. Those resources draft a first picture of the biggest enemies we’re about to face.&lt;br&gt;
Let's zoom in and examine some of your most critical new security challenges. This is like an expanded playground where new rules apply. This is how I envision, thus, draw them:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwiilsiblocrvdhlrnro6.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwiilsiblocrvdhlrnro6.jpg" alt="The provided sketchnote image shows four panels: Prompt Injection, Data Poisoning, Insecure Plugin Design / Excessive Agency (Control Panel), and Model Theft. Each panel illustrates the concept with characters and relevant objects. The overall image has " width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Prompt Injection: When Your AI Turns Against You
&lt;/h3&gt;

&lt;p&gt;This is the most talked-about AI security vulnerability right now. Prompt injection happens when a malicious user crafts an input (a "prompt") that tricks an LLM into ignoring its original instructions or performing unintended actions. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcr0jpojixh8m9923wnha.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcr0jpojixh8m9923wnha.jpg" alt="A hacker tricking the AI Agent" width="800" height="581"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Imagine an AI customer service bot that is supposed to give refunds. I would love to call it “social engineer the LLM” instead of the usual human being. A clever prompt could make it transfer money to the attacker instead. Or, consider an AI-assisted coding tool. A malicious prompt could introduce vulnerabilities into your code. It is like a puppet master pulling strings on your AI.&lt;/p&gt;

&lt;p&gt;The challenge here is that the input is now code for the AI model. The line between data and instruction becomes very blurry. This is also how Credential Access often happens in AI applications; attackers use prompt injection to trick the AI into revealing credentials it has access to, or even to perform actions that expose them. Furthermore, Sensitive Information Disclosure can occur when an AI accidentally (or deliberately, via prompt injection) reveals private user data or confidential business information during its responses. How do you mitigate this? Input validation is a start, but it is not enough. You can consider techniques like &lt;a href="https://www.ibm.com/think/topics/instruction-tuning" rel="noopener noreferrer"&gt;instruction tuning&lt;/a&gt;, &lt;a href="https://www.confident-ai.com/blog/llm-guardrails-the-ultimate-guide-to-safeguard-llm-systems#what-are-llm-guardrails-" rel="noopener noreferrer"&gt;guardrails&lt;/a&gt;, and multi-stage prompts to sanitize inputs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Insecure Plugin Design and Excessive Agency: Giving Your AI Too Much Power
&lt;/h3&gt;

&lt;p&gt;This is a big one, especially with multi-agent systems and applications using external tools or plugins. What do I mean by “plugin” specifically? "You can extend the capabilities of an LLM by using plugins. Plugins are software components that are called by the LLM to perform specific tasks, such as calling an external service or accessing a resource. Basically, based on the interaction with the user, the LLM calls the plugin to perform some processing or retrieve data. Thus, we are using OWASP and MITRE terminology to define a plugin as a generic approach to extending the functionality of an LLM. Plugins can be implemented through specific LLM methods such as &lt;a href="https://platform.openai.com/docs/guides/function-calling?api-mode=responses" rel="noopener noreferrer"&gt;function_calls&lt;/a&gt; or &lt;a href="https://platform.openai.com/docs/assistants/tools" rel="noopener noreferrer"&gt;tool_calls&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3zqljaw41g7xb22jgmzo.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3zqljaw41g7xb22jgmzo.jpg" alt="A control panel, confusing the AI Agent" width="800" height="566"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Insecure Plugin Design leads to vulnerabilities when these plugins are not correctly secured. Without the proper precautions, an attacker could exploit a plugin to perform unauthorized operations or access data they are not entitled to. &lt;/p&gt;

&lt;p&gt;This can directly lead to &lt;strong&gt;Privilege Escalation&lt;/strong&gt;, where an attacker gains higher permissions on your AI-powered application by exploiting a vulnerability, often through these insecure plugins or by exploiting the AI's Excessive Agency—meaning, the AI has more permissions than it actually needs. Imagine an AI agent with direct write access to your production database when it only needed read access to a specific table!&lt;br&gt;
You must be very careful when designing and securing these interactions. It is about the AI's logic and the security around its tools. These vulnerabilities are clearly outlined in frameworks like the &lt;a href="https://owasp.org/www-project-top-10-for-large-language-model-applications/" rel="noopener noreferrer"&gt;OWASP Top 10 for Large Language Model Applications&lt;/a&gt;, an excellent resource for deeper dives into AI security.&lt;/p&gt;

&lt;h3&gt;
  
  
  Data Poisoning: Corrupting the Source
&lt;/h3&gt;

&lt;p&gt;AI models learn from data. What happens if that data is maliciously tampered with? This is data poisoning. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcehrt7jsw20a1q4nc8ro.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcehrt7jsw20a1q4nc8ro.jpg" alt="A bartender serving poison to the AI Agent" width="800" height="521"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;An attacker could inject insufficient data into your training sets, leading your AI model to learn incorrect, biased, or malicious behaviors. For example, poisoning a fraud detection model could cause it to miss certain types of fraud or flag legitimate transactions as fraudulent.&lt;br&gt;
This is a supply chain attack on your AI model. To prevent this, you need robust data governance, strong access controls over your data pipelines, and rigorous data validation. Trust but verify, always! 🕵️‍♀️&lt;/p&gt;

&lt;h3&gt;
  
  
  Model Theft and Evasion Attacks
&lt;/h3&gt;

&lt;p&gt;Your trained AI model is valuable intellectual property. Attackers might try to steal it or reverse-engineer its logic, which is model theft. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjohsi6tis6i325a80gfx.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjohsi6tis6i325a80gfx.jpg" alt="A hacker stealing an AI Agent" width="800" height="555"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As an honorable mention, even if not mentioned in the sketch, evasion attacks are interesting in this scenario, too: They involve crafting inputs that cause a deployed AI model to make incorrect predictions without detection. For example, an attacker might modify an image slightly so that a facial recognition system fails to identify them.&lt;br&gt;
In both cases, protecting your models involves secure deployment practices, API rate limiting, and potentially techniques like differential privacy during training to obscure model internals.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building Bulletproof AI: Let's Draw Our Strategy
&lt;/h2&gt;

&lt;p&gt;So, what can you do about all these new threats and identity complexities? It is not about throwing out your existing security practices but extending and adapting them for the AI age. This means a shift in mindset, putting identity and authorization at the core of your AI architecture, not as an afterthought. Let's break down a practical approach you can take to tackle these challenges and draw our sketches to build a first picture of a secure application.&lt;/p&gt;

&lt;h3&gt;
  
  
  Who Is Who?: Sketched Identity Management for All AI Players
&lt;/h3&gt;

&lt;p&gt;First, consider a unified identity solution that can handle humans, machines, and AI agents. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fidisx92isjypeio2bmf0.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fidisx92isjypeio2bmf0.jpg" alt="The provided sketchnote image illustrates the IAM flow with a human, a robot (machine identity), and an AI agent, connected to " width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This often means leveraging an Identity and Access Management (IAM) provider that supports various authentication methods (SSO, OAuth 2.0, mTLS) and fine-grained authorization. For the sake of completeness, this is the default way we handle non-AI identities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For Human Users: Implement strong authentication (MFA!) and Role-Based Access Control (RBAC) to ensure users only access the AI tools and data they need.&lt;/li&gt;
&lt;li&gt;For Machine-to-Machine Communication: Use client credentials, service accounts, or workload identities with the principle of least privilege. Machines should only have access to the specific resources required for their tasks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where it gets interesting for AI agents. Treat AI agents like any other service and assign them unique machine identities. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Avoid giving your AI-powered application full power by default&lt;/strong&gt;. Instead of providing an AI agent direct database access, make it go through a secure API that enforces its permissions. Here, a small but honorable nod to MCP is in order, which I’d cover in another article - or in &lt;a href="https://auth0.com/blog/mcp-and-auth0-an-agentic-match-made-in-heaven/" rel="noopener noreferrer"&gt;this blog post&lt;/a&gt;, if you’re already interested. 🔥

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Let the application work on behalf of the user&lt;/strong&gt;. When accessing sensitive data or performing actions, the application needs to act on behalf of the user, inheriting the user's permissions or, better yet, obtaining a delegation of those permissions, as is done with OAuth, for example. Implement an authorization layer specifically for your agents. &lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;You can think of it like this: The AI agent asks for something, and your system checks if that agent is allowed to do that action for that specific user. To extend a little on that, it’s still important to &lt;a href="https://auth0.com/blog/secure-human-in-the-loop-interactions-for-ai-agents/" rel="noopener noreferrer"&gt;keep the human in the loop&lt;/a&gt; as well, at least for high-risk operations or highly sensitive data. However, this is a topic for its own blog post, so I won’t go into details just now.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Fortified Flow: Sketching Secure Data &amp;amp; Model Pipelines
&lt;/h3&gt;

&lt;p&gt;Your data is the lifeline of your AI. Securing it end-to-end is non-negotiable: It shows up in rank 2 of the &lt;a href="https://owasp.org/www-project-top-10-for-large-language-model-applications/" rel="noopener noreferrer"&gt;OWASP LLM top 10&lt;/a&gt; and indirectly in rank 1, resulting from prompt injection, too. So, let’s sketch out the strategy for securing your data pipeline:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Secure Data Ingestion and Storage&lt;/strong&gt;: Ensure all data used for training and inference is encrypted at rest and in transit. Implement strict access controls on your data lakes and databases. 
Make sure you are using only the data you actually need. If you specialize your application using fine-tuning or Retrieval Augmented Generation (RAG), be sure to provide only the minimum information you really need. If personal information is not needed, anonymize or delete it. This is a crucial step to prevent Sensitive Information Disclosure and reduce the attack surface.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Validation and Sanitization&lt;/strong&gt;: Please always validate data rigorously before it is used for training. Look for anomalies, suspicious patterns, or potential signs of poisoning.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Training&lt;/strong&gt;: Training is crucial and needs to be highlighted, see data poisoning. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model Versioning and Auditing&lt;/strong&gt;: Track every version of your model. Who trained it? What data was used? This provides an audit trail if a vulnerability is discovered later.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Secure Deployment&lt;/strong&gt;: Deploy your AI models in isolated environments. Use containerization and orchestration platforms that provide built-in security features. Apply the principle of least privilege to your models' runtime environments.
In my sketch notes, I depicted the protection of the data pipeline as seen below:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy1h5ps07agbpfhfvjso8.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy1h5ps07agbpfhfvjso8.jpg" alt="A sketchnote depicting " width="800" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Blocking the Bad: Sketched Defenses Against AI Attacks
&lt;/h3&gt;

&lt;p&gt;This is where you directly combat prompt injection, data poisoning, and model evasion.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Input Sanitization and Validation&lt;/strong&gt;: While not a silver bullet, always validate and sanitize user inputs before they reach your LLMs or other AI models. Use allow-lists where possible. This is your first line of defense against prompt injection, which can lead to credential access or sensitive information disclosure. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitoring and Anomaly Detection&lt;/strong&gt; inside your AI model: Monitor your AI systems closely. How do you think about monitoring for unusual behavior? If a model suddenly starts making wildly different predictions or consuming excessive resources, it could indicate an attack.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instruction Tuning and Guardrails&lt;/strong&gt;: For LLMs, reinforce desired behaviors through instruction tuning. Implement "guardrails", basically external mechanisms (could be another LLM, a rule-based system, or human review) that validate the AI's output before it reaches the end-user or triggers an action. This is like a bouncer for your AI's responses.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Output Validation&lt;/strong&gt;: Always validate your AI's output. If an AI agent generates SQL queries, validate those queries before execution. If it produces code, scan that code for vulnerabilities. This helps prevent the AI from causing unintended consequences due to insecure outputs or even insecure plugin design.
Imagine those steps as protective layers around the AI, building on one another. In a sketch, these direct defences would look like this:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4urq7v0xuv8japt5ciov.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4urq7v0xuv8japt5ciov.jpg" alt="A sketchnote flow diagram showing " width="800" height="259"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One addition to note, which is important but didn’t fit the sketch: Please avoid using API keys to call external services. When an application uses an API key to access external functionality, such as an API, it exposes itself to potential security risks. This way, unauthorized users may send specific prompts and perform operations or access data they are not authorized to do. You can counter that: For example, you can use OAuth access tokens to restrict the application's permissions. This can reduce those risks significantly, as tokens can be scoped, short-lived, and tied to user context.&lt;/p&gt;

&lt;h2&gt;
  
  
  The big picture: Key Takeaways for AI Security
&lt;/h2&gt;

&lt;p&gt;Developing with AI is exciting! 🔥 However, we cannot ignore the fact that AI introduces some challenges as well, especially for identity and security in general. By proactively managing identities for humans, machines, and AI agents, and by understanding and mitigating threats like prompt injection, data poisoning, sensitive information disclosure, and insecure plugin designs, you can build AI applications that are not only powerful but also incredibly secure. Let’s take a look at our result of the drawing, these are the full sketch notes:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F24jarbl5t4qby9twetsy.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F24jarbl5t4qby9twetsy.jpg" alt=" " width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Please keep it as a cheatsheet. And never forget: It is a journey, not a destination, so stay curious, keep learning, and make your AI bulletproof! As you probably know, I provided you with an overview in this article. While learning and crafting sketchnotes to document, I went into much more detail on any of these points. Are you interested in those sketch notes, too? Let me know, and I might turn this into a blog post series so we can sketch this journey together! ❤️&lt;/p&gt;

&lt;h2&gt;
  
  
  Your Sketchnote Kit: Essential Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://a0.to/GenAI" rel="noopener noreferrer"&gt;Auth for GenAI by Auth0&lt;/a&gt; ❤️&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://a0.to/auth0-ai-samples" rel="noopener noreferrer"&gt;Samples, samples, samples on AI IRL&lt;/a&gt; 🔥&lt;/li&gt;
&lt;li&gt;&lt;a href="https://owasp.org/www-project-top-10-for-large-language-model-applications/" rel="noopener noreferrer"&gt;OWASP Top 10 for Large Language Model Applications&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;OWASP Top 10 for Large Language Model Applications](&lt;a href="https://owasp.org/www-project-top-10-for-large-language-model-applications/" rel="noopener noreferrer"&gt;https://owasp.org/www-project-top-10-for-large-language-model-applications/&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nist.gov/artificial-intelligence/ai-risk-management-framework" rel="noopener noreferrer"&gt;NIST AI Risk Management Framework&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://auth0.com/blog/machine-to-machine-authentication-using-jwt-and-oauth-2/" rel="noopener noreferrer"&gt;Auth0 Blog: Machine-to-Machine Authentication&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Beyond the Lines: More to Explore
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Auth0 Blog: &lt;a href="https://auth0.com/blog/identity-challenges-for-ai-powered-apps/" rel="noopener noreferrer"&gt;Identity Challenges for AI-Powered Apps&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.promptingguide.ai/" rel="noopener noreferrer"&gt;Deep Dive into Prompt Engineering for LLMs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.secoda.co/blog/ai-data-governance" rel="noopener noreferrer"&gt;Understanding Data Governance for AI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>programming</category>
      <category>ai</category>
      <category>security</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Angular vs. React vs. Vue</title>
      <dc:creator>Ramona Schwering</dc:creator>
      <pubDate>Fri, 20 Dec 2024 16:00:00 +0000</pubDate>
      <link>https://dev.to/auth0/angular-vs-react-vs-vue-50m6</link>
      <guid>https://dev.to/auth0/angular-vs-react-vs-vue-50m6</guid>
      <description>&lt;p&gt;Making decisions can be challenging, especially in our daily lives. As software engineers, we must make a crucial decision before working, whether on a side project or a larger scale: Which framework should we choose? This challenge is particularly daunting in JavaScript, with enough options to cause decision paralysis. &lt;/p&gt;

&lt;p&gt;In this blog post, I will help you choose a framework by comparing the big three: Angular, React, and Vue. Prepare for an instructive comparison to evaluate how these frameworks measure up in creating practical, testable, secure, and high-performance web applications.&lt;/p&gt;

&lt;p&gt;Let’s start with the following table as a &lt;strong&gt;TL;DR&lt;/strong&gt; for everyone in a hurry:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Angular&lt;/th&gt;
&lt;th&gt;React&lt;/th&gt;
&lt;th&gt;Vue&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Learning Curve&lt;/td&gt;
&lt;td&gt;Steep&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;Gentle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DOM Manipulation&lt;/td&gt;
&lt;td&gt;Real DOM (=conventional)&lt;/td&gt;
&lt;td&gt;Virtual DOM&lt;/td&gt;
&lt;td&gt;Virtual DOM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best for...&lt;/td&gt;
&lt;td&gt;Large, complex enterprise apps&lt;/td&gt;
&lt;td&gt;Flexible use, any size&lt;/td&gt;
&lt;td&gt;Small to large apps, rapid prototyping&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;State Management&lt;/td&gt;
&lt;td&gt;Services, NgRx&lt;/td&gt;
&lt;td&gt;Redux, MobX, Context API&lt;/td&gt;
&lt;td&gt;Vuex, Pinia&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Built-in Security&lt;/td&gt;
&lt;td&gt;Strong (XSS, CSRF, CSP)&lt;/td&gt;
&lt;td&gt;Moderate (XSS)&lt;/td&gt;
&lt;td&gt;Moderate (XSS)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Performance Optimization&lt;/td&gt;
&lt;td&gt;AOT compilation, lazy loading&lt;/td&gt;
&lt;td&gt;Virtual DOM, memorization&lt;/td&gt;
&lt;td&gt;virtual DOM, Efficient reactivity system&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Own Testing Tools&lt;/td&gt;
&lt;td&gt;TestBed&lt;/td&gt;
&lt;td&gt;React Testing Library&lt;/td&gt;
&lt;td&gt;Vue Test Utils&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auth0 by Okta SDK&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MIT license&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ecosystem Size&lt;/td&gt;
&lt;td&gt;Large&lt;/td&gt;
&lt;td&gt;Very Large&lt;/td&gt;
&lt;td&gt;Growing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Update Frequency&lt;/td&gt;
&lt;td&gt;Predictable (6-month cycle)&lt;/td&gt;
&lt;td&gt;Frequent&lt;/td&gt;
&lt;td&gt;Frequent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Used by&lt;/td&gt;
&lt;td&gt;Google, Wix&lt;/td&gt;
&lt;td&gt;Facebook, Uber&lt;/td&gt;
&lt;td&gt;Alibaba, GitLab&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Once Upon a Time in Framework Land…
&lt;/h2&gt;

&lt;p&gt;Are you still with me? Great! Let’s dive into the details with a brief history lesson about Angular, React, and Vue. &lt;/p&gt;

&lt;p&gt;In 2010, AngularJS started gaining attention for its ability to create dynamic web applications. In 2016, there was a significant shift with the release of Angular 2, leading developers to drop the original name “AngularJS.” Angular 2 and higher are now simply known as Angular. &lt;/p&gt;

&lt;p&gt;React was first released in 2013 and stood out due to its component-based architecture and virtual DOM. Vue entered the scene in 2014 and gained momentum with the release of Version 1 in October 2015. It offers a progressive approach to web development. Evan You created Vue as a leaner alternative to Angular.&lt;/p&gt;

&lt;p&gt;Let’s move on from history and focus on how these frameworks work in real-world situations today. Whether you’re building a small startup MVP or a complex enterprise application, by the end of this article, you’ll clearly understand which framework is best for your needs. As an Auth0 developer advocate and former test automation engineer, I can’t help but bring insights on security and quality considerations with me.&lt;/p&gt;

&lt;h2&gt;
  
  
  State of JS 2024: A Key Insight into Popularity Trends
&lt;/h2&gt;

&lt;p&gt;Before we get into details, let’s first look at the popularity of these frameworks. My favorite indicator in this regard is the “&lt;a href="https://2024.stateofjs.com/en-US/" rel="noopener noreferrer"&gt;State of JavaScript survey&lt;/a&gt;” survey. The collective &lt;a href="https://www.devographics.com" rel="noopener noreferrer"&gt;Devographics&lt;/a&gt; conducts it annually, with the latest iteration at the end of 2024—published just a few days ago, when this blog post was released. 🔥&lt;/p&gt;

&lt;p&gt;There is &lt;a href="https://2023.stateofjs.com/en-US/libraries/front-end-frameworks/#front_end_frameworks_ratios" rel="noopener noreferrer"&gt;one particular survey question&lt;/a&gt; I’d like to take a look at:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Front-end Frameworks Ratios Over Time&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fghbve40s2zpn75apkm7k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fghbve40s2zpn75apkm7k.png" alt="Usage of Frontend Frameworks" width="800" height="520"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgidl9asrwpgdhfif245k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgidl9asrwpgdhfif245k.png" alt="Retention of Frontend Frameworks" width="800" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I want to focus on the aspects of “usage,” “retention” and “positivity” because, in my opinion, they’re the best indicators of popularity. Here are the key points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React: Still the leader with an 82% usage rate, and still some high stats with 75% retention rate, and 69% positivity score. It’s like the popular kid everyone wants to hang out with.&lt;/li&gt;
&lt;li&gt;Vue.js: The emerging star, claiming second place with a 51% usage rate, surpassing Angular for the first time. People’s satisfaction is catching up immensely in 2024, too: With 75% in retention (rank #3 overall) and 70% in positivity (rank #2 overall), it's overtaking React for the first time.&lt;/li&gt;
&lt;li&gt;Angular: Now in third place with a 50% usage rate, 54% retention rate, and 37% positivity score. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;a href="https://survey.stackoverflow.co/2024/" rel="noopener noreferrer"&gt;StackOverflow Developer Survey&lt;/a&gt; polled approximately 65,000 developers worldwide, revealing that 62% have used JavaScript in the past year. When asked about the frameworks they worked with or plan to use within the next year, 39.5% mentioned React, 15.4% mentioned Vue, and 17.1% mentioned Angular. &lt;/p&gt;

&lt;p&gt;These numbers indicate the increasing popularity of these frameworks. React remains the top choice among developers, while Vue is rapidly gaining ground. Angular’s popularity is declining, and while it is still in good shape, it needs to assert itself against the competition.&lt;/p&gt;

&lt;p&gt;It’s important to note that popularity alone doesn’t determine a framework’s value. Although popularity serves as a guide, other factors are more crucial. Let’s delve into a comprehensive overview of these frameworks and their respective advantages and disadvantages.&lt;/p&gt;

&lt;h2&gt;
  
  
  Angular: A Large-scale Framework
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm4owfdrxo8b1gw7k4314.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm4owfdrxo8b1gw7k4314.png" alt="Angular Logo" width="400" height="98"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://angular.dev/" rel="noopener noreferrer"&gt;Angular&lt;/a&gt; is a comprehensive TypeScript framework with built-in routing, state management, and form-handling support. It is developed using TypeScript, which provides static typing and advanced tooling. Angular features &lt;a href="https://angular.dev/guide/templates/two-way-binding" rel="noopener noreferrer"&gt;two-way data binding&lt;/a&gt; and a robust &lt;a href="https://angular.dev/guide/di" rel="noopener noreferrer"&gt;dependency injection system&lt;/a&gt;. &lt;a href="https://angular.dev/tools/cli" rel="noopener noreferrer"&gt;Angular’s Command Line Interface (CLI)&lt;/a&gt; also simplifies development by providing project scaffolding and component generation features.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pros&lt;/th&gt;
&lt;th&gt;Limitations&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Complete solution out of the box, so no more &lt;code&gt;npm install all-the-things&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;There is a steep learning curve, so prepare for late nights and caffeine-fueled (coding) sessions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;It is fairly "trustworthy" (so to say) because Google backs it&lt;/td&gt;
&lt;td&gt;Project size: It can be overkill for more minor projects&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Extensive documentation&lt;/td&gt;
&lt;td&gt;Performance needs careful optimization in complex apps, as it can be impacted by their complexity and the size of applications&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  React: The Flexible Library
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftxnw6z1j2iyhe3ri84e2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftxnw6z1j2iyhe3ri84e2.png" alt="React Logo" width="307" height="283"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://react.dev/" rel="noopener noreferrer"&gt;React&lt;/a&gt; is a popular developer choice (see the State of JS 2023 &lt;a href="https://stateofjs.com/en-US" rel="noopener noreferrer"&gt;survey&lt;/a&gt;) due to its flexibility, efficiency, and robust ecosystem. It introduces a component-based architecture for creating UIs and a &lt;a href="https://legacy.reactjs.org/docs/faq-internals.html" rel="noopener noreferrer"&gt;Virtual DOM&lt;/a&gt; for optimized rendering.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://legacy.reactjs.org/docs/introducing-jsx.html" rel="noopener noreferrer"&gt;JSX&lt;/a&gt; allows for HTML-like code in JavaScript, while &lt;a href="https://react.dev/reference/react/hooks" rel="noopener noreferrer"&gt;Hooks&lt;/a&gt; offers a way to manage state and side effects in functional components. These features make React code concise and easy to understand, solidifying its position as a top choice among developers.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pros&lt;/th&gt;
&lt;th&gt;Limitations&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Highly flexible and easy to integrate, React usually plays well with others&lt;/td&gt;
&lt;td&gt;Frequent updates can lead to breaking changes. You need to be prepared to keep up with that pace and to relearn new concepts introduced alongside it.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The reusable components, in particular, decrease complexity and help maintain the codebase&lt;/td&gt;
&lt;td&gt;JSX must be clarified for beginners. Learning React alone is relatively easy, but being introduced to JSX might be on a different level.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Excellent performance with virtual DOM: React doesn’t rely on the conventional DOM structure, which increases the performance and speed of web applications&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Massive ecosystem and community support&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Vue: The Progressive Framework
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff4gtwtqitqxhxvw86egq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff4gtwtqitqxhxvw86egq.png" alt="Vue Logo" width="170" height="148"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://vuejs.org/" rel="noopener noreferrer"&gt;Vue.js&lt;/a&gt;, also known as Vue, is widely recognized for its approachable and versatile nature, making it a popular choice for web development. It is considered a progressive framework, allowing for flexible adoption. &lt;/p&gt;

&lt;p&gt;Vue is praised for its reactivity system, which enables smooth, dynamic interfaces. It also offers single-file components for organized code and utilizes a virtual DOM for optimized performance. Additionally, its powerful CLI facilitates easy project setup. &lt;/p&gt;

&lt;p&gt;Finally, Vue is driven entirely by the open-source community, which sets it apart from its contenders and is evident in its vast numbers of watchers, stars, and forks on GitHub.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pros&lt;/th&gt;
&lt;th&gt;Limitations&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Its gentle learning curve makes it a perfect choice for beginners and seasoned developers. It doesn’t require prior skills. For example, you can use TypeScript, but it’s not mandatory. The documentation is excellent&lt;/td&gt;
&lt;td&gt;Their ecosystem: Despite growing fast, it’s still smaller than React and Angular.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;It offers excellent out-of-the-box performance and provides advantages regardless of project size. Google appears to favor lightweight projects&lt;/td&gt;
&lt;td&gt;It may be less suited for large-scale apps, but it’s catching up fast!&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vue is backed by an open-source community, not a corporation, which makes it independent and trustworthy&lt;/td&gt;
&lt;td&gt;The statement “Any corporation does not back Vue” implies that its maintenance is less reliable than corporate funding. However, you can support their contributors through GitHub sponsoring.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Security: The Non-Negotiable Factor
&lt;/h2&gt;

&lt;p&gt;When it comes to security, no framework is entirely secure by default. As a developer, you are the final line of defense. While frameworks can assist in making your applications secure, it is essential to remain vigilant, adhere to best practices such as OWASP’s recommendations, keep your dependencies current, and stay updated on CVEs and security news. With that in mind, let’s examine how each framework supports you in this effort.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Angular&lt;/strong&gt; takes the lead with its robust built-in protections. It automatically sanitizes and escapes untrusted values, guarding against XSS attacks right out of the gate. Its HttpClient comes with CSRF protection and plays nice with the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP" rel="noopener noreferrer"&gt;Content Security Policy (CSP)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React&lt;/strong&gt; takes a more hands-off approach. It escapes values by default before rendering, which helps ward off XSS attacks, and its virtual DOM can act as an additional barrier. However, React leaves CSRF protection up to you and your backend setup.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vue&lt;/strong&gt; sits somewhere in the middle. Like React, it automatically escapes content to prevent XSS, and its compiler will warn you about potentially unsafe practices. But again, for CSRF protection, you’re on your own.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Remember, security isn’t a feature — it’s a fundamental requirement. Regardless of your chosen framework, always keep it at the forefront of your development process.&lt;/p&gt;

&lt;h3&gt;
  
  
  Let Auth0 Support You with Your App Security
&lt;/h3&gt;

&lt;p&gt;I know you saw it coming. In this context, being on the Auth0 blog, I cannot resist doing the obligatory shoutout. Regardless of your chosen framework, Auth0 provides SDKs for all three frameworks, so you can significantly strengthen your security measures with Auth0 if you need a login, authentication, or authorization workflow.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://a0.to/auth0-angular" rel="noopener noreferrer"&gt;Angular SDK&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://a0.to/auth0-react" rel="noopener noreferrer"&gt;React SDK&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://a0.to/auth0-vue" rel="noopener noreferrer"&gt;Vue SDK&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Integrating Auth0 can significantly enhance your app’s security. Auth0 offers robust authentication and authorization features, simplifying the implementation of complex security elements such as &lt;a href="https://a0.to/multi-factor-authentication" rel="noopener noreferrer"&gt;multi-factor authentication (MFA)&lt;/a&gt;, &lt;a href="https://a0.to/single-sign-on" rel="noopener noreferrer"&gt;single sign-on (SSO)&lt;/a&gt;, and even &lt;a href="https://a0.to/database-connections-passkeys" rel="noopener noreferrer"&gt;Passkeys&lt;/a&gt; that may be challenging to build from scratch. &lt;/p&gt;

&lt;p&gt;Using Auth0 alongside your chosen framework is like having a dedicated team of security professionals protecting your app. Implementing our SDKs enables you to focus on creating excellent features while Auth0 keeps malicious users at bay. In short, it’s a win-win situation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing: The Developer’s Safety Net
&lt;/h2&gt;

&lt;p&gt;As a former test automation engineer, I want to bring the testing perspective into the discussion. A well-crafted testing strategy is crucial. In addition, testability and level of support are significant factors in choosing a framework. Let’s examine what testing utilities each framework offers.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Angular&lt;/strong&gt; provides &lt;a href="https://v17.angular.io/api/core/testing/TestBed" rel="noopener noreferrer"&gt;TestBed&lt;/a&gt;, which allows for the creation of isolated testing modules and simplifies mocking dependencies and testing components individually.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React&lt;/strong&gt; offers a flexible testing approach with the &lt;a href="https://testing-library.com/docs/react-testing-library/intro/" rel="noopener noreferrer"&gt;React Testing Library&lt;/a&gt;, encouraging developers to test components as users interact.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vue&lt;/strong&gt; has &lt;a href="https://test-utils.vuejs.org/" rel="noopener noreferrer"&gt;Vue Test Utils&lt;/a&gt;, which balances Angular’s structured approach and React’s flexibility, enabling easy component mounting and interaction simulation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Apart from that, there is a lot of common ground regarding testing. All three contenders support the testing tools that many of you use and love, whether it is &lt;a href="https://jestjs.io" rel="noopener noreferrer"&gt;Jest&lt;/a&gt;, &lt;a href="https://jasmine.github.io" rel="noopener noreferrer"&gt;Jasmine&lt;/a&gt;, and &lt;a href="https://mochajs.org" rel="noopener noreferrer"&gt;Mocha&lt;/a&gt; for unit testing or &lt;a href="https://www.cypress.io" rel="noopener noreferrer"&gt;Cypress&lt;/a&gt;, &lt;a href="https://playwright.dev" rel="noopener noreferrer"&gt;Playwright&lt;/a&gt;, and — of course — &lt;a href="https://www.selenium.dev" rel="noopener noreferrer"&gt;Selenium&lt;/a&gt; for end-to-end testing, among others. A shallow learning curve will be ahead if you want to use these testing tools. &lt;/p&gt;

&lt;p&gt;Best practices are the same for all frameworks. A well-rounded testing strategy includes unit, integration, and end-to-end tests. It’s essential to rely solely on unit tests. To learn more, you can read another article I wrote on &lt;a href="https://web.dev/learn/testing/get-started/test-types" rel="noopener noreferrer"&gt;choosing testing types&lt;/a&gt;. Our friends at Browserstack have also written a great &lt;a href="https://www.browserstack.com/guide/angular-vs-react-vs-vue" rel="noopener noreferrer"&gt;article&lt;/a&gt; on how each framework performs with a strong focus on testing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summing Up the Similarities and Differences
&lt;/h2&gt;

&lt;p&gt;You’ve now learned what each framework represents and which key feature it brings. Angular, React, and Vue are all designed to build dynamic, modern web applications, particularly single-page applications. They each use components to create reusable and modular user interface elements. &lt;br&gt;
All three frameworks perform strongly through various optimization techniques, such as Angular’s ahead-of-time (AOT) compilation and React’s and Vue’s virtual DOM. Additionally, they all have large, active communities that offer extensive documentation, third-party libraries, and a wealth of online resources. Lastly, all three frameworks/libraries are open-source and licensed under the MIT license, allowing for freedom of use in both commercial and personal projects.&lt;/p&gt;

&lt;h3&gt;
  
  
  A Close-Up of the Differences
&lt;/h3&gt;

&lt;p&gt;Regarding differences, you already found my short “TL;DR table” at the beginning of this article. Let’s take that table but fill it with life. I’ll add all the information from before, plus some I might have left out. For example, they all bring state management — only in different flavors. Let’s go:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Angular&lt;/th&gt;
&lt;th&gt;React&lt;/th&gt;
&lt;th&gt;Vue&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Learning Curve&lt;/td&gt;
&lt;td&gt;Due to its nature and focus on TypeScript, Angular has a steep learning curve. It’s most suitable for developers with experience in large-scale applications&lt;/td&gt;
&lt;td&gt;There is a moderate learning curve. JSX and integrating additional libraries can present challenges, but once learned, React’s component-based approach is straightforward&lt;/td&gt;
&lt;td&gt;Vue is easy for beginners with its gentle learning curve and precise documentation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DOM Manipulation&lt;/td&gt;
&lt;td&gt;Utilizes the conventional DOM, which updates the entire DOM tree when changes occur&lt;/td&gt;
&lt;td&gt;It uses the &lt;a href="https://legacy.reactjs.org/docs/faq-internals.html" rel="noopener noreferrer"&gt;Virtual DOM&lt;/a&gt;, which optimizes performance by only updating the changed parts of the DOM&lt;/td&gt;
&lt;td&gt;It also uses the &lt;a href="https://vuejs.org/guide/extras/rendering-mechanism#virtual-dom" rel="noopener noreferrer"&gt;Virtual DOM&lt;/a&gt;, offering performance benefits similar to React&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best for&lt;/td&gt;
&lt;td&gt;It is ideal for large, complex enterprise applications where a full-featured framework is necessary&lt;/td&gt;
&lt;td&gt;React is suitable for projects of any size that require flexibility and high performance. Its adaptability makes it a good fit for a wide range of applications&lt;/td&gt;
&lt;td&gt;Due to its simplicity and easy integration, it is best suited for small to large applications and rapid prototyping&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Performance Optimization&lt;/td&gt;
&lt;td&gt;Performance is good but can be affected by its complexity and size&lt;/td&gt;
&lt;td&gt;Offers strong performance through its virtual DOM and efficient rendering process&lt;/td&gt;
&lt;td&gt;It is known for its efficient reactivity system and generally good performance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;State Management&lt;/td&gt;
&lt;td&gt;It uses services and &lt;a href="https://ngrx.io/" rel="noopener noreferrer"&gt;NgRx&lt;/a&gt; for state management to provide a robust, reactive solution&lt;/td&gt;
&lt;td&gt;External libraries such as &lt;a href="https://redux.js.org/" rel="noopener noreferrer"&gt;Redux&lt;/a&gt;, &lt;a href="https://mobx.js.org/README.html" rel="noopener noreferrer"&gt;MobX&lt;/a&gt;, and the Context API are commonly used for state management, providing flexibility in selecting the appropriate tool&lt;/td&gt;
&lt;td&gt;ses &lt;a href="https://vuex.vuejs.org/" rel="noopener noreferrer"&gt;Vuex&lt;/a&gt; or &lt;a href="https://pinia.vuejs.org/" rel="noopener noreferrer"&gt;Pinia&lt;/a&gt; for state management, providing a structured and integrated approach&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Built-in Security&lt;/td&gt;
&lt;td&gt;It offers robust security features, including protection against XSS (Cross-Site Scripting), CSRF (Cross-Site Request Forgery), and CSP (Content Security Policy)&lt;/td&gt;
&lt;td&gt;It provides moderate security with built-in protection against XSS but requires additional measures for complete security&lt;/td&gt;
&lt;td&gt;Like React, it provides moderate protection against XSS and requires extra precautions for&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auth0 SDK&lt;/td&gt;
&lt;td&gt;✅ &lt;a href="https://a0.to/auth0-angular" rel="noopener noreferrer"&gt;Angular SDK&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;✅ &lt;a href="https://a0.to/auth0-react" rel="noopener noreferrer"&gt;React SDK&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;✅ &lt;a href="https://a0.to/auth0-vue" rel="noopener noreferrer"&gt;Vue SDK&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MIT Licensed&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Specific Testing Tools and Support&lt;/td&gt;
&lt;td&gt;It comes with TestBed, a built-in testing framework&lt;/td&gt;
&lt;td&gt;Often uses the React Testing Library or Jest, focusing on testing components in isolation&lt;/td&gt;
&lt;td&gt;Provides Vue Test Utils for testing Vue components, offering a straightforward way to handle unit tests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ecosystem Size&lt;/td&gt;
&lt;td&gt;It boasts a comprehensive ecosystem, including a wide range of official tools and libraries to meet enterprise requirements&lt;/td&gt;
&lt;td&gt;Its vast ecosystem includes numerous third-party libraries, which provides high flexibility but sometimes results in a fragmented toolset&lt;/td&gt;
&lt;td&gt;Features a growing ecosystem with a solid set of official tools and an expanding range of community-contributed libraries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Update Frequency&lt;/td&gt;
&lt;td&gt;It follows a predictable 6-month release cycle, guaranteeing regular updates and long-term stability&lt;/td&gt;
&lt;td&gt;Frequent updates: Many updates underscore the ongoing development and constant enhancements&lt;/td&gt;
&lt;td&gt;Like React, Frequent updates of Vue reflect their active development and continuous improvement&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Conclusion: Choosing Your Companion
&lt;/h2&gt;

&lt;p&gt;This all sounds like a lot of information. So, what should you do about it? If you’re like me, you might already feel the decision paralysis. I feel you; let’s try to bring this to a close and find out which framework is winning the comparison. Without further ado, this is my take on when to choose which framework:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you’re working on a large-scale application, value consistency, and catch type-related bugs early, go with &lt;strong&gt;Angular&lt;/strong&gt; because it supports TypeScript and its comprehensive framework.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React&lt;/strong&gt; is a good choice when you need flexibility and your team is comfortable setting up its architecture and testing practices.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vue&lt;/strong&gt; is ideal if you prefer a gentle learning curve and need a framework that can grow with your project's complexity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lastly, please note that the best framework allows you and your team to write clean, testable, and secure code. Regardless of your choice, you will have a fantastic community to support you. ❤️&lt;/p&gt;

</description>
      <category>angular</category>
      <category>react</category>
      <category>vue</category>
      <category>auth0</category>
    </item>
  </channel>
</rss>
