<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Privacy on Smashing Magazine — For Web Designers And Developers</title><link>https://www.smashingmagazine.com/category/privacy/index.xml</link><description>Recent content in Privacy on Smashing Magazine — For Web Designers And Developers</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Mon, 09 Feb 2026 03:03:08 +0000</lastBuildDate><item><author>Eric Burel</author><title>How OWASP Helps You Secure Your Full-Stack Web Applications</title><link>https://www.smashingmagazine.com/2025/02/how-owasp-helps-secure-full-stack-web-applications/</link><pubDate>Tue, 18 Feb 2025 08:00:00 +0000</pubDate><guid>https://www.smashingmagazine.com/2025/02/how-owasp-helps-secure-full-stack-web-applications/</guid><description>The OWASP vulnerabilities list is the perfect starting point for web developers looking to strengthen their security expertise. Let’s discover how these vulnerabilities materialize in full-stack web applications and how to prevent them.</description><content:encoded><![CDATA[
          <html>
            <head>
              <meta charset="utf-8">
              <link rel="canonical" href="https://www.smashingmagazine.com/2025/02/how-owasp-helps-secure-full-stack-web-applications/" />
              <title>How OWASP Helps You Secure Your Full-Stack Web Applications</title>
            </head>
            <body>
              <article>
                <header>
                  <h1>How OWASP Helps You Secure Your Full-Stack Web Applications</h1>
                  
                    
                    <address>Eric Burel</address>
                  
                  <time datetime="2025-02-18T08:00:00&#43;00:00" class="op-published">2025-02-18T08:00:00+00:00</time>
                  <time datetime="2025-02-18T08:00:00&#43;00:00" class="op-modified">2026-02-09T03:03:08+00:00</time>
                </header>
                
                

<p>Security can be an intimidating topic for web developers. The vocabulary is rich and full of acronyms. Trends evolve quickly as hackers and analysts play a perpetual cat-and-mouse game. Vulnerabilities stem from little details we cannot afford to spend too much time on during our day-to-day operations.</p>

<p>JavaScript developers already have a lot to take with the emergence of a new wave of innovative architectures, such as React Server Components, Next.js App Router, or Astro islands.</p>

<p>So, let’s have a focused approach. What we need is to be able to <strong>detect</strong> and <strong>palliate the most common security issues</strong>. A top ten of the most common vulnerabilities would be ideal.</p>

<h2 id="meet-the-owasp-top-10">Meet The OWASP Top 10</h2>

<p>Guess what: there happens to be such a top ten of the most common vulnerabilities, curated by experts in the field!</p>

<p>It is provided by the <strong>OWASP Foundation</strong>, and it’s an extremely valuable resource for getting started with security.</p>

<p>OWASP stands for “Open Worldwide Application Security Project.” It’s a nonprofit foundation whose goal is to make software more secure globally. It supports many open-source projects and produces high-quality education resources, including the OWASP top 10 vulnerabilities list.</p>

<p>We will dive through each item of the OWASP top 10 to understand <em>how</em> to recognize these vulnerabilities in a full-stack application.</p>

<p><strong>Note</strong>: <em>I will use Next.js as an example, but this knowledge applies to any similar full-stack architecture, even outside of the JavaScript ecosystem.</em></p>

<p>Let’s start our countdown towards a safer web!</p>

<div data-audience="non-subscriber" data-remove="true" class="feature-panel-container">

<aside class="feature-panel" style="">
<div class="feature-panel-left-col">

<div class="feature-panel-description"><p>Meet <strong><a data-instant href="/printed-books/touch-design-for-mobile-interfaces/">Touch Design for Mobile Interfaces</a></strong>, Steven Hoober’s brand-new guide on <strong>designing for mobile</strong> with proven, universal, human-centric guidelines. <strong>400 pages</strong>, jam-packed with in-depth user research and <strong>best practices</strong>.</p>
<a data-instant href="https://www.smashingmagazine.com/printed-books/touch-design-for-mobile-interfaces/" class="btn btn--green btn--large" style="">Jump to table of contents&nbsp;↬</a></div>
</div>
<div class="feature-panel-right-col"><a data-instant href="https://www.smashingmagazine.com/printed-books/touch-design-for-mobile-interfaces/" class="feature-panel-image-link">
<div class="feature-panel-image"><picture><source type="image/avif" srcSet="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/14bcab88-b622-47f6-a51d-76b0aa003597/touch-design-book-shop-opt.avif" />
<img
    loading="lazy"
    decoding="async"
    class="feature-panel-image-img"
    src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/b14658fc-bb2d-41a6-8d1a-70eaaf1b8ec8/touch-design-book-shop-opt.png"
    alt="Feature Panel"
    width="480"
    height="697"
/>
</picture>
</div>
</a>
</div>
</aside>
</div>

<h2 id="number-10-server-side-request-forgery-ssrf">Number 10: Server-Side Request Forgery (SSRF)</h2>

<p>You may have heard about Server-Side Rendering, aka SSR. Well, you can consider SSRF to be its evil twin acronym.</p>

<p>Server-Side Request Forgery can be summed up as <strong>letting an attacker fire requests using your backend server</strong>. Besides hosting costs that may rise up, the main problem is that the attacker will benefit from your server’s level of accreditation. In a complex architecture, this means being able to target your internal private services using your own corrupted server.</p>














<figure class="
  
  
  ">
  
    <a href="https://files.smashing.media/articles/how-owasp-helps-secure-full-stack-web-applications/ssr-good-ssrf-bad.jpg">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="501"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/how-owasp-helps-secure-full-stack-web-applications/ssr-good-ssrf-bad.jpg 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/how-owasp-helps-secure-full-stack-web-applications/ssr-good-ssrf-bad.jpg 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/how-owasp-helps-secure-full-stack-web-applications/ssr-good-ssrf-bad.jpg 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/how-owasp-helps-secure-full-stack-web-applications/ssr-good-ssrf-bad.jpg 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/how-owasp-helps-secure-full-stack-web-applications/ssr-good-ssrf-bad.jpg 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/how-owasp-helps-secure-full-stack-web-applications/ssr-good-ssrf-bad.jpg"
			
			sizes="100vw"
			alt="SSR is good vs SSRF is bad"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      SSR is good, but SSRF is bad! (<a href='https://files.smashing.media/articles/how-owasp-helps-secure-full-stack-web-applications/ssr-good-ssrf-bad.jpg'>Large preview</a>)
    </figcaption>
  
</figure>

<p>Here is an example. Our app lets a user input a URL and summarizes the content of the target page server-side using an AI SDK. A mischievous user passes <code>localhost:3000</code> as the URL instead of a website they’d like to summarize. Your server will fire a request against itself or any other service running on port 3000 in your backend infrastructure. This is a severe SSRF vulnerability!</p>

<p>You’ll want to be careful when firing requests based on user inputs, especially server-side.</p>

<h2 id="number-9-security-logging-and-monitoring-failures">Number 9: Security Logging And Monitoring Failures</h2>

<p>I wish we could establish a telepathic connection with our beloved Node.js server running in the backend. Instead, the best thing we have to see what happens in the cloud is a dreadful stream of unstructured pieces of text we name “logs.”</p>

<p>Yet we will have to deal with that, not only for debugging or performance optimization but also because <strong>logs are often the only information you’ll get to discover and remediate a security issue</strong>.</p>

<p>As a starter, you might want to focus on logging the most important transactions of your application exactly like you would prioritize writing end-to-end tests. In most applications, this means login, signup, payouts, mail sending, and so on. In a bigger company, a more complete telemetry solution is a must-have, such as Open Telemetry, Sentry, or Datadog.</p>

<p>If you are using React Server Components, you may need to set up a proper logging strategy anyway since it’s not possible to debug them directly from the browser as we used to do for Client components.</p>

<h2 id="number-8-software-and-data-integrity-failures">Number 8: Software And Data Integrity Failures</h2>

<p>The OWASP top 10 vulnerabilities tend to have various levels of granularity, and this one is really a big family. I’d like to focus on <strong>supply chain attacks</strong>, as they have gained a lot of popularity over the years.</p>

<p>You may have heard about the <strong>Log4J vulnerability</strong>. It was very publicized, very critical, and very exploited by hackers. It’s a massive supply chain attack.</p>

<p>In the JavaScript ecosystem, you most probably install your dependencies using NPM. Before picking dependencies, you might want to craft yourself a small list of health indicators.</p>

<ul>
<li>Is the library maintained and tested with proper code?</li>
<li>Does it play a critical role in my application?</li>
<li>Who is the main contributor?</li>
<li>Did I spell it right when installing?</li>
</ul>

<p>For more serious business, you might want to consider setting up a <strong>Supply Chain Analysis (SCA)</strong> solution; GitHub’s Dependabot is a free one, and Snyk and Datadog are other famous actors.</p>

<h2 id="number-7-identification-and-authentication-failures">Number 7: Identification And Authentication Failures</h2>

<p>Here is a stereotypical vulnerability belonging to this category: your admin password is leaked. A hacker finds it. Boom, game over.</p>

<p>Password management procedures are beyond the scope of this article, but in the context of full-stack web development, let’s dive deep into how we can prevent brute force attacks using Next.js edge middlewares.</p>

<p><strong>Middlewares</strong> are tiny proxies written in JavaScript. They process requests in a way that is supposed to be very, very fast, faster than a normal Node.js endpoint, for example. They are a good fit for handling <strong>low-level processing</strong>, like blocking malicious IPs or redirecting users towards the correct translation of a page.</p>

<p>One interesting use case is <strong>rate limiting</strong>. You can quickly improve the security of your applications by limiting people’s ability to spam your POST endpoints, especially login and signup.</p>

<p>You may go even further by setting up a <strong>Web Applications Firewall (WAF)</strong>. A WAF lets developers implement elaborate security rules. This is not something you would set up directly in your application but rather at the host level. For instance, Vercel has released its own WAF in 2024.</p>

<div class="partners__lead-place"></div>

<h2 id="number-6-vulnerable-and-outdated-components">Number 6: Vulnerable And Outdated Components</h2>

<p>We have discussed supply chain attacks earlier. Outdated components are a variation of this vulnerability, where you actually are the person to blame. Sorry about that.</p>

<p>Security vulnerabilities are often discovered ahead of time by diligent security analysts before a mean attacker can even start thinking about exploiting them. Thanks, analysts friends! When this happens, they fill out a <strong>Common Vulnerabilities and Exposure</strong> and store that in a public database.</p>

<p>The remedy is the same as for supply chain attacks: set up an SCA solution like Dependabot that will regularly check for the use of vulnerable packages in your application.</p>














<figure class="
  
  
  ">
  
    <a href="https://files.smashing.media/articles/how-owasp-helps-secure-full-stack-web-applications/vulnerable-components.jpg">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="501"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/how-owasp-helps-secure-full-stack-web-applications/vulnerable-components.jpg 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/how-owasp-helps-secure-full-stack-web-applications/vulnerable-components.jpg 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/how-owasp-helps-secure-full-stack-web-applications/vulnerable-components.jpg 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/how-owasp-helps-secure-full-stack-web-applications/vulnerable-components.jpg 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/how-owasp-helps-secure-full-stack-web-applications/vulnerable-components.jpg 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/how-owasp-helps-secure-full-stack-web-applications/vulnerable-components.jpg"
			
			sizes="100vw"
			alt="A visualization showing that an app depends on packages and some of them can be vulnerable"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      Your app depends on many packages. Sadly, some of them are probably affected by vulnerabilities that can spread to your application. (<a href='https://files.smashing.media/articles/how-owasp-helps-secure-full-stack-web-applications/vulnerable-components.jpg'>Large preview</a>)
    </figcaption>
  
</figure>

<h2 id="halfway-break">Halfway break</h2>

<p>I just want to mention at this point how much progress we have made since the beginning of this article. To sum it up:</p>

<ul>
<li>We know how to recognize an SSRF. This is a nasty vulnerability, and it is easy to accidentally introduce while crafting a super cool feature.</li>
<li>We have identified monitoring and dependency analysis solutions as important pieces of “support” software for securing applications.</li>
<li>We have figured out a good use case for Next.js edge middlewares: rate limiting our authentication endpoints to prevent brute force attacks.</li>
</ul>

<p>It’s a good time to go grab a tea or coffee. But after that, come back with us because we are going to discover the five most common vulnerabilities affecting web applications!</p>

<h2 id="number-5-security-misconfiguration">Number 5: Security Misconfiguration</h2>

<p>There are so many configurations that we can mismanage. But let’s focus on the most insightful ones for a web developer learning about security: <strong>HTTP headers</strong>.</p>

<p>You can use HTTP response headers to pass on a lot of information to the user’s browser about what’s possible or not on your website.</p>

<p>For example, by narrowing down the “Permissions-Policy” headers, you can claim that your website will never require access to the user’s camera. This is an extremely powerful protection mechanism in case of a <strong>script injection attack (XSS)</strong>. Even if the hacker manages to run a malicious script in the victim’s browser, the latter will not allow the script to access the camera.</p>

<p>I invite you to observe the security configuration of any template or boilerplate that you use to craft your own websites. <em>Do you understand them properly?</em> <em>Can you improve them?</em> Answering these questions will inevitably lead you to vastly increase the safety of your websites!</p>

<h2 id="number-4-insecure-design">Number 4: Insecure Design</h2>

<p>I find this one funny, although a bit insulting for us developers.</p>

<blockquote class="pull-quote">
  <p>
    <a class="pull-quote__link" aria-label="Share on Twitter" href="https://twitter.com/share?text=%0aBad%20code%20is%20literally%20the%20fourth%20most%20common%20cause%20of%20vulnerabilities%20in%20web%20applications!%20You%20can%e2%80%99t%20just%20blame%20your%20infrastructure%20team%20anymore.%0a&url=https://smashingmagazine.com%2f2025%2f02%2fhow-owasp-helps-secure-full-stack-web-applications%2f">
      
Bad code is literally the fourth most common cause of vulnerabilities in web applications! You can’t just blame your infrastructure team anymore.

    </a>
  </p>
  <div class="pull-quote__quotation">
    <div class="pull-quote__bg">
      <span class="pull-quote__symbol">“</span></div>
  </div>
</blockquote>

<p>Design is actually not just about code but about <strong>the way we use our programming tools</strong> to produce software artifacts.</p>














<figure class="
  
  
  ">
  
    <a href="https://files.smashing.media/articles/how-owasp-helps-secure-full-stack-web-applications/bad-design.jpg">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="500"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/how-owasp-helps-secure-full-stack-web-applications/bad-design.jpg 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/how-owasp-helps-secure-full-stack-web-applications/bad-design.jpg 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/how-owasp-helps-secure-full-stack-web-applications/bad-design.jpg 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/how-owasp-helps-secure-full-stack-web-applications/bad-design.jpg 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/how-owasp-helps-secure-full-stack-web-applications/bad-design.jpg 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/how-owasp-helps-secure-full-stack-web-applications/bad-design.jpg"
			
			sizes="100vw"
			alt="A visualization with bad design"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      Bad design can create vulnerabilities that are very hard to detect. The cure is good design, and good design is a lot of learning. Keep reading curated learning resources, and everything will be ok! (<a href='https://files.smashing.media/articles/how-owasp-helps-secure-full-stack-web-applications/bad-design.jpg'>Large preview</a>)
    </figcaption>
  
</figure>

<p>In the context of full-stack JavaScript frameworks, I would recommend learning how to use them <strong>idiomatically</strong>, the same way you’d want to learn a foreign language. It’s not just about translating what you already know word-by-word. You need to get a grasp of how a native speaker would phrase their thoughts.</p>

<p>Learning idiomatic Next.js is really, really hard. Trust me, I teach this framework to web developers. Next is all about client and server logic hybridization, and some patterns may not even transfer to competing frameworks with a different architecture like Astro.js or Remix.</p>

<p>Hopefully, the Next.js core team has produced many free learning resources, including articles and documentation specifically focusing on security.</p>

<p>I recommend reading Sebastian Markbåge’s famous article “<a href="https://nextjs.org/blog/security-nextjs-server-components-actions">How to Think About Security in Next.js</a>” as a starting point. If you use Next.js in a professional setting, consider organizing proper training sessions before you start working on high-stakes projects.</p>

<h2 id="number-3-injection">Number 3: Injection</h2>

<p>Injections are the epitome of vulnerabilities, the quintessence of breaches, and the paragon of security issues. SQL injections are typically very famous, but JavaScript injections are also quite common. Despite being well-known vulnerabilities, injections are still in the top 3 in the OWASP ranking!</p>

<blockquote class="pull-quote">
  <p>
    <a class="pull-quote__link" aria-label="Share on Twitter" href="https://twitter.com/share?text=%0aInjections%20are%20the%20reason%20why%20forcing%20a%20React%20component%20to%20render%20HTML%20is%20done%20through%20an%20unwelcoming%20%60dangerouslySetInnerHTML%60%20function.%0a&url=https://smashingmagazine.com%2f2025%2f02%2fhow-owasp-helps-secure-full-stack-web-applications%2f">
      
Injections are the reason why forcing a React component to render HTML is done through an unwelcoming `dangerouslySetInnerHTML` function.

    </a>
  </p>
  <div class="pull-quote__quotation">
    <div class="pull-quote__bg">
      <span class="pull-quote__symbol">“</span></div>
  </div>
</blockquote>

<p>React doesn’t want you to include user input that could contain a malicious script.</p>

<p>The screenshot below is a demonstration of an injection using images. It could target a message board, for instance. The attacker misused the image posting system. They passed a URL that points towards an API GET endpoint instead of an actual image. Whenever your website’s users see this post in their browser, an authenticated request is fired against your backend, triggering a payment!</p>

<p>As a bonus, having a GET endpoint that triggers side-effects such as payment also constitutes a risk of <strong>Cross-Site Request Forgery</strong> (CSRF, which happens to be SSRF client-side cousin).</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://files.smashing.media/articles/how-owasp-helps-secure-full-stack-web-applications/csrf-hacked.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="375"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/how-owasp-helps-secure-full-stack-web-applications/csrf-hacked.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/how-owasp-helps-secure-full-stack-web-applications/csrf-hacked.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/how-owasp-helps-secure-full-stack-web-applications/csrf-hacked.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/how-owasp-helps-secure-full-stack-web-applications/csrf-hacked.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/how-owasp-helps-secure-full-stack-web-applications/csrf-hacked.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/how-owasp-helps-secure-full-stack-web-applications/csrf-hacked.png"
			
			sizes="100vw"
			alt="Cross-Site Request Forgery example"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      This image will trigger payments using the end user’s identity when displayed! The mistake lies in using a GET endpoint to trigger payments instead of a POST endpoint. (<a href='https://files.smashing.media/articles/how-owasp-helps-secure-full-stack-web-applications/csrf-hacked.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>Even experienced developers can be caught off-guard. Are you aware that dynamic route parameters are user inputs? For instance, <code>[language]/page.jsx</code> in a Next.js or Astro app. I often see clumsy attack attempts when logging them, like “language” being replaced by a path traversal like <code>../../../../passwords.txt</code>.</p>

<p><strong>Zod</strong> is a very popular library for running server-side data validation of user inputs. You can add a transform step to sanitize inputs included in database queries, or that could land in places where they end up being executed as code.</p>

<div class="partners__lead-place"></div>

<h2 id="number-2-cryptographic-failures">Number 2: Cryptographic Failures</h2>

<p>A typical discussion between two developers that are in deep, deep trouble:</p>

<blockquote>&mdash; We have leaked our database and encryption key. What algorithm was used to encrypt the password again? AES-128 or SHA-512?<br />&mdash; I don’t know, aren’t they the same thing? They transform passwords into gibberish, right?<br />&mdash; Alright. We are in deep, deep trouble.</blockquote>

<p>This vulnerability mostly concerns backend developers who have to deal with <strong>sensitive personal identifiers (PII)</strong> or <strong>passwords</strong>.</p>

<p>To be honest, I don’t know much about these algorithms; I studied computer science way too long ago.</p>

<p>The only thing I remember is that you need <strong>non-reversible algorithms to encrypt passwords</strong>, aka hashing algorithms. The point is that if the encrypted passwords are leaked, and the encryption key is also leaked, it will still be super hard to hack an account (you can’t just reverse the encryption).</p>

<p>In the State of JavaScript survey, we use passwordless authentication with an email magic link and one-way hash emails, so even as admins, we cannot guess a user’s email in our database.</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://files.smashing.media/articles/how-owasp-helps-secure-full-stack-web-applications/encrypted-email.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="177"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/how-owasp-helps-secure-full-stack-web-applications/encrypted-email.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/how-owasp-helps-secure-full-stack-web-applications/encrypted-email.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/how-owasp-helps-secure-full-stack-web-applications/encrypted-email.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/how-owasp-helps-secure-full-stack-web-applications/encrypted-email.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/how-owasp-helps-secure-full-stack-web-applications/encrypted-email.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/how-owasp-helps-secure-full-stack-web-applications/encrypted-email.png"
			
			sizes="100vw"
			alt="A hashed email"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      A hashed email generated when a user creates an account: it can’t be reversed even when possessing the encryption key. (<a href='https://files.smashing.media/articles/how-owasp-helps-secure-full-stack-web-applications/encrypted-email.png'>Large preview</a>)
    </figcaption>
  
</figure>

<h2 id="and-number-1-is">And number 1  is&hellip;</h2>

<p>Such suspense! We are about to discover that the top 1 vulnerability in the world of web development is&hellip;</p>

<p><strong>Broken Access Control!</strong> Tada.</p>

<p>Yeah, the name is not super insightful, so let me rephrase it. It’s about people being able to access other people’s accounts or people being able to access resources they are not allowed to. That’s more impressive when put this way.</p>

<p>A while ago, I wrote an article about the fact that <a href="https://www.ericburel.tech/blog/static-paid-content-app-router"><strong>checking authorization within a layout may leave page content unprotected in Next.js</strong></a>. It’s not a flaw in the framework’s design but a consequence of how React Server Components have a different model than their client counterparts, which then affects how the layout works in Next.</p>

<p>Here is a demo of how you can implement a paywall in Next.js that doesn’t protect anything.</p>

<pre><code class="language-javascript">// app/layout.jsx
// Using cookie-based authentication as usual
async function checkPaid() {
  const token = cookies.get("auth_token");
  return await db.hasPayments(token);
}
// Running the payment check in a layout to apply it to all pages
// Sadly, this is not how Next.js works!
export default async function Layout() {
  // ❌ this won't work as expected!!
  const hasPaid = await checkPaid();
  if (!hasPaid) redirect("/subscribe");
  // then render the underlying page
  return &lt;div&gt;{children}&lt;/div&gt;;
}
// ❌ this can be accessed directly
// by adding “RSC=1” to the request that fetches it!
export default function Page() {
  return &lt;div&gt;PAID CONTENT&lt;/div&gt;
}
</code></pre>

<h2 id="what-we-have-learned-from-the-top-5-vulnerabilities">What We Have Learned From The Top 5 Vulnerabilities</h2>

<p>Most common vulnerabilities are tightly related to application design issues:</p>

<ul>
<li>Copy-pasting configuration without really understanding it.</li>
<li>Having an improper understanding of the framework we use in inner working. Next.js is a complex beast and doesn’t make our life easier on this point!</li>
<li>Picking an algorithm that is not suited for a given task.</li>
</ul>

<p>These vulnerabilities are tough ones because they confront us to our own limits as web developers. Nobody is perfect, and the most experienced developers will inevitably write vulnerable code at some point in their lives without even noticing.</p>

<p>How to prevent that? By not staying alone! When in doubt, ask around fellow developers; there are great chances that someone has faced the same issues and can lead you to the right solutions.</p>

<h2 id="where-to-head-now">Where To Head Now?</h2>

<p>First, I must insist that you have already done a great job of improving the security of your applications by reading this article. Congratulations!</p>

<p>Most hackers rely on a volume strategy and are not particularly skilled, so they are really in pain when confronted with educated developers who can spot and fix the most common vulnerabilities.</p>














<figure class="
  
  
  ">
  
    <a href="https://files.smashing.media/articles/how-owasp-helps-secure-full-stack-web-applications/owasp.jpg">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="500"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/how-owasp-helps-secure-full-stack-web-applications/owasp.jpg 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/how-owasp-helps-secure-full-stack-web-applications/owasp.jpg 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/how-owasp-helps-secure-full-stack-web-applications/owasp.jpg 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/how-owasp-helps-secure-full-stack-web-applications/owasp.jpg 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/how-owasp-helps-secure-full-stack-web-applications/owasp.jpg 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/how-owasp-helps-secure-full-stack-web-applications/owasp.jpg"
			
			sizes="100vw"
			alt="OWASP top 10"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      By discovering how the OWASP top 10 can affect full-stack JavaScript applications, you’ve just made hackers’ lives much harder! (<a href='https://files.smashing.media/articles/how-owasp-helps-secure-full-stack-web-applications/owasp.jpg'>Large preview</a>)
    </figcaption>
  
</figure>

<p>From there, I can suggest a few directions to get even better at securing your web applications:</p>

<ul>
<li><strong>Try to apply the OWASP top 10 to an application you know well</strong>, either a personal project, your company’s codebase, or an open-source solution.</li>
<li><strong>Give a shot at some third-party security tools.</strong> They tend to overflow developers with too much information but keep in mind that most actors in the field of security are aware of this issue and work actively to provide more focused vulnerability alerts.</li>
<li>I’ve added my favorite <strong>security-related resources</strong> at the end of the article, so you’ll have plenty to read!</li>
</ul>

<p>Thanks for reading, and stay secure!</p>

<h3 id="resources-for-further-learning">Resources For Further Learning</h3>

<ul>
<li><a href="https://nextpatterns.dev/p/security/ssrf-server-action">An interactive demo of an SSRF in a Next.js app and how to fix it</a></li>
<li><a href="https://owasp.org/www-project-top-ten/">OWASP Top 10</a></li>
<li><a href="https://www.assetnote.io/resources/research/digging-for-ssrf-in-nextjs-apps">An SSRF vulnerability that affected Next.js image optimization system</a></li>
<li><a href="https://www.dash0.com/blog/how-to-inspect-react-server-component-activity-with-next-js">Observe React Server Components using Open Telemetry</a></li>
<li><a href="https://opentelemetry.io/">OpenTelemetry and open source Telemtry standard</a></li>
<li><a href="https://www.ibm.com/think/topics/log4j">Log4J vulnerability</a></li>
<li><a href="https://upstash.com/blog/edge-rate-limiting">Setting up rate limiting in a middleware using a Redis service</a></li>
<li><a href="https://vercel.com/blog/introducing-the-vercel-waf">Vercel WAF annoucement</a></li>
<li><a href="https://cve.mitre.org/">Mitre CVE database</a></li>
<li><a href="https://nextpatterns.dev/p/security/csrf-image">An interactive demo of a CSRF vulnerability in a Next.js app and how to fix it</a></li>
<li><a href="https://www.smashingmagazine.com/2023/01/authentication-websites-banking-analogy/">A super complete guide on authentication specifically targeting web apps</a></li>
<li><a href="https://nextjs.org/docs/app/building-your-application/data-fetching/server-actions-and-mutations#server-side-form-validation">Server form validation with zod in Next.js</a> (Astro has it built-in)</li>
<li><a href="https://github.com/colinhacks/zod/discussions/1358">Sanitization with zod</a></li>
<li><a href="https://www.ericburel.tech/blog/static-paid-content-app-router">Secure statically rendered paid content in Next.js and how layouts are a bad place to run authentication checks</a></li>
<li><a href="https://www.smashingmagazine.com/search/?q=security">Smashing Magazine articles related to security</a> (almost 50 matches at the time of writing!)</li>
</ul>

<p><em>This article is inspired by my talk at React Advanced London 2024, “<a href="https://gitnation.com/contents/securing-server-rendered-applications-nextjs-case">Securing Server-Rendered Applications: Next.js case</a>,” which is available to watch as a replay online.</em></p>

<div class="signature">
  <img src="https://www.smashingmagazine.com/images/logo/logo--red.png" alt="Smashing Editorial" width="35" height="46" loading="lazy" decoding="async" />
  <span>(yk)</span>
</div>


              </article>
            </body>
          </html>
        ]]></content:encoded></item><item><author>Vitaly Friedman</author><title>Meet Success At Scale, A New Smashing Book By Addy Osmani</title><link>https://www.smashingmagazine.com/2023/05/success-at-scale-pre-release/</link><pubDate>Thu, 25 May 2023 20:00:00 +0000</pubDate><guid>https://www.smashingmagazine.com/2023/05/success-at-scale-pre-release/</guid><description>Meet “Success At Scale”, our upcoming book with best-practice case studies from industry experts. &lt;strong>Print shipping in early March 2024.&lt;/strong> eBook now available.&lt;/strong> &lt;a href="/printed-books/success-at-scale/" data-product-sku="success-at-scale" data-component="AddToCart" data-product-path="/printed-books/success-at-scale" data-silent="true">Pre-order the book.&lt;/a></description><content:encoded><![CDATA[
          <html>
            <head>
              <meta charset="utf-8">
              <link rel="canonical" href="https://www.smashingmagazine.com/2023/05/success-at-scale-pre-release/" />
              <title>Meet Success At Scale, A New Smashing Book By Addy Osmani</title>
            </head>
            <body>
              <article>
                <header>
                  <h1>Meet Success At Scale, A New Smashing Book By Addy Osmani</h1>
                  
                    
                    <address>Vitaly Friedman</address>
                  
                  <time datetime="2023-05-25T20:00:00&#43;00:00" class="op-published">2023-05-25T20:00:00+00:00</time>
                  <time datetime="2023-05-25T20:00:00&#43;00:00" class="op-modified">2026-02-09T03:03:08+00:00</time>
                </header>
                
                

<p>Today, we are very happy to announce our new book: <em>Success at Scale</em>, a curated collection of <strong>best-practice case studies</strong> capturing how production sites of different sizes tackle performance, accessibility, capabilities, and developer experience at scale. Case studies are from <strong>industry experts</strong> with guidance that stands the test of time.</p>

<p>Join Addy Osmani, your curator, as we dive into a nuanced look at several key topics that will teach you tips and tricks that may help you optimize your own sites. The book will also include short interviews with each contributor on what additional lessons, challenges, and tips they have to share some time after each case study was written.</p>

<p><strong>High-quality hardcover</strong>. Curated by Addy Osmani. Cover art by Espen Brunborg. <strong>Print shipping in early March 2024.</strong> eBook now available.</strong> <a href="/printed-books/success-at-scale/" data-product-sku="success-at-scale" data-component="AddToCart" data-product-path="/printed-books/success-at-scale" data-silent="true">Pre-order the book.</a></p>

<figure style="margin-bottom:0;padding-bottom:0" class="break-out article__image">
    <a href="https://files.smashing.media/articles/success-at-scale-pre-release/success-at-scale-preorder-opt.png" title="Tap for a large preview of the book.">
    <img width="900" height="506" style="border-radius: 11px" src="https://files.smashing.media/articles/success-at-scale-pre-release/success-at-scale-preorder-opt.png" alt="Success At Scale">
    </a>
</figure>


<div class="book-cta__inverted">
	


	
	
	




















<div class="book-cta" data-handler="ContentTabs" data-mq="(max-width: 480px)">

  
 
<nav class="content-tabs content-tabs--books">
  <ul>
    <li class="content-tab">
      <a href="#">
        <button class="btn btn--small btn--white btn--white--bordered">
          Print + eBook
        </button>
      </a>
    </li>

    <li class="content-tab">
      <a href="#">
        <button class="btn btn--small btn--white btn--white--bordered">
          eBook
        </button>
      </a>
    </li>
  </ul>
</nav>


	<div class="book-cta__col book-cta__hardcover content-tab--content">
		<h3 class="book-cta__title">
			<span>Print + eBook</span>
		</h3>

		
			



	
	
	
	
	
	
	<script class="gocommerce-product" type="application/json" data-sku="success-at-scale" data-type="Book">
	{
		"sku": "success-at-scale",
		"type": "Book",
		"price": "44.00",
		
		"prices": [{
			"amount": "44.00",
			"currency": "USD",
			"items": [
				{"amount": "34.00", "type": "Book"},
				{"amount": "10.00", "type": "E-Book"}
			]
		}, {
			"amount": "44.00",
			"currency": "EUR",
			"items": [
				{"amount": "34.00", "type": "Book"},
				{"amount": "10.00", "type": "E-Book"}
			]
		}
		]
	}
	</script>


<span class="book-cta__price" data-handler="PriceTag" data-sku="success-at-scale" data-type="Book" data-insert="true">
  <span class="placeholder">
    
      
<span class="currency-sign">$</span>
44<span class="sup">.00</span>


    

    
  </span>
</span>

		
		<button class="btn btn--full btn--medium btn--text-shadow"
						
		        data-product-path="/printed-books/success-at-scale/"
						data-product-sku="success-at-scale"
            data-author="Addy Osmani"
            data-authors=""
						data-link=""
						
            data-component="AddToCart">
			 Get Print + eBook
		</button>
		<p class="book-cta__desc">
			Quality hardcover. <a href="https://www.smashingmagazine.com/delivery-times/">Free worldwide shipping</a>.<br/> 100 days money-back-guarantee.
		</p>
	</div>
	<div class="book-cta__col book-cta__ebook content-tab--content">
		<h3 class="book-cta__title">
			<span>eBook</span>
		</h3>

		
			<div data-audience="anonymous free supporter" data-remove="true">
				



	
	
	
	
	
	
	<script class="gocommerce-product" type="application/json" data-sku="success-at-scale-ebook" data-type="E-Book">
	{
		"sku": "success-at-scale-ebook",
		"type": "E-Book",
		"price": "19.00",
		
		"prices": [{
			"amount": "19.00",
			"currency": "USD"
		}, {
			"amount": "19.00",
			"currency": "EUR"
		}
		]
	}
	</script>


<span class="book-cta__price" data-handler="PriceTag" data-sku="success-at-scale-ebook" data-type="E-Book" data-insert="true">
  <span class="placeholder">
    
      
<span class="currency-sign">$</span>
19<span class="sup">.00</span>


    

    
  </span>
</span>

			</div>
		

    
      <span class="book-cta__price hidden" data-audience="smashing member" data-remove="true">
        <span class="green">Free!</span>
      </span>
    

		<button class="btn btn--full btn--medium btn--text-shadow"
		        data-product-path="/printed-books/success-at-scale/"
						data-product-sku="success-at-scale-ebook"
            data-author="Addy Osmani"
            data-authors=""
						data-link=""
            data-component="AddToCart"
						
            
              data-audience="anonymous free supporter"
              data-remove="true"
            
            >
			  Get the eBook
		</button>
		<p
      class="book-cta__desc"
      
        data-audience="anonymous free supporter"
        data-remove="true"
      
    >
			DRM-free, of course. ePUB, Kindle, PDF.<br/>Included with your <a href="https://www.smashingmagazine.com/membership/">Smashing Membership.</a>
		</p>

    
  <div data-audience="smashing member" class="hidden" data-remove="true">
    <a href="successatscalepdf" class="btn btn--medium btn--green btn--full js-add-to-cart">
      Get the eBook
    </a>
    <p class="book-cta__desc book-cta__desc--light">
      <a href="successatscalepdf">Download PDF</a>, <a href="successatscaleepub">ePUB</a>, <a href="successatscalemobi">Kindle</a>.<br/>Thanks for being smashing!&nbsp;❤️
    </p>
  </div>


	</div>
</div>

</div>

<h2 id="contents">Contents</h2>

<p>Each section of the book is filled with case studies from real-world large-scale web applications and services, interviews with the people involved, and key takeaways to help you achieve the same success.</p>

<ul>
<li><strong>Performance</strong> includes examples of measuring, budgeting, optimizing, and monitoring performance, in addition to tips for building a performance culture.</li>
<li><strong>Capabilities</strong> is about bridging the gap between native capabilities and the modern web. You’ll explore web apps, native apps, and progressive web applications.</li>
<li><strong>Accessibility</strong> makes web apps viable for diverse users, including people with temporary or permanent disabilities. Most of us will have a disability at some point in our lives, and these case studies show how we can make the web work for all of us.</li>
<li><strong>Developer Experience</strong> is about building a project environment and culture that encourage support, growth, and problem-solving within teams. Strong teams build great projects!</li>
</ul>

<h2 id="who-this-book-is-for">Who This Book Is For</h2>

<p>This book is for professional web developers and teams who want to deliver high-quality web experiences. We explore dimensions like performance, accessibility, capabilities, and developer experience in depth. <em>Success at Scale</em> goes beyond beginner material to cover the pragmatic approaches required to tackle these challenges in the real world.</p>

<figure style="margin-bottom:0;padding-bottom:0" class="break-out article__image">
    <a href="https://files.smashing.media/articles/success-at-scale-pre-release/success-at-scale-cover-800px-opt.png" title="Tap for a large preview of the book.">
    <img style="border-radius: 11px" src="https://files.smashing.media/articles/success-at-scale-pre-release/success-at-scale-cover-800px-opt.png" alt="Success At Scale">
    </a>
</figure>


<div class="book-cta__inverted">
	


	
	
	




















<div class="book-cta" data-handler="ContentTabs" data-mq="(max-width: 480px)">

  
 
<nav class="content-tabs content-tabs--books">
  <ul>
    <li class="content-tab">
      <a href="#">
        <button class="btn btn--small btn--white btn--white--bordered">
          Print + eBook
        </button>
      </a>
    </li>

    <li class="content-tab">
      <a href="#">
        <button class="btn btn--small btn--white btn--white--bordered">
          eBook
        </button>
      </a>
    </li>
  </ul>
</nav>


	<div class="book-cta__col book-cta__hardcover content-tab--content">
		<h3 class="book-cta__title">
			<span>Print + eBook</span>
		</h3>

		
			



	
	
	
	
	
	
	<script class="gocommerce-product" type="application/json" data-sku="success-at-scale" data-type="Book">
	{
		"sku": "success-at-scale",
		"type": "Book",
		"price": "44.00",
		
		"prices": [{
			"amount": "44.00",
			"currency": "USD",
			"items": [
				{"amount": "34.00", "type": "Book"},
				{"amount": "10.00", "type": "E-Book"}
			]
		}, {
			"amount": "44.00",
			"currency": "EUR",
			"items": [
				{"amount": "34.00", "type": "Book"},
				{"amount": "10.00", "type": "E-Book"}
			]
		}
		]
	}
	</script>


<span class="book-cta__price" data-handler="PriceTag" data-sku="success-at-scale" data-type="Book" data-insert="true">
  <span class="placeholder">
    
      
<span class="currency-sign">$</span>
44<span class="sup">.00</span>


    

    
  </span>
</span>

		
		<button class="btn btn--full btn--medium btn--text-shadow"
						
		        data-product-path="/printed-books/success-at-scale/"
						data-product-sku="success-at-scale"
            data-author="Addy Osmani"
            data-authors=""
						data-link=""
						
            data-component="AddToCart">
			 Get Print + eBook
		</button>
		<p class="book-cta__desc">
			Quality hardcover. <a href="https://www.smashingmagazine.com/delivery-times/">Free worldwide shipping</a>.<br/> 100 days money-back-guarantee.
		</p>
	</div>
	<div class="book-cta__col book-cta__ebook content-tab--content">
		<h3 class="book-cta__title">
			<span>eBook</span>
		</h3>

		
			<div data-audience="anonymous free supporter" data-remove="true">
				



	
	
	
	
	
	
	<script class="gocommerce-product" type="application/json" data-sku="success-at-scale-ebook" data-type="E-Book">
	{
		"sku": "success-at-scale-ebook",
		"type": "E-Book",
		"price": "19.00",
		
		"prices": [{
			"amount": "19.00",
			"currency": "USD"
		}, {
			"amount": "19.00",
			"currency": "EUR"
		}
		]
	}
	</script>


<span class="book-cta__price" data-handler="PriceTag" data-sku="success-at-scale-ebook" data-type="E-Book" data-insert="true">
  <span class="placeholder">
    
      
<span class="currency-sign">$</span>
19<span class="sup">.00</span>


    

    
  </span>
</span>

			</div>
		

    
      <span class="book-cta__price hidden" data-audience="smashing member" data-remove="true">
        <span class="green">Free!</span>
      </span>
    

		<button class="btn btn--full btn--medium btn--text-shadow"
		        data-product-path="/printed-books/success-at-scale/"
						data-product-sku="success-at-scale-ebook"
            data-author="Addy Osmani"
            data-authors=""
						data-link=""
            data-component="AddToCart"
						
            
              data-audience="anonymous free supporter"
              data-remove="true"
            
            >
			  Get the eBook
		</button>
		<p
      class="book-cta__desc"
      
        data-audience="anonymous free supporter"
        data-remove="true"
      
    >
			DRM-free, of course. ePUB, Kindle, PDF.<br/>Included with your <a href="https://www.smashingmagazine.com/membership/">Smashing Membership.</a>
		</p>

    
  <div data-audience="smashing member" class="hidden" data-remove="true">
    <a href="successatscalepdf" class="btn btn--medium btn--green btn--full js-add-to-cart">
      Get the eBook
    </a>
    <p class="book-cta__desc book-cta__desc--light">
      <a href="successatscalepdf">Download PDF</a>, <a href="successatscaleepub">ePUB</a>, <a href="successatscalemobi">Kindle</a>.<br/>Thanks for being smashing!&nbsp;❤️
    </p>
  </div>


	</div>
</div>

</div>

<h2 id="about-the-author">About the Author</h2>

<p><a href="https://twitter.com/addyosmani"><img loading="lazy" decoding="async" style="float:right;margin-top:1em;margin-left:0.9em;margin-bottom:1em;border-radius:50%;    max-width:calc(50% - 5vh);height:auto;" src="https://files.smashing.media/authors/addy-osmani-200px.jpg" width="150" height="150" alt="Addy Osmani" /></a><em>Addy Osmani</em> is an engineering leader working on Google Chrome. He leads up Chrome’s Developer Experience organization, helping reduce the friction for developers to build great user experiences.</p>

<h2 id="technical-details">Technical Details</h2>

<ul>
<li>ISBN: <span class="small-caps">978-3-910835-00-9</span> (print)</li>
<li><strong>Quality hardcover</strong>, stitched binding, ribbon page marker.</li>
<li>Free worldwide airmail <strong>shipping from Germany starting early March 2024</strong>.</li>
<li>eBook available for download as PDF, ePUB, and Amazon Kindle.</li>
<li><a href="/printed-books/success-at-scale/" data-product-sku="success-at-scale" data-component="AddToCart" data-product-path="/printed-books/success-at-scale/" data-silent="true"><srtong>Pre-order the book.</strong></a></li>
</ul>

<h2 id="community-matters">Community Matters ❤️</h2>

<p>Producing a book takes quite a bit of time, and we couldn’t pull it off without the support of our wonderful <strong>community</strong>. A huge shout-out to Smashing Members for the kind, ongoing support. The eBook is and always will be <a href="https://www.smashingmagazine.com/membership">free for <em>Smashing Members</em> as soon as it’s out</a>. Plus, Members get a friendly discount when purchasing their printed copy. Just sayin’! ;-)</p>

<h2 id="more-smashing-books-amp-goodies">More Smashing Books &amp; Goodies</h2>

<p>Promoting best practices and providing you with practical tips to master your daily coding and design challenges has always been (and will be) at the <strong>core of everything we do</strong> at Smashing.</p>

<p>In the past few years, we were very lucky to have worked together with some talented, caring people from the web community to publish their wealth of experience as <a href="/printed-books/">printed books that stand the test of time</a>. Heather and Steven are two of these people. Have you checked out their books already?</p>

<div class="book-grid break-out book-grid__in-post">

<figure class="book--featured"><div class="book--featured__image"><a href="/printed-books/understanding-privacy/"><img loading="lazy" decoding="async" src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d2da7a90-acdb-43c7-82b2-5225c33ca4d7/understanding-privacy-cover-new-opt.png" alt="Understanding Privacy" width="160" height="232" /></a></div><figcaption><h4 class="book--featured__title"><a href="/printed-books/understanding-privacy/" style="padding: 7px 0;text-decoration-skip-ink: auto;text-decoration-thickness: 1px;text-underline-offset: 1px;text-decoration-line: underline;text-decoration-color: #006fc6;">Understanding Privacy</a></h4><p class="book--featured__desc">Everything you need to know to put your users first and make a better web.</p><p><a style="font-style: normal !important; color: #fff !important;" class="btn btn--medium btn--green" href="/printed-books/understanding-privacy/" data-product-path="/printed-books/understanding-privacy/" data-product-sku="understanding-privacy" data-component="AddToCart">Add to cart <span style="color:#fff;font-size:1em;">$44</span></a></p></figcaption></figure>

<figure class="book--featured"><div class="book--featured__image"><a href="/printed-books/touch-design-for-mobile-interfaces/"><img loading="lazy" decoding="async" src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/b14658fc-bb2d-41a6-8d1a-70eaaf1b8ec8/touch-design-book-shop-opt.png" alt="Touch Design for Mobile Interfaces" width="160" height="232" /></a></div><figcaption><h4 class="book--featured__title"><a style="padding: 7px 0;text-decoration-skip-ink: auto;text-decoration-thickness: 1px;text-underline-offset: 1px;text-decoration-line: underline;text-decoration-color: #006fc6;" href="/printed-books/touch-design-for-mobile-interfaces/">Touch Design for Mobile Interfaces</a></h4><p class="book--featured__desc">Learn how touchscreen devices really work &mdash; and how people really use them.</p><p><a style="font-style: normal !important; color: #fff !important;" class="btn btn--medium btn--green" href="/printed-books/touch-design-for-mobile-interfaces/" data-product-path="/printed-books/touch-design-for-mobile-interfaces/" data-product-sku="touch-design-for-mobile-interfaces" data-component="AddToCart">Add to cart <span style="color:#fff;font-size:1em;">$44</span></a></p></figcaption></figure>

<figure class="book--featured"><div class="book--featured__image"><a href="/printed-books/checklist-cards/"><img loading="lazy" decoding="async" src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/efffa8a0-82a0-415a-8aa5-8684a32083eb/checklist-cards-box-opt.png"  width="160" height="232" alt="Interface Design Checklists Cards" /></a></div><figcaption><h4 class="book--featured__title"><a style="padding: 7px 0;text-decoration-skip-ink: auto;text-decoration-thickness: 1px;text-underline-offset: 1px;text-decoration-line: underline;text-decoration-color: #006fc6;" href="/printed-books/checklist-cards/">Interface Design Checklists</a></h4><p class="book--featured__desc">100 practical cards for common interface design challenges.</p>
<p><a style="font-style: normal !important; color: #fff !important;" class="btn btn--medium btn--green" href="/printed-books/checklist-cards/" data-product-path="/printed-books/checklist-cards/" data-product-sku="checklist-cards" data-component="AddToCart">Add to cart <span style="color:#fff;font-size:1em;">$39</span></a></p></figcaption></figure>

</div>

              </article>
            </body>
          </html>
        ]]></content:encoded></item><item><author>Marcus Herrmann</author><title>The Potentially Dangerous Non-Accessibility Of Cookie Notices</title><link>https://www.smashingmagazine.com/2023/04/potentially-dangerous-non-accessibility-cookie-notices/</link><pubDate>Mon, 24 Apr 2023 08:00:00 +0000</pubDate><guid>https://www.smashingmagazine.com/2023/04/potentially-dangerous-non-accessibility-cookie-notices/</guid><description>Cookie consents — whatever your opinion is regarding them — are ubiquitous and possibly even a legal risk for your webpage. In addition to their privacy implications, they have the potential to violate web accessibility laws as well. In this piece, a Web Content Accessibility Guidelines (WCAG) auditor shares some cookie banner error patterns that can massively hurt a page’s overall conformance. Let’s explore what to look out for with this omnipresent piece of the web interface.</description><content:encoded><![CDATA[
          <html>
            <head>
              <meta charset="utf-8">
              <link rel="canonical" href="https://www.smashingmagazine.com/2023/04/potentially-dangerous-non-accessibility-cookie-notices/" />
              <title>The Potentially Dangerous Non-Accessibility Of Cookie Notices</title>
            </head>
            <body>
              <article>
                <header>
                  <h1>The Potentially Dangerous Non-Accessibility Of Cookie Notices</h1>
                  
                    
                    <address>Marcus Herrmann</address>
                  
                  <time datetime="2023-04-24T08:00:00&#43;00:00" class="op-published">2023-04-24T08:00:00+00:00</time>
                  <time datetime="2023-04-24T08:00:00&#43;00:00" class="op-modified">2026-02-09T03:03:08+00:00</time>
                </header>
                
                

<p>No matter what your stance is on them, no matter what your perspective is on data protection, web advertisement, setting cookies, EU’s General Data Protection Regulation (GDPR), and privacy preferences, cookie consent widgets (or “cookie banners”) are a reality on the web today.</p>

<p>For this reason, it is worth looking into <em>how</em> accessible and usable these banners are or can be. They have become, for better or worse, a component of the majority of today’s websites. Even more, cookie banners are often the first thing a user encounters. And, of course, they are part of every site of a webpage once they are implemented.</p>

<p>Sometimes, cookie banners are a technical necessity because of the page’s feature set or because of advertisements on the page. Even more often, cookie banners are not built by the front-end team but are a ready-made solution, like UserCentrics or others.</p>














<figure class="
  
  
  ">
  
    <a href="https://files.smashing.media/articles/potentially-dangerous-accessibility-cookie-notices/1-cookie-consent-widget.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="457"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/potentially-dangerous-accessibility-cookie-notices/1-cookie-consent-widget.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/potentially-dangerous-accessibility-cookie-notices/1-cookie-consent-widget.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/potentially-dangerous-accessibility-cookie-notices/1-cookie-consent-widget.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/potentially-dangerous-accessibility-cookie-notices/1-cookie-consent-widget.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/potentially-dangerous-accessibility-cookie-notices/1-cookie-consent-widget.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/potentially-dangerous-accessibility-cookie-notices/1-cookie-consent-widget.png"
			
			sizes="100vw"
			alt="Some exemplary cookie banner illustration, where the notice is on top of the website’s header"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      (<a href='https://files.smashing.media/articles/potentially-dangerous-accessibility-cookie-notices/1-cookie-consent-widget.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>Before I explain why the cookie banner deserves special attention regarding its accessibility, let’s quickly explain how the current gold standard of web accessibility, <a href="https://www.w3.org/TR/WCAG21/">Web Content Accessibility Guidelines (WCAG) Version 2.1</a>, works.</p>

<p>WCAG consists of principles, guidelines, and success criteria. The latter are testable steps to check against a webpage. For example:</p>

<ul>
<li>“Is the main language of the document set?”</li>
<li>“Does this non-text content have a suitable text alternative?”</li>
<li>“Is it perceivable where my focus is when I’m using the web presence with the keyboard (or another tech that emulates keyboard presses)?”</li>
</ul>

<p>You may have noticed that these are “yes or no” questions. Accordingly, this means that the final verdict of any given success criterion is either “pass” or “fail.”</p>

<p>Additionally, conformance to WCAG, as defined by the W3C (the governing body of the Web), means that none of its success criteria is allowed to “fail” when the whole document needs to be conformant:</p>

<blockquote>“Conformance to a standard means that you meet or satisfy the ‘requirements’ of the standard. In WCAG 2.0, the ‘requirements’ are the Success Criteria. To conform to WCAG 2.0, you need to satisfy the Success Criteria, that is, there is no content which violates the Success Criteria.”<br /><br />&mdash; <a href="https://www.w3.org/TR/UNDERSTANDING-WCAG20/conformance.html#uc-conformance-whatis-head">W3C Working Group Note</a></blockquote>

<p>No nuance here. Going back to our cookie consent interface, this means that the banner (or any other component) alone has the potential to negatively affect the WCAG conformance of an entire web project.</p>














<figure class="
  
  
  ">
  
    <a href="https://files.smashing.media/articles/potentially-dangerous-accessibility-cookie-notices/2-cookie-consent-interface.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="457"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/potentially-dangerous-accessibility-cookie-notices/2-cookie-consent-interface.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/potentially-dangerous-accessibility-cookie-notices/2-cookie-consent-interface.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/potentially-dangerous-accessibility-cookie-notices/2-cookie-consent-interface.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/potentially-dangerous-accessibility-cookie-notices/2-cookie-consent-interface.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/potentially-dangerous-accessibility-cookie-notices/2-cookie-consent-interface.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/potentially-dangerous-accessibility-cookie-notices/2-cookie-consent-interface.png"
			
			sizes="100vw"
			alt="Illustration of typical cookie consent issues, as stated in detail above"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      (<a href='https://files.smashing.media/articles/potentially-dangerous-accessibility-cookie-notices/2-cookie-consent-interface.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>WCAG conformance could be a big legal deal for many websites, whether part of the public sector in the European Union or the United States, as it is considered to fall under non-discrimination or market access laws or overall human rights to access to information. Webpages frequently must adhere to directives and regulations that directly or indirectly refer to WCAG, often its newest version, and conformance to its level AA standards. Therefore, all the following WCAG criteria are viewed through this lens, being fully aware that they are only a <strong>mere starting point</strong> when it comes to true web accessibility. On top of that, cookie consent interfaces are implemented on every subpage of a website, consequently harming accessibility and conformance throughout an entire website.</p>

<p>So, in order to not let a faulty cookie banner interface drag down your page’s conformance with accessibility laws and, more importantly, not exclude users from accessing and exercising their rights, let’s list what to look for, what to configure, and what to build properly in the first place.</p>

<div data-audience="non-subscriber" data-remove="true" class="feature-panel-container">

<aside class="feature-panel" style="">
<div class="feature-panel-left-col">

<div class="feature-panel-description"><p>Meet <strong><a data-instant href="https://www.smashingconf.com/online-workshops/">Smashing Workshops</a></strong> on <strong>front-end, design &amp; UX</strong>, with practical takeaways, live sessions, <strong>video recordings</strong> and a friendly Q&amp;A. With Brad Frost, Stéph Walter and <a href="https://smashingconf.com/online-workshops/workshops">so many others</a>.</p>
<a data-instant href="smashing-workshops" class="btn btn--green btn--large" style="">Jump to the workshops&nbsp;↬</a></div>
</div>
<div class="feature-panel-right-col"><a data-instant href="smashing-workshops" class="feature-panel-image-link">
<div class="feature-panel-image">
<img
    loading="lazy"
    decoding="async"
    class="feature-panel-image-img"
    src="/images/smashing-cat/cat-scubadiving-panel.svg"
    alt="Feature Panel"
    width="257"
    height="355"
/>

</div>
</a>
</div>
</aside>
</div>

<h2 id="contrast-errors">Contrast Errors</h2>

<p>This is especially relevant when it comes to important controls such as the setting of cookies or the overall acceptance of the recommended cookie set. It is crucial that form controls and text can be sufficiently perceived. Unsurprisingly, a solid contrast is also important for WCAG in general. Namely, in success criteria <a href="https://www.w3.org/WAI/WCAG21/Understanding/contrast-minimum.html">1.4.3</a> and <a href="https://www.w3.org/WAI/WCAG21/Understanding/non-text-contrast.html">1.4.11</a>, both define contrast boundaries.</p>

<h3 id="what-to-do">What To Do</h3>

<p>When you are using a ready-made cookie management solution, try to influence the colors (if possible, potentially in your cookie vendor’s settings) and make sure interactive controls have sufficient color contrast.</p>

<p>Additionally, if your website relies on a dedicated contrast mode for WCAG conformance, check whether it extends to (or influences) the cookie management interface. I have seen cases in my accessibility auditor practice where this was not considered, and an inaccessible (often branded) color combination was used in the cookie interface, thinking the contrast mode takes care of every color-related violation. But the contrast setting of the website did not affect the third-party cookie banner due to it being, well, third-party and loaded from external sources or after the contrast mode had done its work, resulting in a “Fail” on WCAG’s contrast-related success criteria.</p>

<h2 id="pseudo-buttons">Pseudo Buttons</h2>

<p>Another cookie banner issue can be one thing that is, unfortunately, an error pattern that you can find outside of cookie management: <code>div</code>s or <code>span</code>s with click events posing as links or buttons. These controls may be styled like buttons but lack the semantic information of a button.</p>

<p>On top of that, these controls usually aren’t <strong>keyboard focusable</strong>. Hence, many serious barriers and WCAG violations are occurring all at once. If we were about to imagine the most “pseudo” button, e.g., a <code>div</code> with a click handler, this would at least violate success criteria <a href="https://www.w3.org/WAI/WCAG21/Understanding/keyboard.html">2.1.1 (Keyboard)</a>, because it is neither reachable nor “activatable,” and <a href="https://www.w3.org/WAI/WCAG21/Understanding/name-role-value">4.1.2 (Name, Role, Value)</a> because it doesn’t “introduce” itself as a button and lacks a programmatic label.</p>

<h3 id="what-to-do-1">What To Do</h3>

<p>The easiest thing to do, assuming you have built the cookie management interface yourself, is to replace those above-mentioned pseudo buttons with real <code>&lt;button&gt;</code> elements because it provides semantics, focusability, and even keyboard event handlers for free. But even if we don’t talk literally about buttons, the pattern is the same: check your cookie prompt for interactive elements that are built with elements that are only styled to look like “the real thing” but consist of non-semantic <code>div</code>s and <code>span</code>s. This is a red flag for you to implement native interactive elements, like <code>a</code>, <code>button</code>, or <code>input</code> instead.</p>

<p>The situation gets a lot tougher, of course, when these semantic errors are in a third-party script and are, therefore, beyond your direct influence and control. Understandably, we have to leave the engineering side of things and start to dive into politics of some sort. If you work within an organization where the decision of cookie management infrastructure is outside your control, you have to escalate matters to your supervisors and managers (especially, but not only when your web projects have to adhere to accessibility laws).</p>

<p>Three abstract steps have to happen:</p>

<ol>
<li>Your organization has to become aware of the barrier and potential legal risk &mdash; “up” to the powers that have the influence to change technical decisions like these.</li>
<li>As a consequence, the vendor that provided the faulty cookie banner has to be contacted about the issue.</li>
<li>A form of pressure should be applied by your organization &mdash; not just for your own sake but also regarding all the other web pages where the faulty cookie banner negatively influences accessibility and conformance.</li>
</ol>

<p>In a possible fourth step, your company or agency should reflect on its vending process for third-party services and the HTML (and possible barriers) that come with it.</p>

<div class="partners__lead-place"></div>

<h2 id="unlabeled-form-fields">Unlabeled Form Fields</h2>

<p>When you think about it, the main user control that one could imagine for cookie management widgets is a <strong>form control</strong>: You can select which set of cookies you are willing to accept by interacting with checkboxes in a <code>form</code> element. And, of course, it is important that checkbox inputs are built in the correct way.</p>

<p>Alas, that is not always the case. While a checkbox and its label may visually appear adjacent, the checkbox can lack a <em>programmatic</em> label. This adds unnecessary confusion and barriers to the interface and also a failure of <a href="https://www.w3.org/WAI/WCAG21/Understanding/info-and-relationships">success criterion 1.3.1</a> when you look into the web accessibility standard.</p>

<h3 id="what-to-do-2">What To Do</h3>

<p>The most solid strategy to connect form inputs with their corresponding labels is to:</p>

<ol>
<li>Use a <code>label</code> element for the label (obviously).</li>
<li>Establish an <code>id</code> on the respective input you want to label.</li>
<li>Add a <code>for</code> attribute, filling it with the control’s <code>id</code> you created in the last step.</li>
</ol>

<p>This also works for <code>inputs</code> of all <code>type</code>s, like <code>textarea</code>s and <code>select</code>s. Here’s an example of how a properly labeled checkbox could look:</p>

<pre><code class="language-html">&lt;input type="checkbox" id="marketing-cookies" /&gt;
&lt;label for="marketing-cookies"&gt;Accept marketing cookies&lt;/label&gt;
</code></pre>

<p>If you can’t directly influence the HTML of the cookie banner’s code, the situation is comparable to the situation around pseudo buttons. Make sure that necessary pressure is applied to your cookie service provider to fix the problem. All of their customers will thank you for it, and even more so the people who visit their sites.</p>

<h2 id="broken-dialog-semantics-or-none-at-all">Broken Dialog Semantics (Or None At All)</h2>

<p>Quite a few cookie <em>banners</em> are actually cookie <em>dialogs</em>, and of the modal kind. Modal, in the context of a dialog, means that such a window blocks everything but itself, leaving only itself accessible. That is, at least, the theory. But quite some cookie management dialogs do “want to be as aggressive,” presenting as a modal part of the interface but have no according semantics and behavior, which would violate WCAG success criterion 4.1.</p>














<figure class="
  
  
  ">
  
    <a href="https://files.smashing.media/articles/potentially-dangerous-accessibility-cookie-notices/3-cookie-dialog-modal-kind.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="457"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/potentially-dangerous-accessibility-cookie-notices/3-cookie-dialog-modal-kind.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/potentially-dangerous-accessibility-cookie-notices/3-cookie-dialog-modal-kind.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/potentially-dangerous-accessibility-cookie-notices/3-cookie-dialog-modal-kind.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/potentially-dangerous-accessibility-cookie-notices/3-cookie-dialog-modal-kind.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/potentially-dangerous-accessibility-cookie-notices/3-cookie-dialog-modal-kind.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/potentially-dangerous-accessibility-cookie-notices/3-cookie-dialog-modal-kind.png"
			
			sizes="100vw"
			alt="Abstract illustration of how a cookie modal could look like, with dialog part in the center and a half-transparent backdrop"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      (<a href='https://files.smashing.media/articles/potentially-dangerous-accessibility-cookie-notices/3-cookie-dialog-modal-kind.png'>Large preview</a>)
    </figcaption>
  
</figure>

<h3 id="what-to-do-3">What To Do</h3>

<p>Up until recently, the recommendation was to build a dialog with WAI-ARIA roles and states and implement focus management yourself (or use <a href="https://github.com/KittyGiraudel/a11y-dialog">Kitty Giraudel’s great a11y-dialog</a>) component).</p>

<p>But the situation has (mostly) changed for the better. Lately, the native <code>&lt;dialog&gt;</code> element has matured to the point where it’s being recommended in most contexts <a href="https://www.scottohara.me/blog/2023/01/26/use-the-dialog-element.html#use-it">as long as it is used reasonably</a>. A great win for accessibility, in my opinion. The past way of building (modal) dialogs had so many moving parts and factors (roles, states, focus behaviors) to think about and implement manually that it was quite difficult to get it right. Now creating a dialog means using an aptly-named HTML element (and initializing it with <a href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLDialogElement/showModal"><code>.showModal()</code></a> if you think the cookie dialog needs to be interface-blocking).</p>

<p>What I’ve written so far is, of course, also valid when you cannot influence a third party’s code, and what I wrote earlier about comparable situations and potential cookie consent barriers is valid as well. If you detect errors in the third-party script you are implementing (such as no focus trapping, no <code>dialog</code> role, no <code>aria-modal=&quot;true&quot;</code> &mdash; and if everything else points towards “modalness”), escalate things internally and educate the decision-making powers about web accessibility consequences. Maybe even educate the third-party developers that things concerning modals have gotten a lot better recently.</p>

<h2 id="cookie-banners-are-hard-to-find-in-the-first-place">Cookie Banners Are Hard To Find In The First Place</h2>

<p>There are three typical places where you can usually find cookie consent interfaces, at least visually:</p>

<ol>
<li>As a modal dialog, i.e., in the middle or &mdash; more rarely &mdash; corners of the viewport;</li>
<li>On top, sometimes in a fixed manner;</li>
<li>At the bottom of the viewport, sometimes also somewhat positioned in a fixed way.</li>
</ol>

<p>But what matters way more for some people is how easy it is to find, should they go on a hunt for it. A great way of presenting this very problem is a <a href="https://www.youtube.com/watch?v=Uaqo4FOI_DY">presentation that accessibility specialist Léonie Watson gave</a> some time ago. Léonie is a seasoned screen reader user, and her presentation showcases a bunch of webpages and <strong>how the placement and “findability” of cookie banners influence the screen reader experiences</strong>, particularly as it is related to privacy. Hampering the ability to find important content in a document can, for example, negatively affect <a href="https://www.w3.org/WAI/WCAG21/Understanding/meaningful-sequence.html">WCAG 1.3.2 (Meaningful Sequence)</a>.</p>

<h3 id="what-to-do-4">What To Do</h3>

<p>In Léonie’s presentation, the best practices for cookie notice findability become very clear, especially in the last example:</p>

<ul>
<li>Place the banner preferably at the top of the document.</li>
<li>Use a headline in the cookie banner and make it either visible or <a href="https://www.a11yproject.com/posts/how-to-hide-content/">visually hidden</a> to help screen reader users <a href="https://webaim.org/projects/screenreadersurvey9/#finding">“get a grasp about the webpage”</a> and allow them to navigate by headings.</li>
<li>Build a bridge back to proper dialog semantics by making sure that if a dialog is meant to be the “exclusive” part of the interface, it uses appropriate semantic and state descriptions (see above for details).</li>
</ul>

<p>When we’re talking about changing third-party code, I reckon you know the drill by now. Try to influence this code indirectly on the “political level” because direct control is not possible.</p>

<div class="partners__lead-place"></div>

<h2 id="conclusion">Conclusion</h2>

<p>Hopefully, two things emerged while reading this article:</p>

<ol>
<li><strong>Awareness of the issue</strong>, namely, that an often unloved stepchild interface element has the potential to make it harder for some people to manage their privacy settings and, on top of that, to even pose a legal risk.</li>
<li><strong>A sense of how you can possibly remediate barriers you encounter when working with a cookie management banner.</strong> The direct way is described in a certain detail in the details I provided earlier and often has to do with code, styling, or overall education on how to prevent this in the future. The indirect way leads to a path of either setting the consent interface up properly or influencing the inner and outer politics of your vendor scripts. And again, there is the aspect of educating everyone involved. This time, structured information may be aimed at the powers that be in your organization, showing them that their choice of service providers may have unintended consequences.</li>
</ol>

<p>But regardless of whether you and your team manage to fix accessibility bugs directly or indirectly in your cookie consent interfaces, you can see their ubiquity and component architecture as an advantage. By getting the accessibility right in one place, you influence many other pages (or even foreign websites) for the better.</p>

<p>If you want to extend your horizon regarding the user experience side of cookie banners and learn about how you can actually turn privacy settings into a pleasant and respectful involvement with at least EU laws, please proceed to Vitaly’s smashing read, “<a href="https://www.smashingmagazine.com/2019/04/privacy-ux-better-cookie-consent-experiences/">Privacy UX: Better Cookie Consent Experiences</a>”.</p>

<h3 id="further-reading-on-smashingmag">Further Reading On SmashingMag</h3>

<ul>
<li>“<a href="https://www.smashingmagazine.com/2021/03/state-gdpr-2021-cookie-consent-designers-developers/">State Of GDPR In 2021: Cookie Consent For Designers And Developers</a>”, Danny Bluestone</li>
<li>“<a href="https://www.smashingmagazine.com/2022/11/guide-keyboard-accessibility-html-css-part1/">A Guide To Keyboard Accessibility: HTML And CSS (Part 1)</a>”, Cristian Díaz</li>
<li>“<a href="https://www.smashingmagazine.com/2023/02/keys-accessibility-mindset/">Keys To An Accessibility Mindset</a>”, Daniel Yuschick</li>
<li>“<a href="https://www.smashingmagazine.com/2022/11/automated-test-results-improve-accessibility/">Using Automated Test Results To Improve Accessibility</a>”, Noah Mashni and Mark Steadman</li>
</ul>

<div class="signature">
  <img src="https://www.smashingmagazine.com/images/logo/logo--red.png" alt="Smashing Editorial" width="35" height="46" loading="lazy" decoding="async" />
  <span>(gg, yk, il)</span>
</div>


              </article>
            </body>
          </html>
        ]]></content:encoded></item><item><author>Atila Fassina</author><title>Fine-Grained Access Handling And Data Management With Row-Level Security</title><link>https://www.smashingmagazine.com/2023/03/access-handling-data-management-row-level-security/</link><pubDate>Wed, 29 Mar 2023 12:00:00 +0000</pubDate><guid>https://www.smashingmagazine.com/2023/03/access-handling-data-management-row-level-security/</guid><description>There are a few different reasons your app might need data access management: security and privacy, industry standards compliance, or data access control. Multi-tenant user is a commonly used architecture, and therefore, you need a reliable way to manage access. Let’s have a look at what Row-Level Security means!</description><content:encoded><![CDATA[
          <html>
            <head>
              <meta charset="utf-8">
              <link rel="canonical" href="https://www.smashingmagazine.com/2023/03/access-handling-data-management-row-level-security/" />
              <title>Fine-Grained Access Handling And Data Management With Row-Level Security</title>
            </head>
            <body>
              <article>
                <header>
                  <h1>Fine-Grained Access Handling And Data Management With Row-Level Security</h1>
                  
                    
                    <address>Atila Fassina</address>
                  
                  <time datetime="2023-03-29T12:00:00&#43;00:00" class="op-published">2023-03-29T12:00:00+00:00</time>
                  <time datetime="2023-03-29T12:00:00&#43;00:00" class="op-modified">2026-02-09T03:03:08+00:00</time>
                </header>
                
                

<p>Many apps have some kind of user-specific information or data that is supposed to be accessed by a certain group of users and not by others. With these sorts of requirements comes a demand for fine-grained access handling. Whether for security or privacy reasons, dealing with sensitive data is an important topic for any app. Big or small, nobody wants to be on the wrong side of a data leakage scandal. So let’s dive in on what it means to handle sensitive or confidential information in our apps.</p>

<h2 id="take-it-seriously">Take It Seriously</h2>

<p>Regardless if you’re requesting access on Twitter, a bank, or your local library, identifying yourself is a crucial first step. Any sort of <strong>gateway</strong> needs a reliable way to verify if an access request is legitimate.</p>

<blockquote>“Identity theft is not a joke.”<br />&mdash; <a href="https://youtu.be/WaaANll8h18?t=66">Dwight Schrute</a></blockquote>

<p>On the web, we encapsulate the process for identifying a user and granting them access as <strong>Auth</strong>, which stands for two related but distinct actions:</p>

<ul>
<li><strong>Authentication</strong>: the act of confirming a user’s identity.</li>
<li><strong>Authorization</strong>: granting an authenticated user access to a resource.</li>
</ul>

<p>It is possible to have authentication without authorization, but not the other way around. The strategy to implement authorization at a data management level can be loosely referred to as <strong>Row-Level Security (RLS)</strong>, but RLS is actually a bit more than this. In this article, we will take a step deeper into managing sensitive user data and defining access roles to a user base.</p>

<div data-audience="non-subscriber" data-remove="true" class="feature-panel-container">

<aside class="feature-panel" style="">
<div class="feature-panel-left-col">

<div class="feature-panel-description"><p>Meet <strong><a data-instant href="/printed-books/typescript-in-50-lessons/">“TypeScript in 50 Lessons”</a></strong>, our shiny new guide to TypeScript. With detailed <strong>code walkthroughs</strong>, hands-on examples and common gotchas. For developers who know enough <strong>JavaScript</strong> to be dangerous.</p>
<a data-instant href="/printed-books/typescript-in-50-lessons/" class="btn btn--green btn--large" style="">Jump to table of contents&nbsp;↬</a></div>
</div>
<div class="feature-panel-right-col"><a data-instant href="/printed-books/typescript-in-50-lessons/" class="feature-panel-image-link">
<div class="feature-panel-image"><picture><source type="image/avif" srcSet="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/2732dfe9-e1ee-41c3-871a-6252aeda741c/typescript-panel.avif" />
<img
    loading="lazy"
    decoding="async"
    class="feature-panel-image-img"
    src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/c2f2c6d6-4e85-449a-99f5-58bd053bc846/typescript-shop-cover-opt.png"
    alt="Feature Panel"
    width="481"
    height="698"
/>
</picture>
</div>
</a>
</div>
</aside>
</div>

<h2 id="row-level-security-rls">Row-Level Security (RLS)</h2>

<p>A ‘row’, in this case, refers to an entry in a database table. For example, in a <strong>posts</strong> table, a row would be a single <strong>article</strong>, check this <code>json</code> representation:</p>

<pre><code class="language-javascript">{
    "posts": [
        {
            "id": "article&#95;23495044",
            "title": "User Data Management",
            "content": "&lt;huge blob of text&gt;",
            "publishedAt": "2023-03-28",
            "author": "author&#95;2929292"
        },
        // ...
    ]
}
</code></pre>

<p>To understand RLS, each <code>object</code> inside <strong>posts</strong> is a ‘row’.</p>

<p>The above data is enough for creating a filter algorithm to effectively enforce row-level security. Nonetheless, it’s crucial for scalability and data handling that such <strong>relationship</strong> is defined on your data layer. This way, any service that connects to your database will have all the required information to implement its own access-control logic as required. So for the above example, the <strong>schema</strong> for the <strong>posts</strong> table would roughly look like the following:</p>

<pre><code class="language-javascript">{
    "posts": {
        "columns": [
            {
                "name": "id",
                "type": "string"
            },
            // ... other primitive types
            // establish relationship with "authors"
            {
                "name": "author",
                "type": "link",
                "link": "authors"
            }
        ]
    }
}
</code></pre>

<p>In the above example, we define the <code>type</code> of each value in our <strong>posts</strong> database and establish a <strong>relationship</strong> to the <strong>authors</strong> table. So each post will receive the <code>id</code> of one author. This is a one-to-many relationship: <strong>one</strong> author can have <strong>many</strong> posts.</p>

<p>Of course, there are patterns to define many-to-many relationships as well. Take, for example, a team’s backlog. You may want only members of a certain team to have access. In such case, you can create a list of users with access to a specific resource (and thus being very granular about it), or you can define a table for <strong>team</strong>, and thus connecting a <strong>team</strong> to multiple tasks, and a <strong>team</strong> to multiple users: this pattern is called a <strong>junction table</strong> and is great for defining <em>scoped access</em> within your data layer.</p>

<p>Now we understand what <strong>authorization</strong> is and looks like in a few cases. This should be enough to design a mental model for defining access to our data. We understand that in order to use the granular access to our data effectively, our app must be aware of <strong>which</strong> user is using that particular instance of the app (aka who’s behind the mouse).</p>

<div class="partners__lead-place"></div>

<h2 id="authentication">Authentication</h2>

<p>It is time to set up a reliable and cost-effective <strong>authentication.</strong> Cost-effective because it is counter-productive to re-authenticate the user on every request. And it increases the risk factor of attacks, so let’s keep auth requests to a minimum. The way our app stores the user credentials to re-use in a defined lifecycle is called a <strong>session</strong>.</p>

<p>There are multiple ways of authenticating users and handling sessions. I invite you to check Eric Burel’s article on “<a href="https://www.smashingmagazine.com/2023/01/authentication-websites-banking-analogy/">Authentication in Websites: A Banking Analogy</a>”. It’s a great and thorough explanation of how authentication works.</p>

<p>From this moment on, let’s assume we did our due diligence: username and password are securely stored, an authentication provider is able to reliably verify our user’s identity and returns a <code>session</code>, which is an object carrying a <code>userId</code> matching our user’s row in the database.</p>

<h2 id="connecting-the-dots">Connecting The Dots</h2>

<p>So now that we have established what it means and the requirements each moving piece brings in order to get it working, our goal is the following:</p>

<ol>
<li><strong>Authentication</strong><br />
The provider performs user authentication, the library creates a <code>session</code>, and the app receives that as a <code>payload</code> from the auth request.</li>
<li><strong>Resource request</strong><br />
Authenticated User performs request with <code>resourceId</code>; the app takes <code>userId</code> from <code>session</code>.</li>
<li><strong>Granting access</strong><br />
It filters all resources from the table to only the ones owned by <code>userId</code> and returns (if it exists) the one with <code>resourceId</code>.</li>
</ol>














<figure class="
  
  
  ">
  
    <a href="https://files.smashing.media/articles/access-handling-data-management-row-level-security/1-mental-model-acccess-row-level-security.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="352"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/access-handling-data-management-row-level-security/1-mental-model-acccess-row-level-security.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://files.smashing.media/articles/access-handling-data-management-row-level-security/1-mental-model-acccess-row-level-security.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://files.smashing.media/articles/access-handling-data-management-row-level-security/1-mental-model-acccess-row-level-security.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://files.smashing.media/articles/access-handling-data-management-row-level-security/1-mental-model-acccess-row-level-security.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://files.smashing.media/articles/access-handling-data-management-row-level-security/1-mental-model-acccess-row-level-security.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://files.smashing.media/articles/access-handling-data-management-row-level-security/1-mental-model-acccess-row-level-security.png"
			
			sizes="100vw"
			alt="Mental model for access handling"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      (<a href='https://files.smashing.media/articles/access-handling-data-management-row-level-security/1-mental-model-acccess-row-level-security.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>With the above mental model defined, it is possible to any sort of implementation and properly design your queries. For example, on our first defined schema (posts and authors), we can use filters on our fetching service to only provide access to the results a user should have:</p>

<pre><code class="language-javascript">async function getPostsByAuthor(authorId: string) {
    return sdk.db.posts
        .filter({
            author: authorId
        })
        .getPaginated()
}
</code></pre>

<p>This contrived snippet is just to exemplify a bare-bones RLS implementation. Maybe as a food-for-thought so you can build upon it.</p>

<div class="partners__lead-place"></div>

<h2 id="conclusion">Conclusion</h2>

<p>Hopefully, these concepts have offered extra clarity on defining access management to private and/or sensitive data. It’s important to note that there are security concerns before and around storing such kind of data which were beyond the scope of this article. As a general rule: <strong>store as little as you need and provide only the necessary amount of access to data</strong>. The least sensible data going over the wire or being stored by your app, the lesser the chance your app is a target or victim of attacks or leaks.</p>

<p>Let me know your questions or feedback in the comment section or on <a href="https://twitter.com/intent/follow?screen_name=atilafassina">Twitter</a>.</p>

<div class="signature">
  <img src="https://www.smashingmagazine.com/images/logo/logo--red.png" alt="Smashing Editorial" width="35" height="46" loading="lazy" decoding="async" />
  <span>(yk)</span>
</div>


              </article>
            </body>
          </html>
        ]]></content:encoded></item><item><author>Eric Burel</author><title>Understanding Authentication In Websites: A Banking Analogy</title><link>https://www.smashingmagazine.com/2023/01/authentication-websites-banking-analogy/</link><pubDate>Mon, 09 Jan 2023 09:00:00 +0000</pubDate><guid>https://www.smashingmagazine.com/2023/01/authentication-websites-banking-analogy/</guid><description>There is a strange ritual that web developers around the world have been perpetuating from the dawn of computers to modern days. This ritual is the implementation of authentication. This article is Eric Burel’s attempt at making this ritual less obscure. You’ll learn about tokens, authorization, CORS, credentials, HTTP headers, and such. It shouldn’t have to take a wizard to implement a good authentication system. Just a good banker!</description><content:encoded><![CDATA[
          <html>
            <head>
              <meta charset="utf-8">
              <link rel="canonical" href="https://www.smashingmagazine.com/2023/01/authentication-websites-banking-analogy/" />
              <title>Understanding Authentication In Websites: A Banking Analogy</title>
            </head>
            <body>
              <article>
                <header>
                  <h1>Understanding Authentication In Websites: A Banking Analogy</h1>
                  
                    
                    <address>Eric Burel</address>
                  
                  <time datetime="2023-01-09T09:00:00&#43;00:00" class="op-published">2023-01-09T09:00:00+00:00</time>
                  <time datetime="2023-01-09T09:00:00&#43;00:00" class="op-modified">2026-02-09T03:03:08+00:00</time>
                </header>
                
                

<p>There is a strange ritual that web developers around the world have been perpetuating from the dawn of computers to modern days. Without this ritual, the web application cannot really exist. It is not “ready to go live,” a web developer would say. This ritual is the implementation of authentication.</p>

<p>You may have been through this ritual multiple times. But do you <em>really</em> understand what is happening?</p>

<p>This article is my attempt at making this ritual less obscure. It shouldn’t have to take a wizard to implement a good authentication system. Just a good banker!</p>

<h2 id="your-password-matched-now-what">Your Password Matched. Now What?</h2>

<p><strong>Authentication is the process of attributing a given request to a unique entity</strong>, usually a person. It then enables authorization, the process of allowing (or not) said person to access a resource, be it a web page or an API endpoint.</p>

<p>I will focus on the part I’ve always found the most difficult to understand: what happens after the user just submitted the login form and their credentials were confirmed as valid by the backend.</p>

<pre><code class="language-javascript">  app.post("/login", async (request, response) =&gt; {
    const { body } = request;
    const user = await getUserByCredentials(body.username, body.password);
    if (user) {
      // NOW WHAT???
    }
</code></pre>

<p><em>Your typical login endpoint. This article is about what happens afterward.</em></p>

<p>We are going to talk about tokens, CORS, cookies, and headers. Those concepts are sometimes quite abstract. To make them more real, I’ll take a shot at a banking analogy.</p>

<h2 id="authentication-relies-on-tokens-like-banks-rely-on-money">Authentication Relies On Tokens Like Banks Rely On Money</h2>

<p>Let’s consider two common patterns:</p>

<ul>
<li><strong>JSON Web Tokens aka JWT.</strong><br />
It’s an open standard. You’ll find useful resources at the bottom of this article if you want to go further.</li>
<li><strong>Session-based authentication.</strong><br />
It’s a pattern more than a standard. So the implementation may vary, but I’ll try to give an overview of how it works.</li>
</ul>

<p>As a front-end developer, you may have no control over this design decision, so it’s important that you understand how both work.</p>

<p>As a full-stack or backend developer, you have control over this choice, so it’s even more important that you understand what you are doing. I mean, it’s kinda your job :)</p>

<h3 id="a-jwt-is-like-a-banknote">A JWT Is Like A Banknote</h3>

<p>With <strong>JSON Web Token-based authentication (JWT)</strong>, during the login step, the server will pass the client a token that contains encrypted information, a “claim.” When the client makes a request, they pass this token alongside the request.</p>

<p>The server verifies that this token is indeed a valid token that it itself generated earlier. Then the server reads the token payload to tell who you are, based on a user ID, username, email, or whatever the payload is. Finally, it can authorize or refuse access to the resource.</p>

<p>Think of tokens as banknotes. A banker can print new banknotes like a server can create tokens. Money lets you buy things, or if I rephrase, it lets you access paid goods and services. The JWT lets you access secure services the same way.</p>














<figure class="
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/4de02b2c-1f33-4239-80f5-ee8264c76fcc/4-authentication-websites-banking-analogy.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="275"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/4de02b2c-1f33-4239-80f5-ee8264c76fcc/4-authentication-websites-banking-analogy.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/4de02b2c-1f33-4239-80f5-ee8264c76fcc/4-authentication-websites-banking-analogy.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/4de02b2c-1f33-4239-80f5-ee8264c76fcc/4-authentication-websites-banking-analogy.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/4de02b2c-1f33-4239-80f5-ee8264c76fcc/4-authentication-websites-banking-analogy.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/4de02b2c-1f33-4239-80f5-ee8264c76fcc/4-authentication-websites-banking-analogy.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/4de02b2c-1f33-4239-80f5-ee8264c76fcc/4-authentication-websites-banking-analogy.png"
			
			sizes="100vw"
			alt="A JWT banknote from the Foobar Bank of Informatica"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      A JWT banknote from the Foobar Bank of Informatica. (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/4de02b2c-1f33-4239-80f5-ee8264c76fcc/4-authentication-websites-banking-analogy.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>If you want to use your money, either at the bank to credit your account or in a store, people will double-check that your banknotes are real. A real banknote is one that has been created by the bank itself. When the banknote is confirmed to be legit, they can read the value on it to tell how many things you can buy.</p>

<p>JWTs work the same, the server can verify that they indeed created this token earlier, so it’s a real one, and then they can read the payload it contains to confirm who you are and what your permissions are.</p>

<p>Revoking a token can be hard. The server has to maintain a list of blacklisted tokens that are no longer valid, like the bank would need to list robbed banknotes’ unique numbers.</p>

<h3 id="session-based-authentication-is-like-a-credit-card">Session-Based Authentication Is Like A Credit Card</h3>

<p>From the front-end developer standpoint, the main difference between JWT and session-based authentication lies in what the server will return in case of a successful login.</p>

<p>In session-based authentication, instead of having a claim full of user information, you just get a “session id.”</p>

<p>From the backend developer’s standpoint, session-based authentication involves an additional database collection or table to store the sessions. A session is just an object very similar to the JWT, which can contain, for instance, a user id and an expiration date.</p>

<p>This means that the server keeps a lot of control over the authentication. It can log a user out by removing the session from the database, whereas it cannot destroy JWTs, since it doesn’t store them.</p>

<p>Session-based authentication is comparable to credit cards. You go to the bank to open your account. The banker will check your id and issue a credit card with an expiration date. This is the authentication process.</p>














<figure class="
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/0e052982-8dc7-4766-a1a9-f12286682c05/1-authentication-websites-banking-analogy.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="389"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/0e052982-8dc7-4766-a1a9-f12286682c05/1-authentication-websites-banking-analogy.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/0e052982-8dc7-4766-a1a9-f12286682c05/1-authentication-websites-banking-analogy.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/0e052982-8dc7-4766-a1a9-f12286682c05/1-authentication-websites-banking-analogy.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/0e052982-8dc7-4766-a1a9-f12286682c05/1-authentication-websites-banking-analogy.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/0e052982-8dc7-4766-a1a9-f12286682c05/1-authentication-websites-banking-analogy.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/0e052982-8dc7-4766-a1a9-f12286682c05/1-authentication-websites-banking-analogy.png"
			
			sizes="100vw"
			alt="A credit card with the session id instead of a credit card number"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      Session id is like a credit card number: its value depends on the data stored at the Foobar Bank. (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/0e052982-8dc7-4766-a1a9-f12286682c05/1-authentication-websites-banking-analogy.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>The credit card itself has barely any value: it’s just plastic and a microchip whose purpose is to uniquely identify your account. It can easily be revoked by the bank, usually after a certain period of time, but also when you declare your card stolen.</p>

<p>When you want to pay for something, the store will communicate with your bank to check that your credit card is valid and has a positive balance.</p>

<p>When you access an authenticated resource, the server will check if the session id matches an open session and then if this session matches a user that is authorized to access this resource.</p>

<div data-audience="non-subscriber" data-remove="true" class="feature-panel-container">

<aside class="feature-panel" style="">
<div class="feature-panel-left-col">

<div class="feature-panel-description"><p><p>Meet <a data-instant href="/the-smashing-newsletter/"><strong>Smashing Email Newsletter</strong></a> with useful tips on front-end, design &amp; UX. Subscribe and <strong>get “Smart Interface Design Checklists”</strong> &mdash; a <strong>free PDF deck</strong> with 150+ questions to ask yourself when designing and building almost <em>anything</em>.</p><div><section class="nlbf"><form action="//smashingmagazine.us1.list-manage.com/subscribe/post?u=16b832d9ad4b28edf261f34df&amp;id=a1666656e0" method="post"><div class="nlbwrapper"><label for="mce-EMAIL-hp" class="sr-only">Your (smashing) email</label><div class="nlbgroup"><input type="email" name="EMAIL" class="nlbf-email" id="mce-EMAIL-hp" placeholder="Your email">
<input type="submit" value="Meow!" name="subscribe" class="nlbf-button"></div></div></form><style>.c-garfield-the-cat .nlbwrapper{margin-bottom: 0;}.nlbf{display:flex;padding-bottom:.25em;padding-top:.5em;text-align:center;letter-spacing:-.5px;color:#fff;font-size:1.15em}.nlbgroup:hover{box-shadow:0 1px 7px -5px rgba(50,50,93,.25),0 3px 16px -8px rgba(0,0,0,.3),0 -6px 16px -6px rgba(0,0,0,.025)}.nlbf .nlbf-button,.nlbf .nlbf-email{flex-grow:1;flex-shrink:0;width:auto;margin:0;padding:.75em 1em;border:0;border-radius:11px;background:#fff;font-size:1em;box-shadow:none}.promo-box .nlbf-button:focus,.promo-box input.nlbf-email:active,.promo-box input.nlbf-email:focus{box-shadow:none}.nlbf-button:-ms-input-placeholder,.nlbf-email:-ms-input-placeholder{color:#777;font-style:italic}.nlbf-button::-webkit-input-placeholder,.nlbf-email::-webkit-input-placeholder{color:#777;font-style:italic}.nlbf-button:-ms-input-placeholder,.nlbf-button::-moz-placeholder,.nlbf-button::placeholder,.nlbf-email:-ms-input-placeholder,.nlbf-email::-moz-placeholder,.nlbf-email::placeholder{color:#777;font-style:italic}.nlbf .nlbf-button{transition:all .2s ease-in-out;color:#fff;background-color:#0168b8;font-weight:700;box-shadow:0 1px 1px rgba(0,0,0,.3);width:100%;border:0;border-left:1px solid #ddd;flex:2;border-top-left-radius:0;border-bottom-left-radius:0}.nlbf .nlbf-email{border-top-right-radius:0;border-bottom-right-radius:0;width:100%;flex:4;min-width:150px}@media all and (max-width:650px){.nlbf .nlbgroup{flex-wrap:wrap;box-shadow:none}.nlbf .nlbf-button,.nlbf .nlbf-email{border-radius:11px;border-left:none}.nlbf .nlbf-email{box-shadow:0 13px 27px -5px rgba(50,50,93,.25),0 8px 16px -8px rgba(0,0,0,.3),0 -6px 16px -6px rgba(0,0,0,.025);min-width:100%}.nlbf .nlbf-button{margin-top:1em;box-shadow:0 1px 1px rgba(0,0,0,.5)}}.nlbf .nlbf-button:active,.nlbf .nlbf-button:focus,.nlbf .nlbf-button:hover{cursor:pointer;color:#fff;background-color:#0168b8;border-color:#dadada;box-shadow:0 1px 1px rgba(0,0,0,.3)}.nlbf .nlbf-button:active,.nlbf .nlbf-button:focus{outline:0!important;text-shadow:1px 1px 1px rgba(0,0,0,.3);box-shadow:inset 0 3px 3px rgba(0,0,0,.3)}.nlbgroup{display:flex;box-shadow:0 13px 27px -5px rgba(50,50,93,.25),0 8px 16px -8px rgba(0,0,0,.3),0 -6px 16px -6px rgba(0,0,0,.025);border-radius:11px;transition:box-shadow .2s ease-in-out}.nlbwrapper{display:flex;flex-direction:column;justify-content:center}.nlbf form{width:100%}.nlbf .nlbgroup{margin:0}.nlbcaption{font-size:.9em;line-height:1.5em;color:#fff;border-radius:11px;padding:.5em 1em;display:inline-block;background-color:#0067b859;text-shadow:1px 1px 1px rgba(0,0,0,.3)}.wf-loaded-stage2 .nlbf .nlbf-button{font-family:Mija}.mts{margin-top: 5px !important;}.mbn{margin-bottom: 0 !important;}</style></section><p class="mts mbn"><small class="promo-box__footer mtm block grey"><em>Once a week. Useful tips on <a href="https://www.smashingmagazine.com/the-smashing-newsletter/">front-end &amp; UX</a>. Trusted by 207.000 friendly folks.</em></small></p></div></p>
</div>
</div>
<div class="feature-panel-right-col">
<div class="feature-panel-image">
<img
    loading="lazy"
    decoding="async"
    class="feature-panel-image-img"
    src="/images/smashing-cat/cat-firechat.svg"
    alt="Feature Panel"
    width="310"
    height="400"
/>

</div>

<p></div>
</aside>
</div></p>

<h2 id="tokens-are-as-precious-as-banknotes-and-credit-cards-don-t-get-them-stolen">Tokens Are As Precious As Banknotes And Credit Cards. Don’t Get Them Stolen!</h2>

<p>It’s easy for companies and banks to store money. They have those big reinforced-steel safes with alarms and sometimes even dragons. Likewise, it’s easy for servers to talk securely to one another.</p>

<p>But websites are like private persons. They can’t have dragons, so they have to imagine specific approaches to store their precious tokens.</p>

<h3 id="where-do-you-store-your-money">Where Do You Store Your Money?</h3>

<p>Whatever the pattern you pick to authenticate users, JSON web tokens and session ids are precious things. In the remainder of this article, I will treat them similarly, apart from a few technical subtleties. I’ll call either of them the “authentication token,” the thing you show the server to prove that you are authenticated, like money for paying stuff.</p>

<p>Since you have to pass the token alongside every request you make to the server &mdash; you need to store it somewhere on the client side.</p>

<p>Here, I’d like to focus more specifically on the case of websites, where the web browser is in charge of sending the requests. You’ll find many articles and documentation in the wild that do not clarify whether they apply to server-server communication or browser-server. The latter is a trickier, uncontrolled context that deserves its own specific patterns.</p>

<p>So, the banker just handed you either a new credit card or a bunch of banknotes. Where do you stash them? In a compartment concealed in the heel of your shoe, in your mailbox, beneath your mattress, or maybe, in your fancy fanny pack?</p>

<h3 id="not-all-requests-are-born-equal-loading-a-web-page-vs-calling-an-api">Not All Requests Are Born Equal: Loading A Web Page vs. Calling An API</h3>

<p>We can divide authenticated content into two categories: web pages and API endpoints. From a technical standpoint, both are server endpoints. The former returns HTML content or files, the latter &mdash; any kind of content, often JSON data. They differ in the way they are consumed.</p>

<p>Web pages are accessed via a web browser that triggers GET requests automatically, depending on the current URL.</p>

<p>APIs are called using JavaScript code. This reliance on APIs and JavaScript is at the core of the Jamstack, REST, and Single-Page-Application philosophies.</p>

<p>Thus, let’s differentiate two use cases:</p>

<ol>
<li>You want to <strong>secure access to the web page</strong> itself. Meaning the user can’t even see the structure of your page or any HTML.</li>
<li>You want to <strong>secure calls from your web page to your API</strong>. Anyone can see your web page structure, but they can’t get any data.</li>
</ol>

<p>If you combine both, unauthenticated users can’t see the page structure and can’t get any data from your API.</p>

<h3 id="use-case-1-securing-a-web-page-access-with-cookies">Use Case 1: Securing A Web Page Access With Cookies</h3>

<p>I’ll cut it short, to secure web page access, you have no other choice but to use cookies, ideally HTTP-Only, secure cookies.</p>














<figure class="
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/ffc9abe1-eead-40d3-b3c9-6e74ba5e9a01/3-authentication-websites-banking-analogy.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="521"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/ffc9abe1-eead-40d3-b3c9-6e74ba5e9a01/3-authentication-websites-banking-analogy.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/ffc9abe1-eead-40d3-b3c9-6e74ba5e9a01/3-authentication-websites-banking-analogy.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/ffc9abe1-eead-40d3-b3c9-6e74ba5e9a01/3-authentication-websites-banking-analogy.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/ffc9abe1-eead-40d3-b3c9-6e74ba5e9a01/3-authentication-websites-banking-analogy.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/ffc9abe1-eead-40d3-b3c9-6e74ba5e9a01/3-authentication-websites-banking-analogy.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/ffc9abe1-eead-40d3-b3c9-6e74ba5e9a01/3-authentication-websites-banking-analogy.png"
			
			sizes="100vw"
			alt="An iconic wallet containing a session id and a JWT"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      An iconic wallet containing a session id and a JWT. (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/ffc9abe1-eead-40d3-b3c9-6e74ba5e9a01/3-authentication-websites-banking-analogy.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>From a technical standpoint, a cookie is a piece of data that should be sent alongside every request to a specific domain. They are part of the HTTP protocol.</p>

<p>That’s a pretty broad scope. When a website cookie popup differentiates “essential cookies” from other cookies, those essential cookies are often dedicated to authentication. The others are just a way to keep track of the product pages you’ve visited to later shove them in your face to the point of literally optimizing the billboard displays in your neighborhood as if you really, really wanted to buy two freezers within the same month.</p>

<p>Setting a cookie is possible in both directions. Client-side JavaScript can set cookies to be sent to the server. That’s how advertisement tracking works (though GDPR is forcing advertisers to use server-side logic more and more these days).</p>

<p>But the server can also tell the browser to store a cookie using the <code>Set-Cookie</code> header in the response.</p>

<p>This convenient feature lets the backend set what we call “HTTP-only” cookies: cookies that cannot be read by JavaScript. And “secure” cookies are only set through HTTPS for better security.</p>

<p><strong>Important note</strong>: <em>Using HTTP-only cookies prevents XSS attacks (script injection to steal the token) but not CSRF attacks (forging requests on behalf of your authenticated users, basically impersonating them). You need to combine multiple strategies to parry all possible attacks. I invite you to read more on these topics if you manage a non-trivial website.</em></p>

<p>During the authentication process, the <code>Set-Cookie</code> header should be used in response to the “login” request so the client becomes authenticated via a token.</p>














<figure class="
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/588a49e9-4e23-4962-926f-f0a5325195f3/5-authentication-websites-banking-analogy.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="217"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/588a49e9-4e23-4962-926f-f0a5325195f3/5-authentication-websites-banking-analogy.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/588a49e9-4e23-4962-926f-f0a5325195f3/5-authentication-websites-banking-analogy.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/588a49e9-4e23-4962-926f-f0a5325195f3/5-authentication-websites-banking-analogy.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/588a49e9-4e23-4962-926f-f0a5325195f3/5-authentication-websites-banking-analogy.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/588a49e9-4e23-4962-926f-f0a5325195f3/5-authentication-websites-banking-analogy.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/588a49e9-4e23-4962-926f-f0a5325195f3/5-authentication-websites-banking-analogy.png"
			
			sizes="100vw"
			alt="A Set-Cookie header in the response of the login request"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      A <code>Set-Cookie</code> header in the response of the login request, as seen in browser development tools. The browser will automatically store this cookie. Since it’s HTTP-only, JavaScript can’t read it; it’s only handled by the browser directly. (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/588a49e9-4e23-4962-926f-f0a5325195f3/5-authentication-websites-banking-analogy.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>Cookies are like a wallet. You can store fidelity cards in it and a picture of your cat, but also duller things, like your money. It’s in your pocket or your handbag, so it’s hard to access for other people (HTTP-only, no JavaScript access) if you don’t take it out in unsafe places (secure). Yet, you always have your token with you if needed.</p>














<figure class="
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/e19a0377-4a0b-420f-a9a2-357fbdf0c170/9-authentication-websites-banking-analogy.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="104"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/e19a0377-4a0b-420f-a9a2-357fbdf0c170/9-authentication-websites-banking-analogy.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/e19a0377-4a0b-420f-a9a2-357fbdf0c170/9-authentication-websites-banking-analogy.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/e19a0377-4a0b-420f-a9a2-357fbdf0c170/9-authentication-websites-banking-analogy.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/e19a0377-4a0b-420f-a9a2-357fbdf0c170/9-authentication-websites-banking-analogy.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/e19a0377-4a0b-420f-a9a2-357fbdf0c170/9-authentication-websites-banking-analogy.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/e19a0377-4a0b-420f-a9a2-357fbdf0c170/9-authentication-websites-banking-analogy.png"
			
			sizes="100vw"
			alt="The cookie displayed in your browser development tools, after being set"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      The cookie displayed in your browser development tools, after being set. It is NOT available to JavaScript code! A successful script injection cannot steal your users’ tokens, but be careful about other types of attacks like CSRF. Here the cookie is not ‘secure’ because I am in <code>localhost</code> mode. (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/e19a0377-4a0b-420f-a9a2-357fbdf0c170/9-authentication-websites-banking-analogy.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>Browsers rely a lot on cookies, and they send them automatically alongside every request they trigger as long as the domain and path match, so you don’t have to worry about them. If you carry your wallet with you anytime you go out, you’re always ready to pay.</p>














<figure class="
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/8bdba247-4fa0-4ba7-9a10-9fb89b2e5146/8-authentication-websites-banking-analogy.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="248"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/8bdba247-4fa0-4ba7-9a10-9fb89b2e5146/8-authentication-websites-banking-analogy.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/8bdba247-4fa0-4ba7-9a10-9fb89b2e5146/8-authentication-websites-banking-analogy.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/8bdba247-4fa0-4ba7-9a10-9fb89b2e5146/8-authentication-websites-banking-analogy.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/8bdba247-4fa0-4ba7-9a10-9fb89b2e5146/8-authentication-websites-banking-analogy.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/8bdba247-4fa0-4ba7-9a10-9fb89b2e5146/8-authentication-websites-banking-analogy.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/8bdba247-4fa0-4ba7-9a10-9fb89b2e5146/8-authentication-websites-banking-analogy.png"
			
			sizes="100vw"
			alt="The ‘Cookie’ header which is added automatically to the request emitted by the browser during navigation"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      The <code>Cookie</code> header is added automatically to the request emitted by the browser during navigation, as long as the domain and path are matching. (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/8bdba247-4fa0-4ba7-9a10-9fb89b2e5146/8-authentication-websites-banking-analogy.png'>Large preview</a>)
    </figcaption>
  
</figure>

<h3 id="use-case-2-securing-api-calls-the-cookie-scenario">Use Case 2: Securing API Calls. The Cookie Scenario</h3>

<p>Now, let’s authenticate calls to our API, which feeds the website with data. The easiest option would be to use a cookie, as we did in the previous section, to secure web pages. But contrary to the web page, there is also another option &mdash; using web storage. Which one is the most suited is debatable. Let me start with cookies.</p>

<p>The cookie that contains the auth token is sent automatically alongside requests triggered by the browser when you navigate a website or when you submit a form.</p>

<p>But requests triggered by JavaScript code do not fall into this category. When you trigger a request programmatically, you need a bit more configuration to send cookies.</p>

<p>Remember that the cookie should be HTTP-only, so you can’t read the cookie content with JavaScript nor inject your token in the <code>Authorization</code> header. You could do that with a cookie that is not HTTP-only, but then using a cookie doesn’t make sense in the first place.</p>

<p>All existing libraries capable of sending requests have to be based on the browser JavaScript API  aka the “Browser Object Model,” which means either <code>XMLHttpRequest</code> or <code>fetch</code>. You have to rely on their configuration to enable sending HTTP-only cookies alongside the request.</p>

<p>In the case of <code>fetch</code>, this option is named <code>credentials</code>. Hopefully, for you, fellow front-end developers, it’s very easy to use.</p>

<pre><code class="language-javascript">fetch(
"http://localhost:8000/account/signup", 
{ 
  method: "POST",
  body: JSON.stringify({username:"foo", password:"barbar"}), 
  // This will include credentials (here, cookies) in the request
  credentials: "include"
})
</code></pre>

<p>With XHR, the option is named <code>withCredentials</code> and behaves similarly.</p>

<p><strong>Note</strong>: <em>Your server must also confirm that it indeed accepts credentials by setting the <code>Access-Control-Allow-Credentials</code> header to true in the responses. This option is symmetrical. It controls both sending cookies to the server, but also accepting the <code>Set-Cookie</code> header from it. So don’t forget to set it to true for the call to the login endpoint.</em></p>

<p>If the <code>credentials</code> option is not set and the server answers with a <code>Set-Cookie</code> header… the browser will silently ignore this attempt to set the cookie without even a warning. When this happens, start by double-checking your <code>credentials</code> option and then CORS if applicable (see next section).</p>

<p>Oops, I’ve almost forgotten your banking analogy! It’s a tough one but let’s say that you probably have your credit card or a few banknotes always there in your wallet. But some services expect a prepaid card, and you may need to explicitly remember to take them with you. <em>That’s the best analogy I could achieve. Comment if you can do better!</em></p>

<h3 id="return-of-use-case-2-securing-api-calls-the-web-storage-scenario">Return Of Use Case 2: Securing API Calls. The Web Storage Scenario</h3>

<p>Remember, I said earlier that for API calls, you have the choice to either store the token in an HTTP-only cookie, like you would do to secure a web page, or to store the token in the web storage. By web storage, we mean either <code>sessionStorage</code> or <code>localStorage</code>.</p>

<p>I’ve seen and used both approaches, cookies and web storage, but I sincerely don’t have the expertise to assert that one is better than the other. I’ll stick to describing how it works so you can make an enlightened decision.</p>

<p>Codewise, they are much easier to use than HTTP-only cookies because web storage is available to JavaScript code. You can get the token from the login response payload, store it in <code>localStorage</code>, and insert it into the <code>Authorization</code> header in later requests. You have full control of the process without relying on some implicit browser behavior.</p>

<pre><code class="language-javascript">headers: {
    “Authorization”: `Bearer ${window.localStorage.get(“auth_token”)}`
}
</code></pre>

<p>Web storage is immune to certain attacks, namely Cross-Site Request Forgery. That’s because, contrary to cookies, they are not automatically tied to requests, so an attacker will have trouble forcing you to give your token. Think of a piggy bank. You can’t just get money out of it. It’s, however, very sensitive to script injection, where an attacker manages to run JavaScript and reads the token.</p>

<p>Therefore, if you go the web storage way, you’ll want to explore strategies that prevent XSS attacks from happening in the first place.</p>

<h3 id="jwt-specifics-what-information-they-should-contain-and-how-to-handle-the-refresh-token">JWT Specifics: What Information They Should Contain And How To Handle The Refresh Token</h3>

<p>You should avoid storing critical information in a JSON web token, even when using HTTP-only cookies. If someone still manages to steal and decrypt the token, they will be able to impersonate the user, but at least they won’t be able to get much information from the token itself.</p>

<p>You can afford to lose a five-dollar banknote; it’s more problematic to lose a $5,000 banknote. By the way, if such a thing as a $5,000 banknote exists, please send me a specimen to prove it. Thank you.</p>

<p>JWTs are meant to be short-lived, like banknotes, which would wear quickly when used a lot. Since they are hard to revoke, giving them 5-minute lifetime guarantees that even a stolen JWT token cannot be a big problem.</p>

<p>Since you don’t want the user to log in again every 5 minutes, the token can be combined with a longer-lived refresh token. This second token can be used to get a new JWT.</p>

<p>A best practice is to store the refresh token in a cookie on a very specific path like <code>/refresh</code> (so it’s not sent with all requests, contrary to the JWT) and to make it a one-time-only token.</p>

<p>A refresh token is like bringing your ID card to get more money from your bank account. You don’t do that often, and you probably want to store your ID even more safely than your banknotes.</p>

<div class="partners__lead-place"></div>

<h2 id="cors-is-how-shops-communicate-with-their-bank">CORS Is How Shops Communicate With Their Bank</h2>

<p>Formally, CORS (Cross-Origin Resource Sharing) is a protocol used by servers in order to instruct browsers to selectively relax some of the Same-Origin Policy (SOP) restrictions on network access for some trusted clients.</p>

<p>Less formally, the server can tell your browser that the request you send is legit based on the request’s origin. If the server says it’s not legit, the browser won’t send the request.</p>

<p>For instance, <code>https://www.foobar.com</code>, <code>https://qarzed.fake</code>, and <code>http://localhost:8080</code> are possible origins. The port and protocol matter.</p>

<p>An API hosted on <code>https://api.foobar.com</code> will most often allow requests only from <code>https://www.foobar.com</code> and <code>https://mobile.foobar.com</code>.</p>

<p>I will focus here on API calls triggered with <code>fetch</code> in JavaScript, and only if the API lives in another Web origin. CORS also affects more advanced use cases like embedding images from another website in your own website, iframe, navigating from one site to another, and so on, but that’s beyond the scope of authentication per se.</p>

<p>Websites are like stores. People can enter them and try to buy things. But the store also has its own complicated internal back office logic. Namely, it relies on a bank to process payments.</p>

<p>Any shop owner can try to connect to any bank. Any website can try to connect to any API. But the payment won’t be processed by the bank if they don’t have a company account there.</p>














<figure class="
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/23751d53-0163-4d34-92ee-3ab34ff70461/7-authentication-websites-banking-analogy.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="422"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/23751d53-0163-4d34-92ee-3ab34ff70461/7-authentication-websites-banking-analogy.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/23751d53-0163-4d34-92ee-3ab34ff70461/7-authentication-websites-banking-analogy.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/23751d53-0163-4d34-92ee-3ab34ff70461/7-authentication-websites-banking-analogy.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/23751d53-0163-4d34-92ee-3ab34ff70461/7-authentication-websites-banking-analogy.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/23751d53-0163-4d34-92ee-3ab34ff70461/7-authentication-websites-banking-analogy.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/23751d53-0163-4d34-92ee-3ab34ff70461/7-authentication-websites-banking-analogy.png"
			
			sizes="100vw"
			alt="Illustration which says that we only accept tokens from Foobar Bank"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      A store (a website) should only communicate with banks (APIs) they work with. Other banks will politely reject their requests. Note: this strategy is not enough to secure a server; CORS can be bypassed by attackers. (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/23751d53-0163-4d34-92ee-3ab34ff70461/7-authentication-websites-banking-analogy.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>Likewise, if you host the website on <code>www.foobar.com</code> and the API on <code>www.foobar.com/api</code>, there is one origin only <code>www.foobar.com</code>. No need for CORS because there is no “cross-origin” call involved. You’ll need to bother about CORS if, instead, you host the API on <code>api.foobar.com</code>. We have two distinct origins, <code>api.foobar.com</code> and <code>www.foobar.com</code>.</p>

<p>This also applies to using different ports on <code>localhost</code> during development. The IP <code>127.0.0.1</code> is even different from <code>localhost</code>, as origins are compared directly as strings and not based on their actual IP address.</p>

<p>Some big companies, like car sellers, have their own internal bank. It’s easier for them to communicate with this bank if it’s literally located in the same office. They are like full-stack monolithic applications.</p>

<p>But if this internal bank is located in a different country (API separate from the website), this doesn’t work anymore. It could as well be a traditional bank with multiple clients (a third-party API). CORS is needed either way.</p>

<p>CORS is a concept specific to browser-server communication. When a server talks to another server, the Same-Origin Policy doesn’t apply. The API may either block those requests with no origin completely or, on the contrary, accept them, or filter them based on IP and so on.</p>

<p>Banks have specific patterns of communicating with each other that are different from how they communicate with their client companies.</p>

<h3 id="a-polite-cross-origin-discussion-between-a-server-and-a-client-using-preflight-requests">A Polite Cross-origin Discussion Between A Server And A Client, Using Preflight Requests</h3>

<p>Here’s a more concrete vision of what happens during a cross-origin request and how the server response headers should be set.</p>

<p>From the browser standpoint, whenever a website sends a “non-simple” request to an API, the browser will first send a preflight request. It’s a request to the same URL but using the OPTIONS method, which is dedicated to checking whether you can actually consume this API endpoint.</p>

<p>Fetching JSON data falls into this “non-simple” category in standard browsers, as well as calling your login endpoint if the auth API doesn’t live on the same domain as your website, so this step is extremely important.</p>

<p>The server receives this request, which includes an Origin header. It checks its own list of accepted origins. If the origin is allowed, it will respond with the right <code>Access-Control-Allow-Origin</code> header.</p>

<p>This server header should match the website’s origin. It can also be a wildcard <code>*</code> if the API is totally open, but that works only for requests without credentials, so forget about this if your API requires authentication.</p>

<p>If the response header doesn’t match, the browser will trigger an error at this point because they already know that they can’t call this API. Otherwise, they will keep going and send the actual request.</p>

<p>A store (the API) can decide to accept only certain types of credit cards. Some stores accept only their own card, and they don’t even use CORS (same-origin scenario). Some stores accept only Visa or Mastercards (cross-origin scenario). The cashier (the browser) won’t let you pay if they are told your card is not accepted by the store.</p>

<p>There are a few other <code>Access-Control</code> headers that provide more information, like accepted methods or headers. <code>Allow-Origin</code> is the most basic one, as well as <code>Allow-Credentials</code>, so cookies and <code>Set-Cookie</code> headers are properly enabled when using <code>fetch</code>.</p>

<pre><code class="language-javascript">Access-control-allow-origin: https://www.foobar.com
Access-control-allow-credentials: true
</code></pre>

<p><em>Expected response headers for an authenticated call (or the “login” form submission) if the website lives on <code>https://www.foobar.com</code> and the API is on another domain or port.</em></p>

<p><strong>Note</strong>: <em>The server specifies the CORS policy, and the browser enforces it. If suddenly everyone used an unsafe browser run by pirates, they could swarm your server with forged requests. Hopefully, people usually don’t use a shady browser they found in a USB key itself found lying on the ground of a dark alley at 3 am.</em></p>

<p>The header things and the browser behavior are just politeness. The browser is an excessively polite software. It will never spam the server with requests that will be rejected anyway. And it won’t talk to rude servers that don’t set the proper headers. That’s why the <code>Accept-Control-Allow-Origin</code> response header must be correctly set for cross-origin requests to work.</p>

<p>Before going as far as aiming a customer with a shotgun, the banker will probably tell you, “sir, you entered the wrong bank office,” and the customer will probably answer, “oh, sorry, my mistake. I will leave immediately!”.</p>

<h3 id="cookies-or-not-cookies-the-samesite-option">Cookies Or Not Cookies: The SameSite Option</h3>

<p>Setting the <code>credentials</code> attribute in your <code>fetch</code> request is not enough for sending the cookie, plus it doesn’t apply to pages, only to programmatic requests. The <code>SameSite</code> attribute of cookies lets you configure when a cookie should be sent, depending on the current site.</p>

<p>The concept of “Site” is slightly different from the concept of domain:</p>

<ul>
<li><code>https://api.foobar.com</code> and <code>https://www.foobar.com</code> are 2 different domains.</li>
<li>They are, however, the same site. Nowadays, the scheme matters, too (HTTP vs. HTTPS).</li>
<li>There is an exception to this rule, e.g., in multi-tenant architectures: <code>foo.github.io</code> and <code>bar.github.io</code> will be different sites despite having the same domain, and the server owner can configure that to their will.</li>
</ul>

<p>If the <code>Access-control</code> response headers are correctly set, and the preflight request succeeds, the browser will proceed with the actual request.</p>

<p>But if <code>SameSite</code> is not set with the right value in the cookie containing the authentication token, this cookie won’t be sent to the server. When loading a page, you will be considered unauthenticated by the server just because it literally doesn’t have your cookie.</p>

<p>The <code>SameSite</code>: <code>Lax</code> value is usually the most appropriate. It will only send cookies to the same site but also when the user comes from another site and is redirected to your page (only for top-level navigations). This is the current default in most browsers.</p>

<p>With <code>SameSite</code>: <code>Lax</code>, the website <code>www.foobar.com</code> will automatically include the authentication cookie when it sends requests to <code>api.foobar.com</code>, which is part of the same site. Authentication will work as expected.</p>

<h3 id="sec-fetch-helps-detecting-cross-origin-requests-but-are-not-standard-yet">Sec-Fetch Helps Detecting Cross-origin Requests But Are Not Standard Yet</h3>

<p>Related to CORS, you may also hear about the <code>Sec-Fetch</code> request headers. They provide information about the request context to the server. For instance, if <code>Sec-Fetch-Site</code> is <code>same-origin</code>, there is no need to check the Origin header. It’s slightly more intuitive than manually checking the request origin against predefined rules. If it’s <code>same-site</code>, you still need to add the required CORS headers in the response because the site and the origin are different concepts.</p>

<p>However, those headers are not sent by all browsers. Namely, Safari doesn’t support them at the time of writing. Therefore, they can only act as a secondary solution to identify a request’s origin.</p>

<p>A bank can identify you via your passport, but not everybody has a passport, so you will always need to resort to a good old ID card. Passports are still a cool way to identify people when available. That’s what the <code>Sec-Fetch</code> headers are.</p>

<p>Keep in mind that attackers may trick users into sending requests they don’t want to, but they still have no control over which browser will send the request. Thus, <code>Sec-Fetch</code> headers are still useful despite being supported only by some browsers. When they are present, they are a reliable piece of information.</p>

<p>More broadly, cross-origin and cross-site security patterns are based on the fact that users are using legitimate browsers that should never try to voluntarily mislead servers about the origin. Beware of more elaborate attacks, such as subdomain takeover, that can still bypass these security measures.</p>

<p>You may think, what about servers, then? Server requests are able to spoof a request origin, effectively bypassing CORS. Well, that’s right: CORS is a browser-server security mechanism; it simply doesn’t apply to server-server calls. Someone can build an API that calls your own API and serve the result to another website. True.</p>

<p>However, the thief will have to host a server, which isn’t free, so they will pay actual money for this API call, and the server IP may be traced back to them. It’s way less attractive than forcing browsers to send the request directly to your API, which would be free and trace back to the first victim, your user, and not to the attacker. Thanks to CORS, this worst-case scenario is not possible.</p>

<div class="partners__lead-place"></div>

<h2 id="no-we-don-t-take-checks-don-t-confuse-a-web-page-access-and-an-api-call">No, We Don’t Take Checks: Don’t Confuse A Web Page Access And An API Call</h2>

<p>If you’ve stumbled upon this article, you have probably read a lot of documentation before that. You might have encountered various patterns that seem very different from one another and may be very different from what I’ve been describing so far.</p>

<p>I’d like to point out that this article is about authentication for <em>websites</em>. This is, I believe, the root of all confusion. First, the requests are sent by a browser, not by another server. Then, a page of a website can be accessed via the URL bar, and the website can send calls to an API via JavaScript; that’s two very different situations.</p>

<p>We have detailed the technical differences between each scenario earlier in this article. But let’s recap again to better understand the most common sources of confusion.</p>

<h3 id="using-browser-storage-session-local-and-friend-is-like-using-your-mailbox-as-a-piggy-bank">Using Browser Storage (Session, Local, And Friend) Is Like Using Your Mailbox As A Piggy Bank</h3>

<p>Setting your token in <code>localStorage</code> is like storing money in your physical mailbox. Well, technically, it’s safe. It’s even used to temporarily store your mail. Session storage is similar; it’s just like getting your mail every day instead of letting it rot for weeks. Be nice to the postman!</p>

<p>But either way, the storage is accessible to JavaScript. It’s not open like your mailbox most probably has a lock. But it’s still lying outside.</p>

<p>Someone who is really mean could craft a key and go as far as discreetly stealing your mail for days. That’s what would happen to your users if someone manages to run a script injection attack in your application. They can craft a JS script that reads the <code>localStorage</code>, and sends them the tokens of any of your users affected by the breach!</p>














<figure class="
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d7b386e4-00b5-4f4b-8846-1ab39fbd73f4/6-authentication-websites-banking-analogy.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="466"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d7b386e4-00b5-4f4b-8846-1ab39fbd73f4/6-authentication-websites-banking-analogy.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d7b386e4-00b5-4f4b-8846-1ab39fbd73f4/6-authentication-websites-banking-analogy.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d7b386e4-00b5-4f4b-8846-1ab39fbd73f4/6-authentication-websites-banking-analogy.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d7b386e4-00b5-4f4b-8846-1ab39fbd73f4/6-authentication-websites-banking-analogy.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d7b386e4-00b5-4f4b-8846-1ab39fbd73f4/6-authentication-websites-banking-analogy.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d7b386e4-00b5-4f4b-8846-1ab39fbd73f4/6-authentication-websites-banking-analogy.png"
			
			sizes="100vw"
			alt="A mailbox labeled ‘localStorage sessionStorage’"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      A mailbox labeled ‘localStorage sessionStorage’: not always the best place to store your precious tokens. (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d7b386e4-00b5-4f4b-8846-1ab39fbd73f4/6-authentication-websites-banking-analogy.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>There are ways to prevent cross-scripting attacks. It’s not a fatality, and some would argue that it’s still better than using an HTTP-only cookie! But if you go the web storage way, don’t forget to protect your mailbox.</p>

<h3 id="jwts-passed-as-header-it-s-a-pattern-for-api-calls-only">JWTs Passed As Header: It’s A Pattern For API Calls Only</h3>

<p>I’d like to go one step further and understand <em>why</em> so many developers are tempted to use the browser storage without even considering the cookie option.</p>

<p>I think there are two main reasons:</p>

<ol>
<li>The API doesn’t use <code>Set-Cookie</code> during the login step. It often happens in APIs that were not specifically designed to be accessed from a browser, and they use an authentication pattern that works for servers, too (so no cookies). Your back-end developer will claim it was a “design choice.” Don’t trust them.</li>
<li>The client needs to set an <code>Authorization</code> header with the token. That’s just the symmetrical issue; the API chose not to rely on cookies.</li>
</ol>

<p>You’ll meet a lot of documentation in the wild that shows headers like this:</p>

<pre><code class="language-javascript">Authorization: Bearer &lt;token&gt;
</code></pre>

<p>Setting the <code>Authorization</code> header implies you cannot use an HTTP-Only cookie. Of course, you can set the headers of a request using JavaScript. However, this means that the token must be available to JavaScript in the first place. Let’s repeat it once again: <strong>it’s ok not to use a cookie and prefer web storage, but be very careful with XSS attacks!</strong></p>

<p>Moreover, this pattern works only for programmatic requests with fetch and XHR. You can’t secure access to the web page itself because the browser won’t set this header automatically during navigation. You just really can’t.</p>

<p>If you need to secure web pages, the backend of your website (which may differ from your actual API that serves data) should use HTTP-only cookies, or you should set a non-HTTP-only cookie manually. Either way, be careful that by using cookies, you are introducing a new vector of attacks.</p>

<p>Not all websites need to be secured this way, though. It’s actually pretty uncommon for public-facing websites. Remember Blitz.js’ motto “secure data, not pages.” But the cookie way is still a pattern you must be aware of.</p>

<p>If you really need to secure a web page, reach out to your backend developer and explain to them that cookies are good. They won’t contradict this claim.</p>

<p>If it’s really not possible to improve the API, you might want to adopt a pattern named “backend-for-frontend” (BFF). Basically, have a tiny server owned by the front-end team that takes care of calling authenticated APIs server-side, among other things. It works pretty well with frameworks like Remix or Next.js that have built-in server-oriented features.</p>

<h3 id="side-note-on-basic-auth-looks-like-a-header-behaves-like-a-cookie">Side Note On Basic Auth: Looks Like A Header, Behaves Like A Cookie</h3>

<p>Of course, every rule must have its exceptions. There is only one common scenario I know where the token can be passed as a request header without using JavaScript: using basic authentication.</p>

<p>Basic authentication is an unsafe pattern, as identifiers are sent alongside every request, not just a token but the actual username and password. It’s a bit like asking your local drug dealer to pay your rent and give them your ID card and 2000$ that they should kindly bring to your landlord. It’s only ok if this is a fake ID. Actually, no, fake IDs and drug dealers are not ok. But you get the point!</p>

<p>It’s still interesting for a few use cases, like quickly securing the demo of a website. As long as you can accept the password to be stolen without that many consequences, typically if the password has been generated by an admin for a temporary occasion (NOT a user-set password that could be reused for multiple services!).</p>

<p>In basic authentication, the browser sets the <code>Authorization</code> header for you. You still need to set the <code>credentials</code> option properly when using <code>fetch</code> programmatically so that the header is also set in this case. But you don’t have to manually tweak the header. It really behaves like a cookie.</p>

<p>That’s actually one reason why this fetch option is named “credentials” and not just “cookies”: it also applies to the basic authentication header.</p>

<h2 id="conclusion">Conclusion</h2>

<p>Wow, if you’ve read this far, you definitely earned your right to a quick summary!</p>

<p>But before that, I have another gift for you: <a href="https://github.com/lbke/deno-auth-demo">an open-source demo of authentication with Deno and HTMX for the front end</a>!</p>

<p>This is a very basic setup, but it puts the concepts described in this article into action using the “cookie way.”</p>

<p>Here is your well-deserved TL;DR:</p>

<ul>
<li><strong>JWT is like banknotes, and sessionId is like credit cards.</strong> They are two authentication patterns, but either way, you want to store those tokens safely client-side.</li>
<li><strong>One safe place to store tokens in a browser is an HTTP-only and secure cookie, set via the <code>Set-Cookie</code> header of the login response.</strong> It cannot be stolen by malicious JavaScript code. Web storage is another possibility if you only secure API calls and not web page access. If you pick web storage, then be very careful with XSS attacks.</li>
<li><strong>Cookies are automatically sent alongside every request provided you use the right options</strong>, namely the <code>path</code> and <code>SameSite</code> attributes of the cookie. Like a wallet, you would carry it on you all the time and take it out of your bag only in safe places when a payment is needed.</li>
<li><strong>When navigating via URL, the browser takes care of sending the cookie containing the auth token (if properly set).</strong> But you may also need to call authenticated APIs using JavaScript code. Fetch <code>credentials</code> and XHR <code>withCredentials</code> options have to be configured correctly, so cookies are also sent alongside those programmatic requests. Don’t forget to set the <code>Access-Control-Allow-Credentials</code> response header as well.</li>
<li><strong>Auth is about politeness: the server must set the proper headers for everything to work.</strong> You can’t enter a bank and yell at people to get your money.</li>
<li>This is particularly true for cross-origin requests. Companies must have secure and polite discussions with their bank, which can be separate organizations or located in a distant country. That’s what CORS is for websites and APIs. Don’t forget to properly <strong>set the <code>Access-Control-Allow-Origin</code> and <code>Access-Control-Allow-Credentials</code> headers</strong> in the response.</li>
<li>If you store your savings in your mailbox, put a camera on top of it, and <strong>if you store your token in the web storage, protect it against XSS attacks</strong>.</li>
<li>Banks don’t treat people like they treat other banks. <strong>Don’t confuse webpages patterns</strong> (have to rely on cookies and browser’s built-in features) <strong>and API patterns</strong> (relying on headers, which can be implemented using client-side JavaScript).</li>
<li><strong>Basic auth is a fun pattern that blurs the line, as it uses an Authorization header like for APIs, but it can be used for webpages too.</strong> It’s a specific and very insecure pattern that is only meant for a handful of limited use cases. Basic auth headers are a reason why <code>fetch</code> and <code>XHR</code> options are named “credentials” and not just “cookies.”</li>
</ul>

<h3 id="resources">Resources</h3>

<ul>
<li>Sending programmatic requests with fetch (as opposed to accessing a URL or submitting an HTML form and letting the browser send the request):

<ul>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch">Using the Fetch API</a>, Mozilla docs</li>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/API/fetch">fetch()</a>, Mozilla docs</li>
</ul></li>
<li><a href="https://jwt.io/introduction">Intro to JWT token.</a><br />
You’ll notice the ambiguity: it states that JWT should not be stored in browser storage, yet they should usually be passed via header… which implies storing the token in browser storage. But that’s not the only choice. HTTP-only cookies can be used too, and which is the best is an open debate.</li>
<li>“<a href="https://portswigger.net/research/web-storage-the-lesser-evil-for-session-tokens">Web Storage: the lesser evil for session tokens</a>”, James Kettle<br />
HTTP-only cookies are debated: an article in favor of the web storage.</li>
<li><a href="https://dl.acm.org/doi/pdf/10.1145/3106237.3121282">Reflections on the REST architectural style and “principled design of the modern web architecture” (impact paper award)</a>, Fielding, R. T., Taylor, R. N., Erenkrantz, J. R., Gorlick, M. M., Whitehead, J., Khare, R., &amp; Oreizy, P. (2017, August). In Proceedings of the 2017 11th joint meeting on foundations of software engineering (pp. 4-14).<br />
This paper from Fielding et al. states that the use case of session management has been overlooked in the past when defining the REST architectural style, leading to confusion and poor technological solutions</li>
<li>You’ll find many great tutorials in the wild. A quick search for “authentication” on Smashing Magazine will confirm that there are already two great pieces just for Next.js:

<ul>
<li>“<a href="https://www.smashingmagazine.com/2022/04/dynamic-data-fetching-authenticated-nextjs-app/">Dynamic Data-Fetching In An Authenticated Next.js App</a>”, Caleb Olojo (Self-hosted authentication)</li>
<li>“<a href="https://www.smashingmagazine.com/2021/05/implement-authentication-nextjs-auth0/">How To Implement Authentication In Next.js With Auth0</a>”, Facundo Giuliani</li>
</ul></li>
<li><a href="https://www.rfc-editor.org/rfc/rfc7519">Standard RFC for JWT</a></li>
<li>“<a href="https://www.smashingmagazine.com/2016/06/the-current-state-of-authentication-we-have-a-password-problem/">The Current State Of Authentication: We Have A Password Problem</a>”, Drew Thomas<br />
There are other ways to authenticate the user than passwords. Most of the content of my article should, however, still hold even with other approaches (magic link, OpenID Connect…).</li>
<li><a href="https://developer.mozilla.org/fr/docs/Web/HTTP/Methods/OPTIONS">The OPTIONS HTTP verb used by the CORS preflight request</a> (triggered on non-simple requests like calling a JSON API with fetch)</li>
<li><a href="https://jub0bs.com/posts/2022-02-08-cve-2022-21703-writeup/#bypassing-content-type-validation-and-avoiding-cors-preflight">Breaking CORS preflight request to bypass CORS</a></li>
<li>“<a href="https://portswigger.net/research/exploiting-cors-misconfigurations-for-bitcoins-and-bounties">Exploiting CORS misconfigurations for Bitcoins and bounties</a>”, James Kettle<br />
Why the scheme (HTTP or HTTPS) matters with CORS; <a href="https://twitter.com/jub0bs/status/1352160391032401923/photo/1">some exploit examples</a>.</li>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#credentialed_requests_and_wildcards">The Wildcard exception</a></li>
<li><a href="https://fetch.spec.whatwg.org/#concept-request-client">Fetch standard definition of a “client”</a></li>
<li><a href="https://stackoverflow.com/questions/10636611/how-does-access-control-allow-origin-header-work">Excellent explanation on Access-Control-Allow-Origin, the header that controls CORS</a></li>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS">About CORS, and definition of “simple requests”</a></li>
<li><a href="https://stackoverflow.com/a/48231372/5513532">XHR withCredentials in Axios</a></li>
<li><a href="https://portswigger.net/web-security/csrf">CSRF</a><br />
A type of attack to bypass cross-origin restriction (not covered in this article, great read to go further, especially if you go “the cookie way” for API authentication)</li>
<li><a href="https://cheatsheetseries.owasp.org/cheatsheets/HTML5_Security_Cheat_Sheet.html#local-storage">Limits of storing tokens in browser storage</a></li>
<li><a href="https://portswigger.net/web-security/csrf/samesite-cookies">SameSite</a><br />
Configure the cookies to be sent or not when coming from another site</li>
<li>About <a href="https://web.dev/i18n/en/samesite-cookies-explained/">the SameSite attribute for cookies</a>, from web.dev</li>
<li><a href="https://www.honeybadger.io/blog/subdomain-takeover/">Subdomain takeover</a></li>
<li><a href="https://stackoverflow.com/questions/67689503/what-is-top-level-navigation-in-browser-terminology-and-in-what-ways-it-can-be-t">What is a “top-level navigation” in the browser</a></li>
<li>“<a href="https://web.dev/fetch-metadata/">Protect your resources from web attacks with Fetch Metadata</a>”, Lukas Weichselbaum<br />
Another brilliant piece from web.dev about Sec-Fetch headers.</li>
<li>The canonical <a href="https://samnewman.io/patterns/architectural/bff/">definition of Backend For Front-end</a>.<br />
It’s similar to using a centralized API gateway for the front end, except that BFF is decentralized.</li>
<li>“<a href="https://httptoolkit.tech/blog/cache-your-cors/">Cache your CORS, for performance &amp; profit</a>”, Tim Perry<br />
How to cache preflight requests to reduce your API workload (non-standard at the moment but extremely useful at scale).</li>
<li><a href="https://stackoverflow.com/questions/58173809/next-js-redirect-from-to-another-page">Redirecting in Next.js</a></li>
</ul>

<div class="signature">
  <img src="https://www.smashingmagazine.com/images/logo/logo--red.png" alt="Smashing Editorial" width="35" height="46" loading="lazy" decoding="async" />
  <span>(yk, il)</span>
</div>


              </article>
            </body>
          </html>
        ]]></content:encoded></item><item><author>Suzanne Scacca</author><title>How To Prioritize User Security When Collecting Offline Data</title><link>https://www.smashingmagazine.com/2022/12/prioritize-user-security-collecting-offline-data/</link><pubDate>Thu, 15 Dec 2022 13:30:00 +0000</pubDate><guid>https://www.smashingmagazine.com/2022/12/prioritize-user-security-collecting-offline-data/</guid><description>Concerns over online privacy and security are nothing new. The best thing companies can do to put users’ minds at ease is to utilize technology that makes the digital exchange of data more secure. That goes just as much for the tools that users directly enter their data into as the tools that businesses use to move that data around behind the scenes. In this article, Suzanne Scacca explores how the right CSV importer can help businesses better prioritize user security.</description><content:encoded><![CDATA[
          <html>
            <head>
              <meta charset="utf-8">
              <link rel="canonical" href="https://www.smashingmagazine.com/2022/12/prioritize-user-security-collecting-offline-data/" />
              <title>How To Prioritize User Security When Collecting Offline Data</title>
            </head>
            <body>
              <article>
                <header>
                  <h1>How To Prioritize User Security When Collecting Offline Data</h1>
                  
                    
                    <address>Suzanne Scacca</address>
                  
                  <time datetime="2022-12-15T13:30:00&#43;00:00" class="op-published">2022-12-15T13:30:00+00:00</time>
                  <time datetime="2022-12-15T13:30:00&#43;00:00" class="op-modified">2026-02-09T03:03:08+00:00</time>
                </header>
                <p>This article is sponsored by <b>Flatfile</b></p>
                

<p>With the explosive growth of cloud computing over the last decade, unprecedented volumes of data &mdash; customer data, product data, statistics, financials, and so on &mdash; are being shared between organizations every day. While it would be great if there were a universal API that could guarantee secure and accurate transfer of data, the reality is much more primitive.</p>

<p>Most data that is being shared between companies these days is contained in CSV (comma-separated values) files. <strong>While CSVs are generally easy to create, they’re notoriously difficult to secure.</strong></p>

<p>Because of this, the exchange of CSV files has the potential to cause serious problems for companies. And when it comes to user security and privacy, companies can’t afford to gamble on such liability.</p>

<h2 id="how-to-create-a-secure-data-importer-for-your-clients">How To Create A Secure Data Importer For Your Clients</h2>

<p><a href="https://www.techrepublic.com/article/data-privacy-is-a-growing-concern-for-more-consumers/">TechRepublic</a> recently published the findings from a KPMG report regarding data privacy. 64% of respondents said that they don’t believe that companies do much in the way of securing and protecting the data that’s been shared with them.</p>

<p>We know what the solution to this is and how to reduce those justifiable concerns. The first piece is to <strong>handle customer data responsibly and be transparent about what you’re doing with it</strong>. Regulations like GDPR and HIPAA provide the framework for this.</p>

<p>The other solution is to <strong>use technology that prioritizes user security</strong>. Just as you’d only add secure data handling features to your digital product &mdash; like contact forms, payment processors, and so on &mdash; the same applies to your data importer.</p>

<p>CSV importers are already a step in the right direction when it comes to security. Rather than sending email files back and forth over insecure email platforms, companies pass their data through CSV importers. The trick is to build or use a data importer that prioritizes security.</p>

<p>Next, you can find some things your importer will need in order for that to be true.</p>

<h3 id="protect-your-data-with-a-secure-infrastructure">Protect Your Data With A Secure Infrastructure</h3>

<p>When you build a website or app, there are certain measures you take to secure it. One of the most important measures is choosing a hosting provider with the proper infrastructure to support, stabilize and secure your digital product and the data that moves through it.</p>

<p>If you’re building your own data importer, then your product hosting will serve as the underlying infrastructure for it. Just make sure that it is capable of protecting the integrity of your product as well as securing the data transmissions that take place through your importer.</p>

<p>If you’re going to use a pre-built data importer solution, then spend some time reviewing the technology and systems that power it. Your users &mdash; and <em>their</em> customers &mdash; won’t be too happy if a data breach occurs and you try to put the blame on an external solution.</p>

<p>Here are some things that a secure data importer needs in terms of infrastructure:</p>

<h4 id="built-in-the-cloud">Built In The Cloud</h4>

<p>Cloud hosting offers a high degree of protection. When reviewing data importer options, take a look under the hood of each to confirm that they’re running in the cloud.</p>

<p>For instance, Flatfile’s servers are built on Amazon Web Services (AWS) cloud infrastructure. As a result, data that passes through Flatfile’s systems is fully encrypted using the AES-256 block cipher. This encryption protects data while it passes through the data importer as well as once it’s stored.</p>

<h4 id="security-testing-and-monitoring">Security Testing And Monitoring</h4>

<p>You and your clients aren’t the only ones who should be keeping an eye on what’s going on with your data importer. The company that devised the solution should be doing so, too.</p>

<p>There are a number of ways to ensure that the data importer and its infrastructure haven’t been compromised:</p>

<ul>
<li>Application monitoring;</li>
<li>Continuous logging;</li>
<li>User action tracing;</li>
<li>Penetration testing;</li>
<li>Malicious activity monitoring;</li>
<li>Automated blocking.</li>
</ul>

<p>It’s also important to find a data importer solution and provider that will be transparent about detected issues and alert you to any they’ve found.</p>

<h4 id="resource-management">Resource Management</h4>

<p>Application performance goes hand-in-hand with security. This is critical for companies like <a href="https://flatfile.com/customer-stories/employus/?utm_source=partner&amp;utm_medium=content&amp;utm_campaign=smashing-magazine-sponsorship-content_q4-2022-flatfile-promotion-december&amp;utm_content=conetnt&amp;utm_term=employus_customer_story_tofu_dec">EmployUS</a> who promise users that their data will be secured, compliant <em>and</em> available.</p>

<p>In addition to reviewing your data importer solution for security features, also look for what it’s doing to optimize performance and uptime.</p>

<p>Load balancing and resource scaling are two things to look for. Another thing you should do is check out the company’s “Status” page. Here’s an example of what the “Status” page looks like for Flatfile:</p>














<figure class="
  
  
  ">
  
    <a href="https://res.cloudinary.com/indysigner/image/upload/v1670859717/flatfile-status-updates_zxgafs.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="389"
			
			srcset="https://res.cloudinary.com/indysigner/image/upload/f_auto,q_80/w_400/flatfile-status-updates_zxgafs.png 400w,
			        https://res.cloudinary.com/indysigner/image/upload/f_auto,q_80/w_800/flatfile-status-updates_zxgafs.png 800w,
			        https://res.cloudinary.com/indysigner/image/upload/f_auto,q_80/w_1200/flatfile-status-updates_zxgafs.png 1200w,
			        https://res.cloudinary.com/indysigner/image/upload/f_auto,q_80/w_1600/flatfile-status-updates_zxgafs.png 1600w,
			        https://res.cloudinary.com/indysigner/image/upload/f_auto,q_80/w_2000/flatfile-status-updates_zxgafs.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/upload/f_auto,q_80/w_400/flatfile-status-updates_zxgafs.png"
			
			sizes="100vw"
			alt="Flatfile users can visit the ‘Status’ page to check on systems operational issues. This screenshot shows that all systems are operational"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      A screenshot of the Flatfile “Status” page shows that all systems are operational. (Source: <a href='https://flatfile.com/?utm_source=partner&utm_medium=content&utm_campaign=smashing-magazine-sponsorship-content_q4-2022-flatfile-promotion-december&utm_content=demo&utm_term=flatfile_status_tofu_dec'>Flatfile</a>) (<a href='https://res.cloudinary.com/indysigner/image/upload/v1670859717/flatfile-status-updates_zxgafs.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>If there are issues with any aspect of the data importer technology, you’ll find proof of it on this page. Users can also subscribe for real-time updates. Having this level of visibility and transparency is essential when you outsource a critical piece of your application to another provider’s solution.</p>

<h3 id="ensure-regulatory-and-legal-compliance">Ensure Regulatory And Legal Compliance</h3>

<p>Different types of digital products have to maintain certain levels of compliance. This can be due to the types of data they handle (like in the medical and financial industries) or because of where they or their users are located in the world.</p>

<p>Whether you’re building your own importer or using a pre-built solution, your technology and data handling processes need to be compliant with all relevant security and privacy regulations.</p>

<p>For example, Flatfile’s solution maintains compliance with the following:</p>

<ul>
<li><strong>GDPR</strong><br />
Although this data security and privacy regulation was passed to protect EU citizens’ personal data, it has far-reaching effects. Because many businesses these days serve customers all around the world, GDPR compliance is essential for anyone doing business online.</li>
<li><strong>AICPA SOC 2 (Types I and II)</strong><br />
The Association of International Certified Professional Accountants has its own regulations related to data privacy and protection. SOC and SOC 2 refer to the audit that service providers must pass in order to ensure they’re securely handling employee and customer data.</li>
<li><strong>EU/U.S. Privacy Shield</strong><br />
The U.S. Department of Commerce put together this framework in conjunction with the European Commission and the Swiss Administration. It provides companies that conduct transatlantic commerce with a set of data protection requirements to follow when transferring data.</li>
<li><strong>HIPAA</strong><br />
HIPAA is a U.S. law concerned with the protection of sensitive patient data. It ensures that their health information is private and secure. It also gives patients more control over how their information is used and to whom it is disclosed.</li>
</ul>














<figure class="
  
  
  ">
  
    <a href="https://res.cloudinary.com/indysigner/image/upload/v1670859926/flatfile-security-trust-seals_mhy2hm.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="139"
			
			srcset="https://res.cloudinary.com/indysigner/image/upload/f_auto,q_80/w_400/flatfile-security-trust-seals_mhy2hm.png 400w,
			        https://res.cloudinary.com/indysigner/image/upload/f_auto,q_80/w_800/flatfile-security-trust-seals_mhy2hm.png 800w,
			        https://res.cloudinary.com/indysigner/image/upload/f_auto,q_80/w_1200/flatfile-security-trust-seals_mhy2hm.png 1200w,
			        https://res.cloudinary.com/indysigner/image/upload/f_auto,q_80/w_1600/flatfile-security-trust-seals_mhy2hm.png 1600w,
			        https://res.cloudinary.com/indysigner/image/upload/f_auto,q_80/w_2000/flatfile-security-trust-seals_mhy2hm.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/upload/f_auto,q_80/w_400/flatfile-security-trust-seals_mhy2hm.png"
			
			sizes="100vw"
			alt="A row of 5 security seals appears on the Flatfile website. They represent the five types of compliance the data importer meets: GDPR, AICPA SOC, AICPA SOC2, EU/U.S. Privacy Shield, and HIPAA"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      Flatfile is SOC 2 Type I, SOC 2 Type II, HIPAA, Privacy Shield and GDPR compliant. (Source: <a href='https://flatfile.com/?utm_source=partner&utm_medium=content&utm_campaign=smashing-magazine-sponsorship-content_q4-2022-flatfile-promotion-december&utm_content=demo&utm_term=flatfile_status_tofu_dec'>Flatfile</a>) (<a href='https://res.cloudinary.com/indysigner/image/upload/v1670859926/flatfile-security-trust-seals_mhy2hm.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>With so many regulations to stay on top of, a data importer can become a huge chore to maintain and update. This is why many developers and companies choose to use a pre-built data importer solution.</p>

<p><a href="https://flatfile.com/customer-stories/osmind/?utm_source=partner&amp;utm_medium=content&amp;utm_campaign=smashing-magazine-sponsorship-content_q4-2022-flatfile-promotion-december&amp;utm_content=content&amp;utm_term=osmind_customer_story_tofu_dec">Osmind</a>, for instance, not only streamlined its data transfer process with Flatfile Workspaces, but it enabled them to achieve HIPAA compliance &mdash; something that’s critical when working with sensitive health records.</p>

<p><strong>Bottom line</strong>: By finding a data importer that maintains various regulatory compliances, you won’t have to spend time down the road looking for alternative solutions to fill in the missing gaps. Plus, a provider that keeps its systems updated as regulations and standards change will greatly reduce the risk of your data importer falling out of compliance.</p>

<h3 id="prevent-your-importer-from-breaking-so-easily">Prevent Your Importer From Breaking So Easily</h3>

<p>Whether you are populating databases for a warehouse catalog, an ERP, or just a list of every town in which you operate, your importer needs to be strong.</p>

<p>For instance, let’s say a user ignores your file preparation instructions and rushes to import the files they have. Before it even gets to the point of cleaning up the data, you want to make sure the importer is able to <em>process</em> it without breaking down.</p>

<p>A broken data importer can leave users with a bad impression of the product they’re using and the company behind it. It doesn’t matter if it’s their fault for not reading the instructions or for poorly formatting their file. Encountering a broken feature is frustrating and can quickly lead to concerns with regard to security and privacy.</p>

<blockquote>“What happened?”<br />“Did my data even go through?”<br />“Should I try it again, or is it too risky?”</blockquote>

<p>With how advanced technology has gotten today, users will likely wonder why <em>you</em> hadn’t anticipated these kinds of issues and sorted them out already. So, in order to prevent end users from encountering a broken data importer, it will need to be smart and flexible.</p>














<figure class="
  
  
  ">
  
    <a href="https://res.cloudinary.com/indysigner/image/upload/v1670860785/flatfile-secure-data-onboarding-message_w31wzg.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="394"
			
			srcset="https://res.cloudinary.com/indysigner/image/upload/f_auto,q_80/w_400/flatfile-secure-data-onboarding-message_w31wzg.png 400w,
			        https://res.cloudinary.com/indysigner/image/upload/f_auto,q_80/w_800/flatfile-secure-data-onboarding-message_w31wzg.png 800w,
			        https://res.cloudinary.com/indysigner/image/upload/f_auto,q_80/w_1200/flatfile-secure-data-onboarding-message_w31wzg.png 1200w,
			        https://res.cloudinary.com/indysigner/image/upload/f_auto,q_80/w_1600/flatfile-secure-data-onboarding-message_w31wzg.png 1600w,
			        https://res.cloudinary.com/indysigner/image/upload/f_auto,q_80/w_2000/flatfile-secure-data-onboarding-message_w31wzg.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/upload/f_auto,q_80/w_400/flatfile-secure-data-onboarding-message_w31wzg.png"
			
			sizes="100vw"
			alt="A screenshot is taken from Developer Mode inside of Flatfile. We see a sample data importer asking users to ‘Upload your file’. They can drop their CSV or XLSX file into the center of the screen or select it. There’s also a message at the bottom that reads: ‘You’re securely onboarding data with Flatfile’"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      Even with scant details about file types or data formats, Flatfile will enable you to create error-free data upload experiences. (Source: <a href='https://flatfile.com/?utm_source=partner&utm_medium=content&utm_campaign=smashing-magazine-sponsorship-content_q4-2022-flatfile-promotion-december&utm_content=demo&utm_term=flatfile_status_tofu_dec'>Flatfile</a>) (<a href='https://res.cloudinary.com/indysigner/image/upload/v1670860785/flatfile-secure-data-onboarding-message_w31wzg.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>This means using a data importer that:</p>

<ul>
<li>Provides no more than a few guidelines so that users don’t have to read an entire manual in order to prepare their files;</li>
<li>Moves massive amounts of files with thousands of rows of data without erroring out;</li>
<li>Accepts files just as the customer has prepared them;</li>
<li>Easily maps and validates data no matter how inconsistent or varied the formats are;</li>
<li>Detects and notifies you (or your users) of serious errors before uploading.</li>
</ul>

<p>An importer that breaks down all the time is going to cause issues for everyone involved. So too will one that brings tons of garbled data into your system &mdash; especially when that data is mission-critical.</p>

<p>By creating or using a strong and agile data importer, you can reduce the frequency with which errors occur. This will make your data importer more reliable and valuable to your users and help them instill greater trust in their own customers.</p>

<h2 id="wrapping-up">Wrapping Up</h2>

<p>User security &mdash; as well as the <em>perception</em> of how secure the products are that they use &mdash; should matter a good deal to companies who collect data from their customers. That’s why it’s essential for developers to use CSV importers that they trust and that won’t put their clients or their end users in harm’s way.</p>

<p>As for whether you should <a href="https://flatfile.com/build-vs-buy/?utm_source=partner&amp;utm_medium=content&amp;utm_campaign=smashing-magazine-sponsorship-content_q4-2022-flatfile-promotion-december&amp;utm_content=content&amp;utm_term=build_vs_buy_content_tofu_dec">build or buy a data importer</a>, that decision is yours to make. However, if security and compliance are top priorities, then purchasing a pre-built importer like Flatfile would be the more economical and practical choice.</p>

<div class="signature">
  <img src="https://www.smashingmagazine.com/images/logo/logo--red.png" alt="Smashing Editorial" width="35" height="46" loading="lazy" decoding="async" />
  <span>(yk, il)</span>
</div>


              </article>
            </body>
          </html>
        ]]></content:encoded></item><item><author>Heather Burns</author><title>Understanding Privacy: Protect Your Users, Protect Yourself</title><link>https://www.smashingmagazine.com/2022/12/understanding-privacy-protect-your-users-protect-yourself/</link><pubDate>Tue, 13 Dec 2022 17:30:00 +0000</pubDate><guid>https://www.smashingmagazine.com/2022/12/understanding-privacy-protect-your-users-protect-yourself/</guid><description>All of us want to create inclusive, safe, and privacy-aware digital experiences, but where to begin? Our brand new Smashing Book, “Understanding Privacy,” written by Heather Burns, can help lay the ground for future developers, designers, and project managers to build a better web for tomorrow. &lt;a href="https://www.smashingmagazine.com/2022/12/understanding-privacy-new-smashing-book/#about-the-book">Jump to the details&lt;/a> or &lt;a href="https://www.smashingmagazine.com/printed-books/understanding-privacy/">get the book right away&lt;/a>.</description><content:encoded><![CDATA[
          <html>
            <head>
              <meta charset="utf-8">
              <link rel="canonical" href="https://www.smashingmagazine.com/2022/12/understanding-privacy-protect-your-users-protect-yourself/" />
              <title>Understanding Privacy: Protect Your Users, Protect Yourself</title>
            </head>
            <body>
              <article>
                <header>
                  <h1>Understanding Privacy: Protect Your Users, Protect Yourself</h1>
                  
                    
                    <address>Heather Burns</address>
                  
                  <time datetime="2022-12-13T17:30:00&#43;00:00" class="op-published">2022-12-13T17:30:00+00:00</time>
                  <time datetime="2022-12-13T17:30:00&#43;00:00" class="op-modified">2026-02-09T03:03:08+00:00</time>
                </header>
                
                

<blockquote><strong>Q.</strong> Did any part of your education require you to read the building regulations?<br /><strong>A.</strong> No, I don’t recall, but I don’t think so.<br /><strong>Q.</strong> What about fire safety of building materials?<br /><strong>A.</strong> No.<br /><br />&mdash; Witness testimony, the Grenfell Tower inquiry, <a href="https://assets.grenfelltowerinquiry.org.uk/documents/transcript/GTI%20%20-%20Day%2022_0.pdf">day 22</a></blockquote>

<p>As the hard copies of <a href="https://www.smashingmagazine.com/printed-books/understanding-privacy/"><em>Understanding Privacy</em></a> begin to ship all over the world, the brilliant team at Smashing, who helped me bring my book to life, have asked me to share a few thoughts on what it might achieve in the months and years to come.</p>

<p>I wrote the book for two broad audiences, and if you’re reading this, you probably fall into one of them. The <strong>first audience</strong> is designers, developers, and project managers already working on the open web, either professionally or in side projects. The <strong>second audience</strong> is students and future professionals in those fields, whether they are in secondary schools, undergraduate courses, vocational training, or code academies.</p>

<p>The reason I structured the book in the way I did is that these two audiences, and you, tend to have something in common: you’ve never received any previous training or education on positive foundational privacy, either as a concept, a legal issue, or a professional practice, either in your formal education (assuming you had any) or in your workplaces.</p>

<blockquote class="pull-quote">
  <p>
    <a class="pull-quote__link" aria-label="Share on Twitter" href="https://twitter.com/share?text=%0a%20What%20you%20have%20been%20told%20about%20privacy,%20by%20contrast,%20has%20been%20defined%20by%20a%20lot%20of%20high-level%20legalese%20jargon,%20compliance%20scaremongering,%20and%20terrifying%20headlines%20about%20the%20surveillance%20society%20that%20exists%20around%20us%20%e2%80%94%20whether%20we%20know%20it%20or%20not.%0a&url=https://smashingmagazine.com%2f2022%2f12%2funderstanding-privacy-protect-your-users-protect-yourself%2f">
      
 What you have been told about privacy, by contrast, has been defined by a lot of high-level legalese jargon, compliance scaremongering, and terrifying headlines about the surveillance society that exists around us — whether we know it or not.

    </a>
  </p>
  <div class="pull-quote__quotation">
    <div class="pull-quote__bg">
      <span class="pull-quote__symbol">“</span></div>
  </div>
</blockquote>

<p>That means that an entire generation of professionals like you have been introduced to privacy by being thrown into advanced legal compliance headaches or reactive fixes to the problems created by others, with no knowledge of the basic concepts and principles about what privacy actually is and how to achieve it.</p>

<p>I hope that <a href="https://www.smashingmagazine.com/printed-books/understanding-privacy/"><em>Understanding Privacy</em></a> can go some way towards giving people like you a confident understanding of those foundational concepts. Indeed, it’s my hope that teachers and educators will use it as the basis for a curriculum on privacy so that <strong>a healthy approach to privacy</strong> becomes baked-in from the start rather than retrofitted at the end.</p>

<p>That, of course, raises two further issues.</p>

<ol>
<li>The first is how teachers and educators find the book in the first place;</li>
<li>The second is how the lessons in it reach developers (both current and future ones) who have never had a teacher and never will.</li>
</ol>

<p>The question of how we teach privacy, what we teach, and where we teach it, <a href="https://webdevlaw.uk/2019/07/22/the-missing-pieces-teaching-the-legal-side-of-web-development/">has troubled me for years</a>. That’s a hard enough problem to crack. After all, web development is an unorganized field. In fact, in the strictly legal sense, it is not a profession.</p>

<p>What do I mean by that? Professions are defined by industry-based organisations, common paths of entry, common educational requirements, continuing professional development, and even certifications that require refresher training every few years. Being a professional, in the strictly legal sense, means that there is a body made up of your peers who make sure that you <strong>bring a common body of knowledge to the work you put into the world</strong> and that the work you do meets externally verifiable standards.</p>

<p>Web development, on the other hand, is an unorganized and unstructured field that anyone can enter, at any time, with any form of formal training or with none at all, and without any external certifications or approval. A software engineer who went through a four-year bachelor’s degree program in computer science can be working on the same team, doing the same work, as a former airline pilot who learned code for fun. It’s that occupational diversity that has contributed to the growth of the open web as a whole; indeed, I find that the best teams contain people who approach their work from the diverging perspectives they gained doing something completely different.</p>

<p>But it also means that the knowledge of privacy that we bring to our work is, quite simply, all over the place. If that knowledge is there at all. And without a common pathway of education, whether that’s access to training and continuing professional development or work towards a standard of foundational knowledge, we will continue to bring the contrasting <strong>social, legal, and cultural differences to privacy</strong> which I discuss in <a href="https://www.smashingmagazine.com/printed-books/understanding-privacy/#table-of-contents">Part One</a> to the work we put into the world.</p>

<p>And our users will continue to pay the price for that.</p>

<p>As I write in the book, we can’t wait for educators, employers, and institutions to fill the gaps in our knowledge. <strong>Educating ourselves on privacy has never been more important</strong>. It pains me to know that the book is the first and only education on privacy that most of its readers will ever have, but something is better than nothing. Unfortunately, it won’t be enough.</p>

<p>Because the dilemma of how we teach a positive foundational approach to privacy &mdash; in an unorganized and open industry &mdash; has taken on a whole new urgency through my pivoted career into the politics of tech. And that situation is far scarier than you can imagine.</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://www.smashingmagazine.com/printed-books/understanding-privacy/">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			
			
			srcset="https://res.cloudinary.com/indysigner/image/upload/f_auto,q_80/w_400/understanding-privacy-27_mq2m4u.jpg 400w,
			        https://res.cloudinary.com/indysigner/image/upload/f_auto,q_80/w_800/understanding-privacy-27_mq2m4u.jpg 800w,
			        https://res.cloudinary.com/indysigner/image/upload/f_auto,q_80/w_1200/understanding-privacy-27_mq2m4u.jpg 1200w,
			        https://res.cloudinary.com/indysigner/image/upload/f_auto,q_80/w_1600/understanding-privacy-27_mq2m4u.jpg 1600w,
			        https://res.cloudinary.com/indysigner/image/upload/f_auto,q_80/w_2000/understanding-privacy-27_mq2m4u.jpg 2000w"
			src="https://res.cloudinary.com/indysigner/image/upload/f_auto,q_80/w_400/understanding-privacy-27_mq2m4u.jpg"
			
			sizes="100vw"
			alt="Understanding Privacy: Privacy and Your Work"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      Privacy and your work &mdash; there’s loads to keep in mind. (<a href='https://res.cloudinary.com/indysigner/image/upload/v1670870869/understanding-privacy-27_mq2m4u.jpg'>Large preview</a>)
    </figcaption>
  
</figure>

<p>Much of my time in recent years has been spent retorting various regulatory plans for personal <a href="https://webdevlaw.uk/2021/11/08/online-safety-bill-hostage-taking-law/">liability regimes</a> in digital regulation. That means that politicians increasingly want to hold the people who make the open web legally and even criminally responsible for any misuse or unintended consequences of their work.</p>

<p>Some of this is born out of pressure to “do something” about <strong>the mess that the open web is today</strong>; sometimes it’s about “reining in the tech giants” (and I can tell you that politicians absolutely think <a href="https://slate.com/technology/2021/08/facebook-internet-regulation.html">Facebook is the Internet</a>); sometimes it’s about barefaced moves for political power (hello from Brexit Britain); and sometimes it’s about cracking down on public discourse and interaction, <a href="https://webdevlaw.uk/2022/07/31/fixing-the-uks-online-safety-bill-part-1-we-need-answers/">delegating the requirement for censorship and control to the tech sector</a> and therefore to workers like you.</p>

<p>Whatever reasons are behind these proposals, they are not going away. In fact, <strong>they’re only getting louder</strong>.</p>

<p>Many of these proposed liability regulations have been borrowed from traditional health and safety regimes. But these draft regulations, and those who support them, fail to understand that human discourse cannot be regulated as if it was fire-retardant cladding on a building that wasn’t fire-retardant at all (as I noted in the quote which began this article). By trying to shoehorn human interactions into a “risk assessment” model, these regimes <strong>risk creating an unworkable legal standard</strong> where a person who misuses a service is not deemed liable, but the person who built the service is.</p>

<p>These proposed liability regimes, for what it’s worth, have been drafted in a highly obsessive and vindictive manner to target a handful of high-profile American billionaires and celebrities in a handful of American big tech companies. (To be precise, these proposed regimes target three specific individuals in two companies, as if their arrests and imprisonment would fix all the problems on the Internet.) For the purposes of this discussion, those men’s guilt or complacency is neither here nor there.</p>

<p>That’s because, for a range of obvious reasons, once those laws are on the books, the celebrity billionaires will be able to afford to duck and dodge the charges. But because politicians insist that “something has to be done” and “someone needs to pay for this”, those laws will be used, instead, to go after the little guys and the easy targets. That means <em>you</em>.</p>

<p>What I am saying is that policymakers across all societies and cultures are <strong>turning their attention to people like you</strong>, the knowledge you bring to the table, and the work you put into the world. They’re not doing that because they want to support you into the next phase of your career. They’re doing that because they’re looking for someone to blame. They <em>need</em> someone to blame.</p>

<p>In fact, I have encountered politicians who are desperate to actually <a href="https://webdevlaw.uk/2021/10/21/why-labour-just-lost-the-tech-sectors-vote/"><em>arrest, prosecute, and imprison developers</em></a>, hopefully in front of the TV cameras, as punishment for the sins of their celebrity bosses. Those policymakers are in ascendancy, and they are not going away.</p>

<p>And when they’re looking for someone to blame for the problems on the open web today and need an easy target to take down for a quick political “win,” there you are, with no qualifications or foundational training or formal education, making things that millions of people use.</p>

<p>I think you see where this is going.</p>

<p>I wrote <a href="https://www.smashingmagazine.com/printed-books/understanding-privacy/"><em>Understanding Privacy</em></a> to contribute to <strong>a better open web</strong>, and I wrote it in the most positive and constructive tone possible (and hey, that was hard going in lockdown). But I would not be serving the people I wrote it for if I pretended that the book’s teachings exist in a happy bubble where the fixes are easy. The book’s teachings exist in a political climate where the people who make the web, including you, are now a target.</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://www.smashingmagazine.com/printed-books/understanding-privacy/">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			
			
			srcset="https://res.cloudinary.com/indysigner/image/upload/f_auto,q_80/w_400/understanding-privacy-40_lbme0p.jpg 400w,
			        https://res.cloudinary.com/indysigner/image/upload/f_auto,q_80/w_800/understanding-privacy-40_lbme0p.jpg 800w,
			        https://res.cloudinary.com/indysigner/image/upload/f_auto,q_80/w_1200/understanding-privacy-40_lbme0p.jpg 1200w,
			        https://res.cloudinary.com/indysigner/image/upload/f_auto,q_80/w_1600/understanding-privacy-40_lbme0p.jpg 1600w,
			        https://res.cloudinary.com/indysigner/image/upload/f_auto,q_80/w_2000/understanding-privacy-40_lbme0p.jpg 2000w"
			src="https://res.cloudinary.com/indysigner/image/upload/f_auto,q_80/w_400/understanding-privacy-40_lbme0p.jpg"
			
			sizes="100vw"
			alt="Understanding Privacy: Privacy and Health Data"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      Among many other things, the Covid-19 pandemic changed life &mdash; and privacy &mdash; for all of us. Privacy is real for everyone across the globe. (<a href='https://res.cloudinary.com/indysigner/image/upload/v1670870869/understanding-privacy-27_mq2m4u.jpg'>Large preview</a>)
    </figcaption>
  
</figure>

<p>I want the book to contribute to <strong>a better standard of privacy</strong> for the people we build the web for. By reading the book, you’ll learn how to protect them in everything you do, regardless of the presence or absence of any privacy legislation. But in the political climate that exists around us all, by reading the book, you’ll learn how to protect yourself too.</p>

<p>In the absence of any formal curricular and educational path, workplace training, professional body, or legal standard, the book will help you to <strong>create an accountable and documented framework around privacy in your work</strong> &mdash; no matter who employs you or what you’re working on. That framework, and for that matter, the book, can’t protect you on its own. But the lessons you learn from it might just help you when the day comes that it’s you and your team in your co-working lounge, and not the celebrity billionaires and their teams in Silicon Valley, who become the target for an ambitious politician’s campaigning.</p>

<p>During life in lockdown, we all became familiar with the “oxygen mask” rule: secure your own mask before putting one onto someone else. In other words, you can’t support others if you’re not supporting yourself. As you use <a href="https://www.smashingmagazine.com/printed-books/understanding-privacy/"><em>Understanding Privacy</em></a> to build a better web for your users, take some time to think about the ways you can use its <strong>lessons to protect yourself</strong>, especially in light of policymakers’ obsession with getting ad-hominem revenge on Big Tech celebrities &mdash; an obsession which views you as expendable collateral damage. And as I write in <a href="https://www.smashingmagazine.com/printed-books/understanding-privacy/#table-of-contents">Part Four</a>, think about the developers who will come after you and what sort of world they can build if they are given a better education in foundational privacy.</p>

<p>Or, at the very least, given more than just one book.</p>

<h2 id="details-about-the-book">Details About The Book</h2>

<ul>
<li><strong>Quality hardcover</strong>, stitched binding, ribbon page marker.</li>
<li><strong>Free worldwide shipping</strong> from Germany.</li>
<li><strong>eBook is available</strong> as PDF, ePUB, and Amazon Kindle.</li>
<li>ISBN: <span class="small-caps">978-3-945749-64-7</span> (print)</li>
<li><a href="/printed-books/understanding-privacy/" data-product-sku="understanding-privacy" data-component="AddToCart" data-product-path="/printed-books/understanding-privacy/" data-silent="true"><strong>Get the book (Print Hardcover + eBook)</strong></a></li>
</ul>

<figure style="margin-bottom:0;padding-bottom:0" class="break-out article__image">
    <a href= “https://www.smashingmagazine.com/provide/eBooks/understanding-privacy/understanding-privacy-sample-chapter.pdf” title= “Tap for a large preview of the book.”>
    <img width="800" height="533" style="border-radius: 11px" src="https://res.cloudinary.com/indysigner/image/upload/v1670870869/understanding-privacy-56_za6lcu.jpg" alt="Understanding Privacy">
    </a>
</figure>


<div class="book-cta__inverted">
	


	
	
	




















<div class="book-cta" data-handler="ContentTabs" data-mq="(max-width: 480px)">

  
 
<nav class="content-tabs content-tabs--books">
  <ul>
    <li class="content-tab">
      <a href="#">
        <button class="btn btn--small btn--white btn--white--bordered">
          Print + eBook
        </button>
      </a>
    </li>

    <li class="content-tab">
      <a href="#">
        <button class="btn btn--small btn--white btn--white--bordered">
          eBook
        </button>
      </a>
    </li>
  </ul>
</nav>


	<div class="book-cta__col book-cta__hardcover content-tab--content">
		<h3 class="book-cta__title">
			<span>Print + eBook</span>
		</h3>

		
			



	
	
	
	
	
	
	<script class="gocommerce-product" type="application/json" data-sku="understanding-privacy" data-type="Book">
	{
		"sku": "understanding-privacy",
		"type": "Book",
		"price": "44.00",
		
		"prices": [{
			"amount": "44.00",
			"currency": "USD",
			"items": [
				{"amount": "34.00", "type": "Book"},
				{"amount": "10.00", "type": "E-Book"}
			]
		}, {
			"amount": "44.00",
			"currency": "EUR",
			"items": [
				{"amount": "34.00", "type": "Book"},
				{"amount": "10.00", "type": "E-Book"}
			]
		}
		]
	}
	</script>


<span class="book-cta__price" data-handler="PriceTag" data-sku="understanding-privacy" data-type="Book" data-insert="true">
  <span class="placeholder">
    
      
<span class="currency-sign">$</span>
44<span class="sup">.00</span>


    

    
  </span>
</span>

		
		<button class="btn btn--full btn--medium btn--text-shadow"
						
		        data-product-path="/printed-books/understanding-privacy/"
						data-product-sku="understanding-privacy"
            data-author="Heather Burns"
            data-authors=""
						data-link=""
						
            data-component="AddToCart">
			 Get Print + eBook
		</button>
		<p class="book-cta__desc">
			Quality hardcover. <a href="https://www.smashingmagazine.com/delivery-times/">Free worldwide shipping</a>. 100&nbsp;days money-back-guarantee.
		</p>
	</div>
	<div class="book-cta__col book-cta__ebook content-tab--content">
		<h3 class="book-cta__title">
			<span>eBook</span>
		</h3>

		
			<div data-audience="anonymous free supporter" data-remove="true">
				



	
	
	
	
	
	
	<script class="gocommerce-product" type="application/json" data-sku="understanding-privacy-ebook" data-type="E-Book">
	{
		"sku": "understanding-privacy-ebook",
		"type": "E-Book",
		"price": "19.00",
		
		"prices": [{
			"amount": "19.00",
			"currency": "USD"
		}, {
			"amount": "19.00",
			"currency": "EUR"
		}
		]
	}
	</script>


<span class="book-cta__price" data-handler="PriceTag" data-sku="understanding-privacy-ebook" data-type="E-Book" data-insert="true">
  <span class="placeholder">
    
      
<span class="currency-sign">$</span>
19<span class="sup">.00</span>


    

    
  </span>
</span>

			</div>
		

    
      <span class="book-cta__price hidden" data-audience="smashing member" data-remove="true">
        <span class="green">Free!</span>
      </span>
    

		<button class="btn btn--full btn--medium btn--text-shadow"
		        data-product-path="/printed-books/understanding-privacy/"
						data-product-sku="understanding-privacy-ebook"
            data-author="Heather Burns"
            data-authors=""
						data-link=""
            data-component="AddToCart"
						
            
              data-audience="anonymous free supporter"
              data-remove="true"
            
            >
			  Get the eBook
		</button>
		<p
      class="book-cta__desc"
      
        data-audience="anonymous free supporter"
        data-remove="true"
      
    >
			<strong>DRM-free,</strong> of course. 


	

	

	

ePUB, Kindle, PDF.<br/> Included with <a href="/membership/">your Smashing Membership</a>.
		</p>

    
  <div data-audience="smashing member" class="hidden" data-remove="true">
    <a href="understandingprivacypdf" class="btn btn--medium btn--green btn--full js-add-to-cart">
      Get the eBook
    </a>
    <p class="book-cta__desc book-cta__desc--light">
      <a href="understandingprivacypdf">Download PDF</a>, <a href="understandingprivacyepub">ePUB</a>, <a href="understandingprivacymobi">Kindle</a>.<br/>Thanks for being smashing!&nbsp;❤️
    </p>
  </div>


	</div>
</div>

</div>

<div class="signature">
  <img src="https://www.smashingmagazine.com/images/logo/logo--red.png" alt="Smashing Editorial" width="35" height="46" loading="lazy" decoding="async" />
  <span>(as, vf, il)</span>
</div>


              </article>
            </body>
          </html>
        ]]></content:encoded></item><item><author>Vitaly Friedman</author><title>It’s Here! “Understanding Privacy,” A New Smashing Book Is Shipping Now</title><link>https://www.smashingmagazine.com/2022/12/understanding-privacy-new-smashing-book/</link><pubDate>Thu, 08 Dec 2022 13:00:00 +0000</pubDate><guid>https://www.smashingmagazine.com/2022/12/understanding-privacy-new-smashing-book/</guid><description>“Understanding Privacy,” the new Smashing Book by Heather Burns, will help you create inclusive, safe and privacy-aware digital experiences. Print books are now shipping! &lt;a href="https://www.smashingmagazine.com/2022/12/understanding-privacy-new-smashing-book/#about-the-book">Jump to details&lt;/a> and &lt;a href="https://www.smashingmagazine.com/printed-books/understanding-privacy/">get the book right away&lt;/a>.</description><content:encoded><![CDATA[
          <html>
            <head>
              <meta charset="utf-8">
              <link rel="canonical" href="https://www.smashingmagazine.com/2022/12/understanding-privacy-new-smashing-book/" />
              <title>It’s Here! “Understanding Privacy,” A New Smashing Book Is Shipping Now</title>
            </head>
            <body>
              <article>
                <header>
                  <h1>It’s Here! “Understanding Privacy,” A New Smashing Book Is Shipping Now</h1>
                  
                    
                    <address>Vitaly Friedman</address>
                  
                  <time datetime="2022-12-08T13:00:00&#43;00:00" class="op-published">2022-12-08T13:00:00+00:00</time>
                  <time datetime="2022-12-08T13:00:00&#43;00:00" class="op-modified">2026-02-09T03:03:08+00:00</time>
                </header>
                
                

<p>What <em>is</em> privacy? What exactly does it mean? How do we consider, manage and maintain privacy? And how dow do we design and build experiences that have privacy at their heart? That’s exactly what <em>Understanding Privacy</em> is all about: a <strong>practical guide to privacy on the web</strong>, from data collection and use of personal data to creating safe, inclusive experiences for everyone.</p>

<p>From the still-relevant Privacy by Design Framework to the recent conflicts over consent and health data, Heather Burns has created an <strong>indespensible</strong> resource for anyone working to build safety and trust into their interfaces.</p>

<ul>
<li><strong>eBook is available</strong> as PDF, ePUB, and Amazon Kindle.</li>
<li><strong>Free worldwide shipping</strong> from Germany.</li>
<li><a href="https://www.smashingmagazine.com/provide/eBooks/understanding-privacy/understanding-privacy-sample-chapter.pdf">Download a free PDF sample</a> (11MB)</li>
<li><a href="/printed-books/understanding-privacy/" data-product-sku="understanding-privacy" data-component="AddToCart" data-product-path="/printed-books/understanding-privacy/" data-silent="true"><strong>Get the book (Print Hardcover + eBook)</strong></a></li>
</ul>

<figure style="margin-bottom:0;padding-bottom:0" class="break-out article__image">
    <a data-product-sku="understanding-privacy" data-component="AddToCart" data-product-path="/printed-books/understanding-privacy" data-silent="true" href="https://res.cloudinary.com/indysigner/image/upload/v1670496112/understanding-privacy-smashing-book-60_vcei7m.jpgg">
    <img width="845" height="585" style="border-radius: 11px" src="https://res.cloudinary.com/indysigner/image/upload/v1670496112/understanding-privacy-smashing-book-60_vcei7m.jpg" alt="Thank you so much for your kind ongoing support, everone!">
    </a>
</figure>


<div class="book-cta__inverted">
	


	
	
	




















<div class="book-cta" data-handler="ContentTabs" data-mq="(max-width: 480px)">

  
 
<nav class="content-tabs content-tabs--books">
  <ul>
    <li class="content-tab">
      <a href="#">
        <button class="btn btn--small btn--white btn--white--bordered">
          Print + eBook
        </button>
      </a>
    </li>

    <li class="content-tab">
      <a href="#">
        <button class="btn btn--small btn--white btn--white--bordered">
          eBook
        </button>
      </a>
    </li>
  </ul>
</nav>


	<div class="book-cta__col book-cta__hardcover content-tab--content">
		<h3 class="book-cta__title">
			<span>Print + eBook</span>
		</h3>

		
			



	
	
	
	
	
	
	<script class="gocommerce-product" type="application/json" data-sku="understanding-privacy" data-type="Book">
	{
		"sku": "understanding-privacy",
		"type": "Book",
		"price": "44.00",
		
		"prices": [{
			"amount": "44.00",
			"currency": "USD",
			"items": [
				{"amount": "34.00", "type": "Book"},
				{"amount": "10.00", "type": "E-Book"}
			]
		}, {
			"amount": "44.00",
			"currency": "EUR",
			"items": [
				{"amount": "34.00", "type": "Book"},
				{"amount": "10.00", "type": "E-Book"}
			]
		}
		]
	}
	</script>


<span class="book-cta__price" data-handler="PriceTag" data-sku="understanding-privacy" data-type="Book" data-insert="true">
  <span class="placeholder">
    
      
<span class="currency-sign">$</span>
44<span class="sup">.00</span>


    

    
  </span>
</span>

		
		<button class="btn btn--full btn--medium btn--text-shadow"
						
		        data-product-path="/printed-books/understanding-privacy/"
						data-product-sku="understanding-privacy"
            data-author="Heather Burns"
            data-authors=""
						data-link=""
						
            data-component="AddToCart">
			 Get Print + eBook
		</button>
		<p class="book-cta__desc">
			Quality hardcover. <a href="https://www.smashingmagazine.com/delivery-times/">Free worldwide shipping</a>. 100&nbsp;days money-back-guarantee.
		</p>
	</div>
	<div class="book-cta__col book-cta__ebook content-tab--content">
		<h3 class="book-cta__title">
			<span>eBook</span>
		</h3>

		
			<div data-audience="anonymous free supporter" data-remove="true">
				



	
	
	
	
	
	
	<script class="gocommerce-product" type="application/json" data-sku="understanding-privacy-ebook" data-type="E-Book">
	{
		"sku": "understanding-privacy-ebook",
		"type": "E-Book",
		"price": "19.00",
		
		"prices": [{
			"amount": "19.00",
			"currency": "USD"
		}, {
			"amount": "19.00",
			"currency": "EUR"
		}
		]
	}
	</script>


<span class="book-cta__price" data-handler="PriceTag" data-sku="understanding-privacy-ebook" data-type="E-Book" data-insert="true">
  <span class="placeholder">
    
      
<span class="currency-sign">$</span>
19<span class="sup">.00</span>


    

    
  </span>
</span>

			</div>
		

    
      <span class="book-cta__price hidden" data-audience="smashing member" data-remove="true">
        <span class="green">Free!</span>
      </span>
    

		<button class="btn btn--full btn--medium btn--text-shadow"
		        data-product-path="/printed-books/understanding-privacy/"
						data-product-sku="understanding-privacy-ebook"
            data-author="Heather Burns"
            data-authors=""
						data-link=""
            data-component="AddToCart"
						
            
              data-audience="anonymous free supporter"
              data-remove="true"
            
            >
			  Get the eBook
		</button>
		<p
      class="book-cta__desc"
      
        data-audience="anonymous free supporter"
        data-remove="true"
      
    >
			<strong>DRM-free,</strong> of course. 


	

	

	

ePUB, Kindle, PDF.<br/> Included with <a href="/membership/">your Smashing Membership</a>.
		</p>

    
  <div data-audience="smashing member" class="hidden" data-remove="true">
    <a href="understandingprivacypdf" class="btn btn--medium btn--green btn--full js-add-to-cart">
      Get the eBook
    </a>
    <p class="book-cta__desc book-cta__desc--light">
      <a href="understandingprivacypdf">Download PDF</a>, <a href="understandingprivacyepub">ePUB</a>, <a href="understandingprivacymobi">Kindle</a>.<br/>Thanks for being smashing!&nbsp;❤️
    </p>
  </div>


	</div>
</div>

</div>

<h2 id="about-the-book">About The Book</h2>

<p><em>Understanding Privacy</em> is a practical guide to the concepts and ideas that inform privacy on the web. It’s about all the fundamental values of privacy <em>as a concept</em>, which precede privacy <em>as a legal compliance issue</em>. It’s about the ways these concepts impact your work as a designer, a developer, or a project manager. And it’s about the ways you can adopt these principles to create a <strong>healthy, user-centric approach to privacy</strong> in everything you do.</p>

<p><a href="https://webdevlaw.uk/about/">Heather Burns</a>, a tech policy and regulation specialist, explains what she has experienced working on <strong>privacy from every angle</strong> — human rights, law, policy, and web development — in the simplest way possible, and in the most positive way possible, in ways you can <strong>understand, use, and adapt in your work</strong> on the web right away.</p>

<figure class="break-out article__image">
    <a href="https://res.cloudinary.com/indysigner/image/upload/v1670495826/understanding-privacy-smashing-book-50_whda74.jpg" title="Tap for a large preview of the book.">
    <img width="800" height="533" style="border-radius: 11px" src="https://res.cloudinary.com/indysigner/image/upload/v1670495826/understanding-privacy-smashing-book-50_whda74.jpg" alt="Understanding Privacy">
    </a>
</figure>

<figure class="break-out article__image">
    <a href="https://res.cloudinary.com/indysigner/image/upload/v1670495653/understanding-privacy-smashing-book-27_xezy2t.jpg" title="Tap for a large preview of the book.">
    <img width="800" height="533" style="border-radius: 11px" src="https://res.cloudinary.com/indysigner/image/upload/v1670495653/understanding-privacy-smashing-book-27_xezy2t.jpg" alt="Understanding Privacy">
    </a><figcaption>A look inside the book: a quality, hardcover print, with a little boomark.</figcaption>
</figure>

<p>This book is <strong>not a legal reference manual</strong>. After reading it, you will have shifted your understanding from a negative view of privacy as a scary legal compliance obligation to a <em>positive view of privacy</em> as an opportunity to build and design a better web. <a href="https://www.smashingmagazine.com/provide/eBooks/understanding-privacy/understanding-privacy-sample-chapter.pdf"><strong>Download a free PDF sample</strong></a> (11MB).</p>

<p><em>288 pages. Written by Heather Burns. Cover design by Espen Brunborg. Both eBook and print shipping are now available.</em></p>

<h2 id="you-ll-learn">You’ll Learn:</h2>

<ul>
<li><strong>Fundamental concepts</strong>, definitions and frameworks behind privacy and data protection,</li>
<li><strong>Healthy approach to user privacy</strong> into everything you build and design,</li>
<li><strong>Common privacy issues</strong> and how you can make a difference,</li>
<li><strong>How to lay the ground</strong> for future developers, designers, and project managers to build a better web for tomorrow,</li>
<li><strong>The obligations we have</strong> to safeguard user privacy and health data.</li>
</ul>

<h3 id="who-is-this-book-for">Who Is This Book For?</h3>

<p><em>Understanding Privacy</em> is for <strong>designers</strong>, <strong>developers</strong>, and <strong>project managers</strong> who want to understand what privacy really is about and who want to integrate a healthy approach to user privacy into everything they do  not only to put their users first today but also to help build a better web for tomorrow.</p>

<figure class="break-out article__image">
    <a href="https://res.cloudinary.com/indysigner/image/upload/v1670496031/understanding-privacy-smashing-book-31_cspypi.jpg" title="Tap for a large preview of the book.">
    <img width="800" height="533" style="border-radius: 11px" src="https://res.cloudinary.com/indysigner/image/upload/v1670496031/understanding-privacy-smashing-book-31_cspypi.jpg" alt="Understanding Privacy">
    </a><figcaption>A double-spread of Understanding: an honest, practical and clear guide to privacy.</figcaption>
</figure>

<h2 id="table-of-contents">Table Of Contents</h2>

<div class="js-table-accordion accordion book__toc" id="TOC" aria-multiselectable="true">
    <dl class="accordion-list" style="margin-bottom: 1em" data-handler="Accordion">
          <dt tabindex="0" class="accordion-item" id="accordion-item-0" aria-expanded="false">
              <div class="book__toc__accordion-text">
                <div class="book__toc__chapter-col chapter__title">
                  1. Privacy and You
                </div>
              </div>
              <div class="accordion-expand-btn-wrapper">
                  <span class="accordion-expand-btn js-accordion-expand-btn">+</span>
              </div>
          </dt>
          <dd class="accordion-desc" id="accordion-desc-0" aria-hidden="true">
              <div class="book__toc__chapter-col chapter__summary">
                <p>In the book’s first section, “Privacy and You,” Heather reviews the <strong>fundamental concepts, definitions and frameworks</strong> behind privacy and data protection.</p>
             </div>
         </dd>
          <dt tabindex="0" class="accordion-item" id="accordion-item-1" aria-expanded="false">
              <div class="book__toc__accordion-text">
                <div class="book__toc__chapter-col chapter__title">
                  2. Privacy and Your Work
                </div>
              </div>
              <div class="accordion-expand-btn-wrapper">
                  <span class="accordion-expand-btn js-accordion-expand-btn">+</span>
              </div>
          </dt>
          <dd class="accordion-desc" id="accordion-desc-1" aria-hidden="true">
              <div class="book__toc__chapter-col chapter__summary">
                <p>In the second section, “Privacy and Your Work,” Heather discusses how to <strong>integrate a healthy approach to user privacy</strong> into everything you do, whether you are a designer, a developer, or a project manager.</p>
             </div>
         </dd>
          <dt tabindex="0" class="accordion-item" id="accordion-item-2" aria-expanded="false">
              <div class="book__toc__accordion-text">
                <div class="book__toc__chapter-col chapter__title">
                  3. Privacy and Your Users
                </div>
              </div>
              <div class="accordion-expand-btn-wrapper">
                  <span class="accordion-expand-btn js-accordion-expand-btn">+</span>
              </div>
          </dt>
          <dd class="accordion-desc" id="accordion-desc-2" aria-hidden="true">
              <div class="book__toc__chapter-col chapter__summary">
                <p>“Privacy and Your Users” covers issues around <strong>user privacy</strong> where you can make a difference. We’re going to learn how to consider the power dynamics of what you create, regardless of the role you play.</p>
             </div>
         </dd>
          <dt tabindex="0" class="accordion-item" id="accordion-item-3" aria-expanded="false">
              <div class="book__toc__accordion-text">
                <div class="book__toc__chapter-col chapter__title">
                  4. Privacy and Your Future
                </div>
              </div>
              <div class="accordion-expand-btn-wrapper">
                  <span class="accordion-expand-btn js-accordion-expand-btn">+</span>
              </div>
          </dt>
          <dd class="accordion-desc" id="accordion-desc-3" aria-hidden="true">
              <div class="book__toc__chapter-col chapter__summary">
                <p>In “Privacy and Your Future,” Heather suggests a few <strong>critical areas</strong> that make the web a better place and lay the ground for future developers, designers, and project managers to build a better web for tomorrow’s users.</p>
             </div>
         </dd>
          <dt tabindex="0" class="accordion-item" id="accordion-item-4" aria-expanded="false">
              <div class="book__toc__accordion-text">
                <div class="book__toc__chapter-col chapter__title">
                  Postscript: Privacy and Health Data
                </div>
              </div>
              <div class="accordion-expand-btn-wrapper">
                  <span class="accordion-expand-btn js-accordion-expand-btn">+</span>
              </div>
          </dt>
          <dd class="accordion-desc" id="accordion-desc-4" aria-hidden="true">
              <div class="book__toc__chapter-col chapter__summary">
                <p>In the final section, “Privacy and Health Data,” Heather addresses an even more pressing recent issue: the obligations we have to safeguard user privacy and health data, and how to do it as best we can.</p>
             </div>
         </dd>
    <span></span></dl>
</div>

<p>288 pages. <strong>Both eBook and print shipping are now available</strong>. Written by Heather Burns. Cover design by Espen Brunborg.</p>

<h2 id="about-the-author">About The Author</h2>

<p><a href="https://twitter.com/WebDevLaw"><img loading="lazy" decoding="async" style="float:right;margin-top:1em;margin-left:0.9em;margin-bottom:1em;border-radius:50%;    max-width:calc(50% - 5vh);height:auto;" src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/e0e633f8-d459-419c-9b2a-b60a828f9886/heather-burns-200px.jpg" width="150" height="150" alt="Heather Burns" /></a><em>Heather Burns</em> (<a href="https://twitter.com/WebDevLaw">@WebDevLaw</a>) is a <strong>tech policy professional</strong> and an advocate for an open Internet which upholds the human rights to privacy, accessibility, and freedom of expression. She’s been passionate about privacy since she built her first web site in 1996, and has educated thousands of professionals worldwide on the fundamentals of a healthy approach to protecting people and their data. She lives in Glasgow, Scotland.</p>

<figure class="break-out article__image">
    <a href="https://res.cloudinary.com/indysigner/image/upload/v1670496247/understanding-privacy-smashing-book-36_hxb6cy.jpg" title="Tap for a large preview of the book.">
    <img width="800" height="533" style="border-radius: 11px" src="https://res.cloudinary.com/indysigner/image/upload/v1670496247/understanding-privacy-smashing-book-36_hxb6cy.jpg" alt="Understanding Privacy">
    </a><figcaption>The book comes with practical examples, guidelines and checklists to keep in mind when designing and building with privacy in mind.</figcaption>
</figure>

<h2 id="reviews-and-testimonials">Reviews And Testimonials</h2>

<blockquote style="font-style: normal"><img loading="lazy" decoding="async" style="clear:both;float:right;margin-top:0em;margin-left:0.9em;margin-bottom:1em;border-radius:50%;    max-width:calc(50% - 5vh);height:auto;" src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/22df5559-41e1-4929-9bc2-31fe6a2d2c3b/mike-little-200px-opt.png" width="150" height="150" alt="Mike Little" />“Heather's broad knowledge, experience, and ability to articulate these complex matters is nothing short of astounding. I’ve learned an amazing amount from her. She always <strong>informs and entertains</strong>, and she does so from the heart.”<br /><br /> <a href="https://twitter.com/mikelittlezed1">Mike Little</a>, Co-Founder of WordPress</blockquote>

<blockquote style="font-style: normal"><img loading="lazy" decoding="async" style="clear:both;float:right;margin-top:0em;margin-left:0.9em;margin-bottom:1em;border-radius:50%;    max-width:calc(50% - 5vh);height:auto;" src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/8c56dfd7-f70b-41b3-8620-b638bbef6fa5/natasha-lomas-200px-opt.png" width="150" height="150" alt="Natasha Lomas" />“No more excuses for overlooking privacy: Heather’s guide is an <strong>essential toolbox</strong> for user-centric product developers and for anyone interested in building a better web. Expect the full sweep, from historical context and core concepts in US and EU privacy practice, to <strong>practical tips and advice</strong> — dispensed in highly readable style.”<br /><br /> <a href="https://www.twitter.com/riptari/">Natasha Lomas</a>, Senior Reporter, Techcrunch.com</blockquote>

<blockquote style="font-style: normal"><img loading="lazy" decoding="async" style="clear:both;float:right;margin-top:0em;margin-left:0.9em;margin-bottom:1em;border-radius:50%;    max-width:calc(50% - 5vh);height:auto;" src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/e8bb9ec7-9ed0-47b1-8a3a-db97f38580e3/morten-rand-hendriksen-200px-opt.png" width="150" height="150" alt="Morten Rand-Hendriksen" />“Privacy is an oft-talked about and rarely understood part of our modern digital lives. Heather has been on the forefront for the battle of our privacy for decades. In this book she makes the case for why privacy is one of the <strong>foundational pillars</strong> on which our society rests, and why eroding our privacy means eroding a cornerstone of our lives, our communities, and our democracy. A <strong>must-read for anyone</strong> working on or with the web.”<br /><br /> <a href="https://www.twitter.com/mor10/">Morten Rand-Hendriksen</a>, Senior Staff Instructor, LinkedIn Learning</blockquote>

<blockquote style="font-style: normal"><img loading="lazy" decoding="async" style="clear:both;float:right;margin-top:0em;margin-left:0.9em;margin-bottom:1em;border-radius:50%;    max-width:calc(50% - 5vh);height:auto;" src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/cd7c0587-54c1-4f51-98a2-3e966f767854/robin-berjon-200px-opt.png" width="150" height="150" alt="Robin Berjon" />“Privacy can seem complicated but it doesn’t need to be. Heather covers all that you need to know with <strong>astonishing clarity</strong>. This book gives you all you need to understand and handle privacy work, and makes for <strong>great teaching material</strong> that experts could rely on.”<br /><br /> <a href="https://www.twitter.com/robinberjon/">Robin Berjon</a>, former Head of Data Governance at The New York Times</blockquote>

<h2 id="technical-details">Technical Details</h2>

<ul>
<li>ISBN: <span class="small-caps">978-3-945749-64-7</span> (print)</li>
<li><strong>Quality hardcover</strong>, stitched binding, ribbon page marker.</li>
<li><strong>Free worldwide shipping</strong> from Germany.</li>
<li><strong>eBook is available</strong> as PDF, ePUB, and Amazon Kindle.</li>
<li><a href="/printed-books/understanding-privacy/" data-product-sku="understanding-privacy" data-component="AddToCart" data-product-path="/printed-books/understanding-privacy/" data-silent="true"><strong>Get the book (Print Hardcover + eBook)</strong></a></li>
</ul>

<figure style="margin-bottom:0;padding-bottom:0" class="break-out article__image">
    <a href="https://www.smashingmagazine.com/provide/eBooks/understanding-privacy/understanding-privacy-sample-chapter.pdf" title="Tap for a large preview of the book.">
    <img width="800" height="533" style="border-radius: 11px" src="https://res.cloudinary.com/indysigner/image/upload/v1670495195/understanding-privacy-smashing-book-55_vttdin.jpg" alt="Understanding Privacy">
    </a>
</figure>

<!-- <figure style="margin-bottom:0;padding-bottom:0" class="break-out article__image">
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/23d21c34-bc5e-4cb0-a0e7-a95d35629dda/understanding-privacy-post-cover.png" title="Tap for a large preview of the book.">
    <img style="border-radius: 11px" src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/23d21c34-bc5e-4cb0-a0e7-a95d35629dda/understanding-privacy-post-cover.png" alt="Understanding Privacy">
    </a>
</figure> -->


<div class="book-cta__inverted">
	


	
	
	




















<div class="book-cta" data-handler="ContentTabs" data-mq="(max-width: 480px)">

  
 
<nav class="content-tabs content-tabs--books">
  <ul>
    <li class="content-tab">
      <a href="#">
        <button class="btn btn--small btn--white btn--white--bordered">
          Print + eBook
        </button>
      </a>
    </li>

    <li class="content-tab">
      <a href="#">
        <button class="btn btn--small btn--white btn--white--bordered">
          eBook
        </button>
      </a>
    </li>
  </ul>
</nav>


	<div class="book-cta__col book-cta__hardcover content-tab--content">
		<h3 class="book-cta__title">
			<span>Print + eBook</span>
		</h3>

		
			



	
	
	
	
	
	
	<script class="gocommerce-product" type="application/json" data-sku="understanding-privacy" data-type="Book">
	{
		"sku": "understanding-privacy",
		"type": "Book",
		"price": "44.00",
		
		"prices": [{
			"amount": "44.00",
			"currency": "USD",
			"items": [
				{"amount": "34.00", "type": "Book"},
				{"amount": "10.00", "type": "E-Book"}
			]
		}, {
			"amount": "44.00",
			"currency": "EUR",
			"items": [
				{"amount": "34.00", "type": "Book"},
				{"amount": "10.00", "type": "E-Book"}
			]
		}
		]
	}
	</script>


<span class="book-cta__price" data-handler="PriceTag" data-sku="understanding-privacy" data-type="Book" data-insert="true">
  <span class="placeholder">
    
      
<span class="currency-sign">$</span>
44<span class="sup">.00</span>


    

    
  </span>
</span>

		
		<button class="btn btn--full btn--medium btn--text-shadow"
						
		        data-product-path="/printed-books/understanding-privacy/"
						data-product-sku="understanding-privacy"
            data-author="Heather Burns"
            data-authors=""
						data-link=""
						
            data-component="AddToCart">
			 Get Print + eBook
		</button>
		<p class="book-cta__desc">
			Quality hardcover. <a href="https://www.smashingmagazine.com/delivery-times/">Free worldwide shipping</a>. 100&nbsp;days money-back-guarantee.
		</p>
	</div>
	<div class="book-cta__col book-cta__ebook content-tab--content">
		<h3 class="book-cta__title">
			<span>eBook</span>
		</h3>

		
			<div data-audience="anonymous free supporter" data-remove="true">
				



	
	
	
	
	
	
	<script class="gocommerce-product" type="application/json" data-sku="understanding-privacy-ebook" data-type="E-Book">
	{
		"sku": "understanding-privacy-ebook",
		"type": "E-Book",
		"price": "19.00",
		
		"prices": [{
			"amount": "19.00",
			"currency": "USD"
		}, {
			"amount": "19.00",
			"currency": "EUR"
		}
		]
	}
	</script>


<span class="book-cta__price" data-handler="PriceTag" data-sku="understanding-privacy-ebook" data-type="E-Book" data-insert="true">
  <span class="placeholder">
    
      
<span class="currency-sign">$</span>
19<span class="sup">.00</span>


    

    
  </span>
</span>

			</div>
		

    
      <span class="book-cta__price hidden" data-audience="smashing member" data-remove="true">
        <span class="green">Free!</span>
      </span>
    

		<button class="btn btn--full btn--medium btn--text-shadow"
		        data-product-path="/printed-books/understanding-privacy/"
						data-product-sku="understanding-privacy-ebook"
            data-author="Heather Burns"
            data-authors=""
						data-link=""
            data-component="AddToCart"
						
            
              data-audience="anonymous free supporter"
              data-remove="true"
            
            >
			  Get the eBook
		</button>
		<p
      class="book-cta__desc"
      
        data-audience="anonymous free supporter"
        data-remove="true"
      
    >
			<strong>DRM-free,</strong> of course. 


	

	

	

ePUB, Kindle, PDF.<br/> Included with <a href="/membership/">your Smashing Membership</a>.
		</p>

    
  <div data-audience="smashing member" class="hidden" data-remove="true">
    <a href="understandingprivacypdf" class="btn btn--medium btn--green btn--full js-add-to-cart">
      Get the eBook
    </a>
    <p class="book-cta__desc book-cta__desc--light">
      <a href="understandingprivacypdf">Download PDF</a>, <a href="understandingprivacyepub">ePUB</a>, <a href="understandingprivacymobi">Kindle</a>.<br/>Thanks for being smashing!&nbsp;❤️
    </p>
  </div>


	</div>
</div>

</div>

<h2 id="community-matters">Community Matters ❤️</h2>

<p>Producing a book takes quite a bit of time, and we couldn’t pull it off without the support of our wonderful <strong>community</strong>. A huge shout-out to Smashing Members for the kind, ongoing support. The eBook is and always will be <a href="https://www.smashingmagazine.com/membership">free for <em>Smashing Members</em></a>. Plus, Members get a friendly discount when purchasing their printed copy. Just sayin’! ;-)</p>

<h2 id="more-smashing-books-amp-goodies">More Smashing Books &amp; Goodies</h2>

<p>Promoting best practices and providing you with practical tips to master your daily coding and design challenges has always been (and will be) at the <strong>core of everything we do</strong> at Smashing.</p>

<p>In the past few years, we were very lucky to have worked together with some talented, caring people from the web community to publish their wealth of experience as <a href="/printed-books/">printed books that stand the test of time</a>. Steven and Stefan are two of these people. Have you checked out their books already?</p>

<div class="book-grid break-out book-grid__in-post">

<figure class="book--featured"><div class="book--featured__image"><a href="/printed-books/touch-design-for-mobile-interfaces/"><img loading="lazy" decoding="async" src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/b14658fc-bb2d-41a6-8d1a-70eaaf1b8ec8/touch-design-book-shop-opt.png" alt="Touch Design for Mobile Interfaces" width="160" height="232" /></a></div><figcaption><h4 class="book--featured__title"><a style="padding: 7px 0;text-decoration-skip-ink: auto;text-decoration-thickness: 1px;text-underline-offset: 1px;text-decoration-line: underline;text-decoration-color: #006fc6;" href="/printed-books/touch-design-for-mobile-interfaces/">Touch Design for Mobile Interfaces</a></h4><p class="book--featured__desc">How touchscreen devices work and how people use them.</p><p><a style="font-style: normal !important; color: #fff !important;" class="btn btn--medium btn--green" href="/printed-books/touch-design-for-mobile-interfaces/" data-product-path="/printed-books/touch-design-for-mobile-interfaces/" data-product-sku="touch-design-for-mobile-interfaces" data-component="AddToCart">Add to cart <span style="color:#fff;font-size:1em;">$44</span></a></p></figcaption></figure>

<figure class="book--featured"><div class="book--featured__image"><a href="/printed-books/typescript-in-50-lessons/"><img loading="lazy" decoding="async" src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/c2f2c6d6-4e85-449a-99f5-58bd053bc846/typescript-shop-cover-opt.png" alt="TypeScript in 50 Lessons" width="160" height="232" /></a></div><figcaption><h4 class="book--featured__title"><a href="/printed-books/typescript-in-50-lessons/" style="padding: 7px 0;text-decoration-skip-ink: auto;text-decoration-thickness: 1px;text-underline-offset: 1px;text-decoration-line: underline;text-decoration-color: #006fc6;">TypeScript In 50 Lessons</a></h4><p class="book--featured__desc">Everything about TypeScript, its type system and its benefits.</p><p><a style="font-style: normal !important; color: #fff !important;" class="btn btn--medium btn--green" href="/printed-books/typescript-in-50-lessons/" data-product-path="/printed-books/typescript-in-50-lessons/" data-product-sku="typescript-in-50-lessons" data-component="AddToCart">Add to cart <span style="color:#fff;font-size:1em;">$44</span></a></p></figcaption></figure>

<figure class="book--featured"><div class="book--featured__image"><a href="/printed-books/checklist-cards/"><img loading="lazy" decoding="async" src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/efffa8a0-82a0-415a-8aa5-8684a32083eb/checklist-cards-box-opt.png"  width="160" height="232" alt="Smart Interface Design Patterns Checklists" /></a></div><figcaption><h4 class="book--featured__title"><a style="padding: 7px 0;text-decoration-skip-ink: auto;text-decoration-thickness: 1px;text-underline-offset: 1px;text-decoration-line: underline;text-decoration-color: #006fc6;" href="/printed-books/checklist-cards/">Smart Interface Design Patterns</a></h4><p class="book--featured__desc">Deck of 166 cards with common UX questions to ask.</p>
<p><a style="font-style: normal !important; color: #fff !important;" class="btn btn--medium btn--green" href="/printed-books/checklist-cards/" data-product-path="/printed-books/checklist-cards/" data-product-sku="checklist-cards" data-component="AddToCart">Add to cart <span style="color:#fff;font-size:1em;">$39</span></a></p></figcaption></figure>

</div>

<div class="signature">
  <img src="https://www.smashingmagazine.com/images/logo/logo--red.png" alt="Smashing Editorial" width="35" height="46" loading="lazy" decoding="async" />
  <span>(as, il)</span>
</div>


              </article>
            </body>
          </html>
        ]]></content:encoded></item><item><author>Vitaly Friedman</author><title>Understanding Privacy: A New Smashing Book Is Here</title><link>https://www.smashingmagazine.com/2022/10/understanding-privacy-book-release/</link><pubDate>Wed, 19 Oct 2022 12:45:00 +0000</pubDate><guid>https://www.smashingmagazine.com/2022/10/understanding-privacy-book-release/</guid><description>Meet &amp;ldquo;Understanding Privacy&amp;rdquo;, our brand new Smashing Book to make sense of privacy, and learn how to create inclusive, safe and privacy-aware digital experiences. eBook now available, print shipping in early December. &lt;a href="#about-the-book">Jump to details&lt;/a> and &lt;a href="/printed-books/understanding-privacy/" data-product-sku="understanding-privacy" data-component="AddToCart" data-product-path="/printed-books/understanding-privacy" data-silent="true">get the book.&lt;/a></description><content:encoded><![CDATA[
          <html>
            <head>
              <meta charset="utf-8">
              <link rel="canonical" href="https://www.smashingmagazine.com/2022/10/understanding-privacy-book-release/" />
              <title>Understanding Privacy: A New Smashing Book Is Here</title>
            </head>
            <body>
              <article>
                <header>
                  <h1>Understanding Privacy: A New Smashing Book Is Here</h1>
                  
                    
                    <address>Vitaly Friedman</address>
                  
                  <time datetime="2022-10-19T12:45:00&#43;00:00" class="op-published">2022-10-19T12:45:00+00:00</time>
                  <time datetime="2022-10-19T12:45:00&#43;00:00" class="op-modified">2026-02-09T03:03:08+00:00</time>
                </header>
                
                

<p>To many of us, privacy might feel like a complex, abstract concept. We can’t hold <strong>privacy</strong> in our hands, we can’t touch it, we can’t explore its volume or shape with our eyes or our fingertips. Surely it’s a <strong>part of each of us</strong>, yet it feels so intangible and so invisible — beyond reach and out of view.</p>

<p>So what <em>is</em> privacy? What exactly does it mean? How do we consider, manage and maintain privacy? And how dow do we design and build experiences that have privacy at their heart? That’s exactly what <em>Understanding Privacy</em> is all about: a <strong>practical guide to privacy on the web</strong>, from data collection and use of personal data to creating safe, inclusive experiences for everyone. <a href="#table-of-contents"><strong>Jump to table of contents ↓</strong></a></p>

<ul>
<li><strong>eBook now available</strong>.</li>
<li><strong>Printed books</strong> start shipping in <strong> 2022</strong>.</li>
<li><a href="https://www.smashingmagazine.com/provide/eBooks/understanding-privacy/understanding-privacy-sample-chapter.pdf">Download a free PDF sample</a> (11MB)</li>
<li><a href="/printed-books/understanding-privacy/" data-product-sku="understanding-privacy" data-component="AddToCart" data-product-path="/printed-books/understanding-privacy/" data-silent="true"><strong>Get the book (Print Hardcover + eBook)</strong></a></li>
</ul>

<figure style="margin-bottom:0;padding-bottom:0" class="break-out article__image">
    <a href="https://www.smashingmagazine.com/provide/eBooks/understanding-privacy/understanding-privacy-sample-chapter.pdf" title="Tap for a large preview of the book.">
    <img width="908" height="510" style="border-radius: 11px" src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/3509bd84-1307-4bb5-a00f-1b9da09b8acb/understanding-privacy-banner-opt.png" alt="Understanding Privacy">
    </a>
</figure>


<div class="book-cta__inverted">
	


	
	
	




















<div class="book-cta" data-handler="ContentTabs" data-mq="(max-width: 480px)">

  
 
<nav class="content-tabs content-tabs--books">
  <ul>
    <li class="content-tab">
      <a href="#">
        <button class="btn btn--small btn--white btn--white--bordered">
          Print + eBook
        </button>
      </a>
    </li>

    <li class="content-tab">
      <a href="#">
        <button class="btn btn--small btn--white btn--white--bordered">
          eBook
        </button>
      </a>
    </li>
  </ul>
</nav>


	<div class="book-cta__col book-cta__hardcover content-tab--content">
		<h3 class="book-cta__title">
			<span>Print + eBook</span>
		</h3>

		
			



	
	
	
	
	
	
	<script class="gocommerce-product" type="application/json" data-sku="understanding-privacy" data-type="Book">
	{
		"sku": "understanding-privacy",
		"type": "Book",
		"price": "44.00",
		
		"prices": [{
			"amount": "44.00",
			"currency": "USD",
			"items": [
				{"amount": "34.00", "type": "Book"},
				{"amount": "10.00", "type": "E-Book"}
			]
		}, {
			"amount": "44.00",
			"currency": "EUR",
			"items": [
				{"amount": "34.00", "type": "Book"},
				{"amount": "10.00", "type": "E-Book"}
			]
		}
		]
	}
	</script>


<span class="book-cta__price" data-handler="PriceTag" data-sku="understanding-privacy" data-type="Book" data-insert="true">
  <span class="placeholder">
    
      
<span class="currency-sign">$</span>
44<span class="sup">.00</span>


    

    
  </span>
</span>

		
		<button class="btn btn--full btn--medium btn--text-shadow"
						
		        data-product-path="/printed-books/understanding-privacy/"
						data-product-sku="understanding-privacy"
            data-author="Heather Burns"
            data-authors=""
						data-link=""
						
            data-component="AddToCart">
			 Get Print + eBook
		</button>
		<p class="book-cta__desc">
			Quality hardcover. <a href="https://www.smashingmagazine.com/delivery-times/">Free worldwide shipping</a>. 100&nbsp;days money-back-guarantee.
		</p>
	</div>
	<div class="book-cta__col book-cta__ebook content-tab--content">
		<h3 class="book-cta__title">
			<span>eBook</span>
		</h3>

		
			<div data-audience="anonymous free supporter" data-remove="true">
				



	
	
	
	
	
	
	<script class="gocommerce-product" type="application/json" data-sku="understanding-privacy-ebook" data-type="E-Book">
	{
		"sku": "understanding-privacy-ebook",
		"type": "E-Book",
		"price": "19.00",
		
		"prices": [{
			"amount": "19.00",
			"currency": "USD"
		}, {
			"amount": "19.00",
			"currency": "EUR"
		}
		]
	}
	</script>


<span class="book-cta__price" data-handler="PriceTag" data-sku="understanding-privacy-ebook" data-type="E-Book" data-insert="true">
  <span class="placeholder">
    
      
<span class="currency-sign">$</span>
19<span class="sup">.00</span>


    

    
  </span>
</span>

			</div>
		

    
      <span class="book-cta__price hidden" data-audience="smashing member" data-remove="true">
        <span class="green">Free!</span>
      </span>
    

		<button class="btn btn--full btn--medium btn--text-shadow"
		        data-product-path="/printed-books/understanding-privacy/"
						data-product-sku="understanding-privacy-ebook"
            data-author="Heather Burns"
            data-authors=""
						data-link=""
            data-component="AddToCart"
						
            
              data-audience="anonymous free supporter"
              data-remove="true"
            
            >
			  Get the eBook
		</button>
		<p
      class="book-cta__desc"
      
        data-audience="anonymous free supporter"
        data-remove="true"
      
    >
			<strong>DRM-free,</strong> of course. 


	

	

	

ePUB, Kindle, PDF.<br/> Included with <a href="/membership/">your Smashing Membership</a>.
		</p>

    
  <div data-audience="smashing member" class="hidden" data-remove="true">
    <a href="understandingprivacypdf" class="btn btn--medium btn--green btn--full js-add-to-cart">
      Get the eBook
    </a>
    <p class="book-cta__desc book-cta__desc--light">
      <a href="understandingprivacypdf">Download PDF</a>, <a href="understandingprivacyepub">ePUB</a>, <a href="understandingprivacymobi">Kindle</a>.<br/>Thanks for being smashing!&nbsp;❤️
    </p>
  </div>


	</div>
</div>

</div>

<h2 id="about-the-book">About The Book</h2>

<p><em>Understanding Privacy</em> is a practical guide to the concepts and ideas that inform privacy on the web. It’s about all the fundamental values of privacy <em>as a concept</em>, which precede privacy <em>as a legal compliance issue</em>. It’s about the ways these concepts impact your work as a designer, a developer, or a project manager. And it’s about the ways you can adopt these principles to create a <strong>healthy, user-centric approach to privacy</strong> in everything you do.</p>

<p><a href="https://webdevlaw.uk/about/">Heather Burns</a>, a tech policy and regulation specialist, explains what she has experienced working on <strong>privacy from every angle</strong> — human rights, law, policy, and web development — in the simplest way possible, and in the most positive way possible, in ways you can <strong>understand, use, and adapt in your work</strong> on the web right away.</p>

<figure class="article__image" style="max-width: 580px">
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/5957a0ae-b5e1-4772-86cc-ccc8a797bb11/privacy-book-cover-tilted.jpg" title="Tap for a large preview of the book.">
    <img width="580" height="639" style="border-radius: 11px" src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/5957a0ae-b5e1-4772-86cc-ccc8a797bb11/privacy-book-cover-tilted.jpg" alt="Understanding Privacy">
    </a>
</figure>

<figure class="break-out article__image">
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/ee946184-9fbb-40b3-9fc0-e061e5043d6b/privacy-page-01.jpg" title="Tap for a large preview of the book.">
    <img width="845" height="430" style="border-radius: 11px" src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/ee946184-9fbb-40b3-9fc0-e061e5043d6b/privacy-page-01.jpg" alt="Understanding Privacy">
    </a><figcaption>All chapters in the book have custom illustrations, highlighting the topic of the book.</figcaption>
</figure>

<p>This book is <strong>not a legal reference manual</strong>. After reading it, you will have shifted your understanding from a negative view of privacy as a scary legal compliance obligation to a <em>positive view of privacy</em> as an opportunity to build and design a better web. <a href="https://www.smashingmagazine.com/provide/eBooks/understanding-privacy/understanding-privacy-sample-chapter.pdf"><strong>Download a free PDF sample</strong></a> (11MB).</p>

<p><em>288 pages. Written by Heather Burns. Cover design by Espen Brunborg. eBook now available, print shipping in early December.</em></p>

<h2 id="you-ll-learn">You’ll Learn:</h2>

<ul>
<li><strong>Fundamental concepts</strong>, definitions and frameworks behind privacy and data protection,</li>
<li><strong>Healthy approach to user privacy</strong> into everything you build and design,</li>
<li><strong>Common privacy issues</strong> and how you can make a difference,</li>
<li><strong>How to lay the ground</strong> for future developers, designers, and project managers to build a better web for tomorrow,</li>
<li><strong>The obligations we have</strong> to safeguard user privacy and health data.</li>
</ul>

<h3 id="who-is-this-book-for">Who Is This Book For?</h3>

<p><em>Understanding Privacy</em> is for <strong>designers</strong>, <strong>developers</strong>, and <strong>project managers</strong> who want to understand what privacy really is about and who want to integrate a healthy approach to user privacy into everything they do  not only to put their users first today but also to help build a better web for tomorrow.</p>

<figure class="break-out article__image">
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/b8168020-4fd7-4ca1-8c22-193d9e4b0d6e/privacy-page-03.jpg" title="Tap for a large preview of the book.">
    <img width="845" height="430" style="border-radius: 11px" src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/b8168020-4fd7-4ca1-8c22-193d9e4b0d6e/privacy-page-03.jpg" alt="Understanding Privacy">
    </a><figcaption>A double-spread of Understanding: an honest, practical and clear guide to privacy.</figcaption>
</figure>

<h2 id="table-of-contents">Table Of Contents</h2>

<div class="js-table-accordion accordion book__toc" id="TOC" aria-multiselectable="true">
    <dl class="accordion-list" style="margin-bottom: 1em" data-handler="Accordion">
          <dt tabindex="0" class="accordion-item" id="accordion-item-0" aria-expanded="false">
              <div class="book__toc__accordion-text">
                <div class="book__toc__chapter-col chapter__title">
                  1. Privacy and You
                </div>
              </div>
              <div class="accordion-expand-btn-wrapper">
                  <span class="accordion-expand-btn js-accordion-expand-btn">+</span>
              </div>
          </dt>
          <dd class="accordion-desc" id="accordion-desc-0" aria-hidden="true">
              <div class="book__toc__chapter-col chapter__summary">
                <p>In the book’s first section, “Privacy and You,” Heather reviews the <strong>fundamental concepts, definitions and frameworks</strong> behind privacy and data protection.</p>
             </div>
         </dd>
          <dt tabindex="0" class="accordion-item" id="accordion-item-1" aria-expanded="false">
              <div class="book__toc__accordion-text">
                <div class="book__toc__chapter-col chapter__title">
                  2. Privacy and Your Work
                </div>
              </div>
              <div class="accordion-expand-btn-wrapper">
                  <span class="accordion-expand-btn js-accordion-expand-btn">+</span>
              </div>
          </dt>
          <dd class="accordion-desc" id="accordion-desc-1" aria-hidden="true">
              <div class="book__toc__chapter-col chapter__summary">
                <p>In the second section, “Privacy and Your Work,” Heather discusses how to <strong>integrate a healthy approach to user privacy</strong> into everything you do, whether you are a designer, a developer, or a project manager.</p>
             </div>
         </dd>
          <dt tabindex="0" class="accordion-item" id="accordion-item-2" aria-expanded="false">
              <div class="book__toc__accordion-text">
                <div class="book__toc__chapter-col chapter__title">
                  3. Privacy and Your Users
                </div>
              </div>
              <div class="accordion-expand-btn-wrapper">
                  <span class="accordion-expand-btn js-accordion-expand-btn">+</span>
              </div>
          </dt>
          <dd class="accordion-desc" id="accordion-desc-2" aria-hidden="true">
              <div class="book__toc__chapter-col chapter__summary">
                <p>“Privacy and Your Users” covers issues around <strong>user privacy</strong> where you can make a difference. We’re going to learn how to consider the power dynamics of what you create, regardless of the role you play.</p>
             </div>
         </dd>
          <dt tabindex="0" class="accordion-item" id="accordion-item-3" aria-expanded="false">
              <div class="book__toc__accordion-text">
                <div class="book__toc__chapter-col chapter__title">
                  4. Privacy and Your Future
                </div>
              </div>
              <div class="accordion-expand-btn-wrapper">
                  <span class="accordion-expand-btn js-accordion-expand-btn">+</span>
              </div>
          </dt>
          <dd class="accordion-desc" id="accordion-desc-3" aria-hidden="true">
              <div class="book__toc__chapter-col chapter__summary">
                <p>In “Privacy and Your Future,” Heather suggests a few <strong>critical areas</strong> that make the web a better place and lay the ground for future developers, designers, and project managers to build a better web for tomorrow’s users.</p>
             </div>
         </dd>
          <dt tabindex="0" class="accordion-item" id="accordion-item-4" aria-expanded="false">
              <div class="book__toc__accordion-text">
                <div class="book__toc__chapter-col chapter__title">
                  Postscript: Privacy and Health Data
                </div>
              </div>
              <div class="accordion-expand-btn-wrapper">
                  <span class="accordion-expand-btn js-accordion-expand-btn">+</span>
              </div>
          </dt>
          <dd class="accordion-desc" id="accordion-desc-4" aria-hidden="true">
              <div class="book__toc__chapter-col chapter__summary">
                <p>In the final section, “Privacy and Health Data,” Heather addresses an even more pressing recent issue: the obligations we have to safeguard user privacy and health data, and how to do it as best we can.</p>
             </div>
         </dd>
    <span></span></dl>
</div>

<p>288 pages. <strong>eBook now available, print shipping in early December.</strong> Written by Heather Burns. Cover design by Espen Brunborg.</p>

<h2 id="about-the-author">About the Author</h2>

<p><a href="https://twitter.com/WebDevLaw"><img loading="lazy" decoding="async" style="float:right;margin-top:1em;margin-left:0.9em;margin-bottom:1em;border-radius:50%;    max-width:calc(50% - 5vh);height:auto;" src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/e0e633f8-d459-419c-9b2a-b60a828f9886/heather-burns-200px.jpg" width="150" height="150" alt="Heather Burns" /></a><em>Heather Burns</em> (<a href="https://twitter.com/WebDevLaw">@WebDevLaw</a>) is a <strong>tech policy professional</strong> and an advocate for an open Internet which upholds the human rights to privacy, accessibility, and freedom of expression. She’s been passionate about privacy since she built her first web site in 1996, and has educated thousands of professionals worldwide on the fundamentals of a healthy approach to protecting people and their data. She lives in Glasgow, Scotland.</p>

<figure class="break-out article__image">
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/ca0d2d65-3cb4-4f8e-9b15-1a5c6ed250d4/privacy-page-02.jpg" title="Tap for a large preview of the book.">
    <img width="845" height="430" style="border-radius: 11px" src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/ca0d2d65-3cb4-4f8e-9b15-1a5c6ed250d4/privacy-page-02.jpg" alt="Understanding Privacy">
    </a><figcaption>The book comes with practical guidelines and checklists to keep in mind when designing and building with privacy in mind.</figcaption>
</figure>

<h2 id="reviews-and-testimonials">Reviews and Testimonials</h2>

<blockquote style="font-style: normal"><img loading="lazy" decoding="async" style="clear:both;float:right;margin-top:0em;margin-left:0.9em;margin-bottom:1em;border-radius:50%;    max-width:calc(50% - 5vh);height:auto;" src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/22df5559-41e1-4929-9bc2-31fe6a2d2c3b/mike-little-200px-opt.png" width="150" height="150" alt="Mike Little" />“Heather's broad knowledge, experience, and ability to articulate these complex matters is nothing short of astounding. I’ve learned an amazing amount from her. She always <strong>informs and entertains</strong>, and she does so from the heart.”<br /><br /> <a href="https://twitter.com/mikelittlezed1">Mike Little</a>, Co-Founder of WordPress</blockquote>

<blockquote style="font-style: normal"><img loading="lazy" decoding="async" style="clear:both;float:right;margin-top:0em;margin-left:0.9em;margin-bottom:1em;border-radius:50%;    max-width:calc(50% - 5vh);height:auto;" src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/8c56dfd7-f70b-41b3-8620-b638bbef6fa5/natasha-lomas-200px-opt.png" width="150" height="150" alt="Natasha Lomas" />“No more excuses for overlooking privacy: Heather’s guide is an <strong>essential toolbox</strong> for user-centric product developers and for anyone interested in building a better web. Expect the full sweep, from historical context and core concepts in US and EU privacy practice, to <strong>practical tips and advice</strong> — dispensed in highly readable style.”<br /><br /> <a href="https://www.twitter.com/riptari/">Natasha Lomas</a>, Senior Reporter, Techcrunch.com</blockquote>

<blockquote style="font-style: normal"><img loading="lazy" decoding="async" style="clear:both;float:right;margin-top:0em;margin-left:0.9em;margin-bottom:1em;border-radius:50%;    max-width:calc(50% - 5vh);height:auto;" src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/e8bb9ec7-9ed0-47b1-8a3a-db97f38580e3/morten-rand-hendriksen-200px-opt.png" width="150" height="150" alt="Morten Rand-Hendriksen" />“Privacy is an oft-talked about and rarely understood part of our modern digital lives. Heather has been on the forefront for the battle of our privacy for decades. In this book she makes the case for why privacy is one of the <strong>foundational pillars</strong> on which our society rests, and why eroding our privacy means eroding a cornerstone of our lives, our communities, and our democracy. A <strong>must-read for anyone</strong> working on or with the web.”<br /><br /> <a href="https://www.twitter.com/mor10/">Morten Rand-Hendriksen</a>, Senior Staff Instructor, LinkedIn Learning</blockquote>

<blockquote style="font-style: normal"><img loading="lazy" decoding="async" style="clear:both;float:right;margin-top:0em;margin-left:0.9em;margin-bottom:1em;border-radius:50%;    max-width:calc(50% - 5vh);height:auto;" src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/cd7c0587-54c1-4f51-98a2-3e966f767854/robin-berjon-200px-opt.png" width="150" height="150" alt="Robin Berjon" />“Privacy can seem complicated but it doesn’t need to be. Heather covers all that you need to know with <strong>astonishing clarity</strong>. This book gives you all you need to understand and handle privacy work, and makes for <strong>great teaching material</strong> that experts could rely on.”<br /><br /> <a href="https://www.twitter.com/robinberjon/">Robin Berjon</a>, former Head of Data Governance at The New York Times</blockquote>

<h2 id="technical-details">Technical Details</h2>

<ul>
<li>ISBN: <span class="small-caps">978-3-945749-64-7</span> (print)</li>
<li><strong>Quality hardcover</strong>, stitched binding, ribbon page marker.</li>
<li>Free worldwide <strong>shipping from Germany, starting in early December 2022</strong>.</li>
<li><strong>eBook is already available</strong> as PDF, ePUB, and Amazon Kindle.</li>
<li><a href="/printed-books/understanding-privacy/" data-product-sku="understanding-privacy" data-component="AddToCart" data-product-path="/printed-books/understanding-privacy/" data-silent="true"><strong>Get the book (Print Hardcover + eBook)</strong></a></li>
</ul>

<figure style="margin-bottom:0;padding-bottom:0" class="break-out article__image">
    <a data-product-sku="understanding-privacy" data-component="AddToCart" data-product-path="/printed-books/understanding-privacy" data-silent="true" href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/ea305ed3-2a87-4480-898a-4d18893e1291/thanks-1.jpg">
    <img width="845" height="585" style="border-radius: 11px" src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/ea305ed3-2a87-4480-898a-4d18893e1291/thanks-1.jpg" alt="Thank you so much for your kind ongoing support, everone!">
    </a>
</figure>

<!-- <figure style="margin-bottom:0;padding-bottom:0" class="break-out article__image">
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/23d21c34-bc5e-4cb0-a0e7-a95d35629dda/understanding-privacy-post-cover.png" title="Tap for a large preview of the book.">
    <img style="border-radius: 11px" src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/23d21c34-bc5e-4cb0-a0e7-a95d35629dda/understanding-privacy-post-cover.png" alt="Understanding Privacy">
    </a>
</figure> -->


<div class="book-cta__inverted">
	


	
	
	




















<div class="book-cta" data-handler="ContentTabs" data-mq="(max-width: 480px)">

  
 
<nav class="content-tabs content-tabs--books">
  <ul>
    <li class="content-tab">
      <a href="#">
        <button class="btn btn--small btn--white btn--white--bordered">
          Print + eBook
        </button>
      </a>
    </li>

    <li class="content-tab">
      <a href="#">
        <button class="btn btn--small btn--white btn--white--bordered">
          eBook
        </button>
      </a>
    </li>
  </ul>
</nav>


	<div class="book-cta__col book-cta__hardcover content-tab--content">
		<h3 class="book-cta__title">
			<span>Print + eBook</span>
		</h3>

		
			



	
	
	
	
	
	
	<script class="gocommerce-product" type="application/json" data-sku="understanding-privacy" data-type="Book">
	{
		"sku": "understanding-privacy",
		"type": "Book",
		"price": "44.00",
		
		"prices": [{
			"amount": "44.00",
			"currency": "USD",
			"items": [
				{"amount": "34.00", "type": "Book"},
				{"amount": "10.00", "type": "E-Book"}
			]
		}, {
			"amount": "44.00",
			"currency": "EUR",
			"items": [
				{"amount": "34.00", "type": "Book"},
				{"amount": "10.00", "type": "E-Book"}
			]
		}
		]
	}
	</script>


<span class="book-cta__price" data-handler="PriceTag" data-sku="understanding-privacy" data-type="Book" data-insert="true">
  <span class="placeholder">
    
      
<span class="currency-sign">$</span>
44<span class="sup">.00</span>


    

    
  </span>
</span>

		
		<button class="btn btn--full btn--medium btn--text-shadow"
						
		        data-product-path="/printed-books/understanding-privacy/"
						data-product-sku="understanding-privacy"
            data-author="Heather Burns"
            data-authors=""
						data-link=""
						
            data-component="AddToCart">
			 Get Print + eBook
		</button>
		<p class="book-cta__desc">
			Quality hardcover. <a href="https://www.smashingmagazine.com/delivery-times/">Free worldwide shipping</a>. 100&nbsp;days money-back-guarantee.
		</p>
	</div>
	<div class="book-cta__col book-cta__ebook content-tab--content">
		<h3 class="book-cta__title">
			<span>eBook</span>
		</h3>

		
			<div data-audience="anonymous free supporter" data-remove="true">
				



	
	
	
	
	
	
	<script class="gocommerce-product" type="application/json" data-sku="understanding-privacy-ebook" data-type="E-Book">
	{
		"sku": "understanding-privacy-ebook",
		"type": "E-Book",
		"price": "19.00",
		
		"prices": [{
			"amount": "19.00",
			"currency": "USD"
		}, {
			"amount": "19.00",
			"currency": "EUR"
		}
		]
	}
	</script>


<span class="book-cta__price" data-handler="PriceTag" data-sku="understanding-privacy-ebook" data-type="E-Book" data-insert="true">
  <span class="placeholder">
    
      
<span class="currency-sign">$</span>
19<span class="sup">.00</span>


    

    
  </span>
</span>

			</div>
		

    
      <span class="book-cta__price hidden" data-audience="smashing member" data-remove="true">
        <span class="green">Free!</span>
      </span>
    

		<button class="btn btn--full btn--medium btn--text-shadow"
		        data-product-path="/printed-books/understanding-privacy/"
						data-product-sku="understanding-privacy-ebook"
            data-author="Heather Burns"
            data-authors=""
						data-link=""
            data-component="AddToCart"
						
            
              data-audience="anonymous free supporter"
              data-remove="true"
            
            >
			  Get the eBook
		</button>
		<p
      class="book-cta__desc"
      
        data-audience="anonymous free supporter"
        data-remove="true"
      
    >
			<strong>DRM-free,</strong> of course. 


	

	

	

ePUB, Kindle, PDF.<br/> Included with <a href="/membership/">your Smashing Membership</a>.
		</p>

    
  <div data-audience="smashing member" class="hidden" data-remove="true">
    <a href="understandingprivacypdf" class="btn btn--medium btn--green btn--full js-add-to-cart">
      Get the eBook
    </a>
    <p class="book-cta__desc book-cta__desc--light">
      <a href="understandingprivacypdf">Download PDF</a>, <a href="understandingprivacyepub">ePUB</a>, <a href="understandingprivacymobi">Kindle</a>.<br/>Thanks for being smashing!&nbsp;❤️
    </p>
  </div>


	</div>
</div>

</div>

<h2 id="community-matters">Community Matters ❤️</h2>

<p>Producing a book takes quite a bit of time, and we couldn’t pull it off without the support of our wonderful <strong>community</strong>. A huge shout-out to Smashing Members for the kind, ongoing support. The eBook is and always will be <a href="https://www.smashingmagazine.com/membership">free for <em>Smashing Members</em></a>. Plus, Members get a friendly discount when purchasing their printed copy. Just sayin’! ;-)</p>

<h2 id="more-smashing-books-amp-goodies">More Smashing Books &amp; Goodies</h2>

<p>Promoting best practices and providing you with practical tips to master your daily coding and design challenges has always been (and will be) at the <strong>core of everything we do</strong> at Smashing.</p>

<p>In the past few years, we were very lucky to have worked together with some talented, caring people from the web community to publish their wealth of experience as <a href="/printed-books/">printed books that stand the test of time</a>. Steven and Stefan are two of these people. Have you checked out their books already?</p>

<div class="book-grid break-out book-grid__in-post">

<figure class="book--featured"><div class="book--featured__image"><a href="/printed-books/touch-design-for-mobile-interfaces/"><img loading="lazy" decoding="async" src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/b14658fc-bb2d-41a6-8d1a-70eaaf1b8ec8/touch-design-book-shop-opt.png" alt="Touch Design for Mobile Interfaces" width="160" height="232" /></a></div><figcaption><h4 class="book--featured__title"><a style="padding: 7px 0;text-decoration-skip-ink: auto;text-decoration-thickness: 1px;text-underline-offset: 1px;text-decoration-line: underline;text-decoration-color: #006fc6;" href="/printed-books/touch-design-for-mobile-interfaces/">Touch Design for Mobile Interfaces</a></h4><p class="book--featured__desc">How touchscreen devices work and how people use them.</p><p><a style="font-style: normal !important; color: #fff !important;" class="btn btn--medium btn--green" href="/printed-books/touch-design-for-mobile-interfaces/" data-product-path="/printed-books/touch-design-for-mobile-interfaces/" data-product-sku="touch-design-for-mobile-interfaces" data-component="AddToCart">Add to cart <span style="color:#fff;font-size:1em;">$44</span></a></p></figcaption></figure>

<figure class="book--featured"><div class="book--featured__image"><a href="/printed-books/typescript-in-50-lessons/"><img loading="lazy" decoding="async" src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/c2f2c6d6-4e85-449a-99f5-58bd053bc846/typescript-shop-cover-opt.png" alt="TypeScript in 50 Lessons" width="160" height="232" /></a></div><figcaption><h4 class="book--featured__title"><a href="/printed-books/typescript-in-50-lessons/" style="padding: 7px 0;text-decoration-skip-ink: auto;text-decoration-thickness: 1px;text-underline-offset: 1px;text-decoration-line: underline;text-decoration-color: #006fc6;">TypeScript In 50 Lessons</a></h4><p class="book--featured__desc">Everything about TypeScript, its type system and its benefits.</p><p><a style="font-style: normal !important; color: #fff !important;" class="btn btn--medium btn--green" href="/printed-books/typescript-in-50-lessons/" data-product-path="/printed-books/typescript-in-50-lessons/" data-product-sku="typescript-in-50-lessons" data-component="AddToCart">Add to cart <span style="color:#fff;font-size:1em;">$44</span></a></p></figcaption></figure>

<figure class="book--featured"><div class="book--featured__image"><a href="/printed-books/checklist-cards/"><img loading="lazy" decoding="async" src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/efffa8a0-82a0-415a-8aa5-8684a32083eb/checklist-cards-box-opt.png"  width="160" height="232" alt="Smart Interface Design Patterns Checklists" /></a></div><figcaption><h4 class="book--featured__title"><a style="padding: 7px 0;text-decoration-skip-ink: auto;text-decoration-thickness: 1px;text-underline-offset: 1px;text-decoration-line: underline;text-decoration-color: #006fc6;" href="/printed-books/checklist-cards/">Smart Interface Design Patterns</a></h4><p class="book--featured__desc">Deck of 166 cards with common UX questions to ask.</p>
<p><a style="font-style: normal !important; color: #fff !important;" class="btn btn--medium btn--green" href="/printed-books/checklist-cards/" data-product-path="/printed-books/checklist-cards/" data-product-sku="checklist-cards" data-component="AddToCart">Add to cart <span style="color:#fff;font-size:1em;">$39</span></a></p></figcaption></figure>

</div>

              </article>
            </body>
          </html>
        ]]></content:encoded></item><item><author>Vitaly Friedman</author><title>Meet Understanding Privacy, A New Smashing Book By Heather Burns</title><link>https://www.smashingmagazine.com/2022/09/understanding-privacy-pre-release/</link><pubDate>Mon, 05 Sep 2022 14:00:00 +0000</pubDate><guid>https://www.smashingmagazine.com/2022/09/understanding-privacy-pre-release/</guid><description>Meet “Understanding Privacy”, our upcoming book on what data privacy is really about beyond scary headlines. Approx. 350 pages. &lt;strong>eBook available in October, print shipping in early December.&lt;/strong> &lt;a href="#about-the-book">Jump to details&lt;/a> and &lt;a href="/printed-books/understanding-privacy/" data-product-sku="understanding-privacy" data-component="AddToCart" data-product-path="/printed-books/understanding-privacy" data-silent="true">pre-order the book.&lt;/a></description><content:encoded><![CDATA[
          <html>
            <head>
              <meta charset="utf-8">
              <link rel="canonical" href="https://www.smashingmagazine.com/2022/09/understanding-privacy-pre-release/" />
              <title>Meet Understanding Privacy, A New Smashing Book By Heather Burns</title>
            </head>
            <body>
              <article>
                <header>
                  <h1>Meet Understanding Privacy, A New Smashing Book By Heather Burns</h1>
                  
                    
                    <address>Vitaly Friedman</address>
                  
                  <time datetime="2022-09-05T14:00:00&#43;00:00" class="op-published">2022-09-05T14:00:00+00:00</time>
                  <time datetime="2022-09-05T14:00:00&#43;00:00" class="op-modified">2026-02-09T03:03:08+00:00</time>
                </header>
                
                

<p><strong>Privacy by design</strong> is possible, but over time, it has become challenging to build and deploy sites and apps that use personal information in practical ways that are safe and ethical. In fact, many of us have given up at least a little of our own privacy online.</p>

<p>And so in our work, it may become easier to rationalize collecting more user data than we need, to avoid <strong>transparency</strong> around how that data is used, and even to use that data for unintended purposes. We tell ourselves it is for the convenience of our users, or to enhance their experiences. It’s no secret that unethical data practices can cause harm, often in ways we can’t predict.</p>

<p><strong>Thoughtful data collection</strong>, storage, and use of data is possible, though. Heather Burns brings clarity to the subject by explaining the principles behind the collection, storage, and use of personal data, and how to use those principles to create safer experiences for your users. <em>Understanding Privacy</em> is an essential book for anyone that collects personal information. <a href="#table-of-contents"><strong>Jump to table of contents ↓</strong></a>.</p>

<ul>
<li><strong>eBook</strong> available for download in <strong>October 2022</strong>,</li>
<li><strong>Printed books</strong> will be shipped in <strong>early December 2022</strong>.</li>
<li><a href="/printed-books/understanding-privacy/" data-product-sku="understanding-privacy" data-component="AddToCart" data-product-path="/printed-books/understanding-privacy/" data-silent="true">Pre-order the book.</a></li>
</ul>

<figure style="margin-bottom:0;padding-bottom:0" class="break-out article__image">
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/ea305ed3-2a87-4480-898a-4d18893e1291/thanks-1.jpg" title="Tap for a large preview of the book.">
    <img width="1000" height="692" style="border-radius: 11px" src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/ea305ed3-2a87-4480-898a-4d18893e1291/thanks-1.jpg" alt="Understanding Privacy">
    </a>
</figure>


<div class="book-cta__inverted">
	


	
	
	




















<div class="book-cta" data-handler="ContentTabs" data-mq="(max-width: 480px)">

  
 
<nav class="content-tabs content-tabs--books">
  <ul>
    <li class="content-tab">
      <a href="#">
        <button class="btn btn--small btn--white btn--white--bordered">
          Print + eBook
        </button>
      </a>
    </li>

    <li class="content-tab">
      <a href="#">
        <button class="btn btn--small btn--white btn--white--bordered">
          eBook
        </button>
      </a>
    </li>
  </ul>
</nav>


	<div class="book-cta__col book-cta__hardcover content-tab--content">
		<h3 class="book-cta__title">
			<span>Print + eBook</span>
		</h3>

		
			



	
	
	
	
	
	
	<script class="gocommerce-product" type="application/json" data-sku="understanding-privacy" data-type="Book">
	{
		"sku": "understanding-privacy",
		"type": "Book",
		"price": "44.00",
		
		"prices": [{
			"amount": "44.00",
			"currency": "USD",
			"items": [
				{"amount": "34.00", "type": "Book"},
				{"amount": "10.00", "type": "E-Book"}
			]
		}, {
			"amount": "44.00",
			"currency": "EUR",
			"items": [
				{"amount": "34.00", "type": "Book"},
				{"amount": "10.00", "type": "E-Book"}
			]
		}
		]
	}
	</script>


<span class="book-cta__price" data-handler="PriceTag" data-sku="understanding-privacy" data-type="Book" data-insert="true">
  <span class="placeholder">
    
      
<span class="currency-sign">$</span>
44<span class="sup">.00</span>


    

    
  </span>
</span>

		
		<button class="btn btn--full btn--medium btn--text-shadow"
						
		        data-product-path="/printed-books/understanding-privacy/"
						data-product-sku="understanding-privacy"
            data-author="Heather Burns"
            data-authors=""
						data-link=""
						
            data-component="AddToCart">
			 Get Print + eBook
		</button>
		<p class="book-cta__desc">
			Quality hardcover. <a href="https://www.smashingmagazine.com/delivery-times/">Free worldwide shipping</a>. 100&nbsp;days money-back-guarantee.
		</p>
	</div>
	<div class="book-cta__col book-cta__ebook content-tab--content">
		<h3 class="book-cta__title">
			<span>eBook</span>
		</h3>

		
			<div data-audience="anonymous free supporter" data-remove="true">
				



	
	
	
	
	
	
	<script class="gocommerce-product" type="application/json" data-sku="understanding-privacy-ebook" data-type="E-Book">
	{
		"sku": "understanding-privacy-ebook",
		"type": "E-Book",
		"price": "19.00",
		
		"prices": [{
			"amount": "19.00",
			"currency": "USD"
		}, {
			"amount": "19.00",
			"currency": "EUR"
		}
		]
	}
	</script>


<span class="book-cta__price" data-handler="PriceTag" data-sku="understanding-privacy-ebook" data-type="E-Book" data-insert="true">
  <span class="placeholder">
    
      
<span class="currency-sign">$</span>
19<span class="sup">.00</span>


    

    
  </span>
</span>

			</div>
		

    
      <span class="book-cta__price hidden" data-audience="smashing member" data-remove="true">
        <span class="green">Free!</span>
      </span>
    

		<button class="btn btn--full btn--medium btn--text-shadow"
		        data-product-path="/printed-books/understanding-privacy/"
						data-product-sku="understanding-privacy-ebook"
            data-author="Heather Burns"
            data-authors=""
						data-link=""
            data-component="AddToCart"
						
            
              data-audience="anonymous free supporter"
              data-remove="true"
            
            >
			  Get the eBook
		</button>
		<p
      class="book-cta__desc"
      
        data-audience="anonymous free supporter"
        data-remove="true"
      
    >
			<strong>DRM-free,</strong> of course. 


	

	

	

ePUB, Kindle, PDF.<br/> Included with <a href="/membership/">your Smashing Membership</a>.
		</p>

    
  <div data-audience="smashing member" class="hidden" data-remove="true">
    <a href="understandingprivacypdf" class="btn btn--medium btn--green btn--full js-add-to-cart">
      Get the eBook
    </a>
    <p class="book-cta__desc book-cta__desc--light">
      <a href="understandingprivacypdf">Download PDF</a>, <a href="understandingprivacyepub">ePUB</a>, <a href="understandingprivacymobi">Kindle</a>.<br/>Thanks for being smashing!&nbsp;❤️
    </p>
  </div>


	</div>
</div>

</div>

<h2 id="about-the-book">About The Book</h2>

<p><em>Understanding Privacy</em> is an introduction to the beliefs, concepts, and ideas that inform privacy as it exists &mdash; or has failed to exist &mdash; on the open web that we build. It’s about all the fundamental values of privacy <em>as a concept</em>, which precede privacy <em>as a legal compliance issue</em>. It’s about the ways these concepts impact your work as a designer, a developer, or a project manager. And it’s about the ways you can adopt these principles to create a <strong>healthy, user-centric approach to privacy</strong> in everything you do.</p>

<p>Heather explains what she has experienced working on privacy from every angle &mdash; human rights, law, policy, and web development &mdash; in the simplest way possible, and in the most positive way possible, <strong>in ways you can comprehend, use</strong>, and adapt in your work on the web right away.</p>

<p>A healthy approach to user privacy doesn’t tell you <em>how</em> to code. It tells you how to <strong>make the right decisions</strong> which <em>inform</em> the code. It also gives you the foundation you need to question, and even challenge, workplace practices which might not be in your users’ best interests.</p>

<p>This book is <strong>not a legal reference manual</strong>. By the end of this book, you will have shifted your understanding from a negative view of privacy as a scary legal compliance obligation to a <strong>positive view of privacy</strong> as an opportunity to build a better web.</p>

<p><em>Approx. 350 pages. Written by Heather Burns. Cover design by Espen Brunborg. eBook available for download in October, print shipping in early December.</em></p>

<h3 id="you-ll-learn">You’ll learn:</h3>

<ul>
<li>Fundamental <strong>concepts</strong>, <strong>definitions</strong>, and <strong>frameworks</strong> behind privacy and data protection,</li>
<li>how to integrate a <strong>healthy approach to user privacy</strong> into everything you do,</li>
<li>common <strong>privacy issues</strong> and how you can make a difference,</li>
<li>how to lay the ground for future developers, designers, and project managers to build a <strong>better web for tomorrow</strong>,</li>
<li>the obligations we have to safeguard user privacy and <strong>health data</strong>.</li>
</ul>

<h3 id="who-is-this-book-for">Who is this book for?</h3>

<p><em>Understanding Privacy</em> is for <strong>designers</strong>, <strong>developers</strong>, and <strong>project managers</strong> who want to understand what privacy really is about and who want to integrate a healthy approach to user privacy into everything they do &mdash; not only to put their users first today but also to help build a better web for tomorrow.</p>

<h2 id="table-of-contents">Table Of Contents</h2>

<div class="js-table-accordion accordion book__toc" id="TOC" aria-multiselectable="true">
    <dl class="accordion-list" style="margin-bottom: 1em" data-handler="Accordion">
          <dt tabindex="0" class="accordion-item" id="accordion-item-0" aria-expanded="false">
              <div class="book__toc__accordion-text">
                <div class="book__toc__chapter-col chapter__title">
                  1. Privacy and You
                </div>
              </div>
              <div class="accordion-expand-btn-wrapper">
                  <span class="accordion-expand-btn js-accordion-expand-btn">+</span>
              </div>
          </dt>
          <dd class="accordion-desc" id="accordion-desc-0" aria-hidden="true">
              <div class="book__toc__chapter-col chapter__summary">
                <p>In the book’s first section, “Privacy and You,” Heather reviews the fundamental concepts, definitions, and frameworks behind privacy and data protection.</p>
             </div>
         </dd>
          <dt tabindex="0" class="accordion-item" id="accordion-item-1" aria-expanded="false">
              <div class="book__toc__accordion-text">
                <div class="book__toc__chapter-col chapter__title">
                  2. Privacy and Your Work
                </div>
              </div>
              <div class="accordion-expand-btn-wrapper">
                  <span class="accordion-expand-btn js-accordion-expand-btn">+</span>
              </div>
          </dt>
          <dd class="accordion-desc" id="accordion-desc-1" aria-hidden="true">
              <div class="book__toc__chapter-col chapter__summary">
                <p>In the second section, “Privacy and Your Work,” Heather discusses how to integrate a healthy approach to user privacy into everything you do, whether you are a designer, a developer, or a project manager.</p>
             </div>
         </dd>
          <dt tabindex="0" class="accordion-item" id="accordion-item-2" aria-expanded="false">
              <div class="book__toc__accordion-text">
                <div class="book__toc__chapter-col chapter__title">
                  3. Privacy and Your Users
                </div>
              </div>
              <div class="accordion-expand-btn-wrapper">
                  <span class="accordion-expand-btn js-accordion-expand-btn">+</span>
              </div>
          </dt>
          <dd class="accordion-desc" id="accordion-desc-2" aria-hidden="true">
              <div class="book__toc__chapter-col chapter__summary">
                <p>“Privacy and Your Users” covers issues around user privacy where you can make a difference.</p>
             </div>
         </dd>
          <dt tabindex="0" class="accordion-item" id="accordion-item-3" aria-expanded="false">
              <div class="book__toc__accordion-text">
                <div class="book__toc__chapter-col chapter__title">
                  4. Privacy and Your Future
                </div>
              </div>
              <div class="accordion-expand-btn-wrapper">
                  <span class="accordion-expand-btn js-accordion-expand-btn">+</span>
              </div>
          </dt>
          <dd class="accordion-desc" id="accordion-desc-3" aria-hidden="true">
              <div class="book__toc__chapter-col chapter__summary">
                <p>In “Privacy and Your Future,” Heather suggests a few critical areas that make the web a better place and lay the ground for future developers, designers, and project managers to build a better web for tomorrow’s users.</p>
             </div>
         </dd>
          <dt tabindex="0" class="accordion-item" id="accordion-item-4" aria-expanded="false">
              <div class="book__toc__accordion-text">
                <div class="book__toc__chapter-col chapter__title">
                  Postscript: Privacy and Health Data
                </div>
              </div>
              <div class="accordion-expand-btn-wrapper">
                  <span class="accordion-expand-btn js-accordion-expand-btn">+</span>
              </div>
          </dt>
          <dd class="accordion-desc" id="accordion-desc-4" aria-hidden="true">
              <div class="book__toc__chapter-col chapter__summary">
                <p>In the final section, “Privacy and Health Data,” Heather addresses an even more pressing recent issue: the obligations we have to safeguard user privacy and health data, and how to do it as best we can.</p>
             </div>
         </dd>
    <span></span></dl>
</div>

<p>Approx. 350 pages. <strong>eBook available for download in October, print shipping in early December.</strong> Written by Heather Burns. Cover design by Espen Brunborg.</p>

<figure style="margin-bottom:0;padding-bottom:0" class="break-out article__image">
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/23d21c34-bc5e-4cb0-a0e7-a95d35629dda/understanding-privacy-post-cover.png" title="Tap for a large preview of the book.">
    <img style="border-radius: 11px" src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/23d21c34-bc5e-4cb0-a0e7-a95d35629dda/understanding-privacy-post-cover.png" alt="Understanding Privacy">
    </a>
</figure>


<div class="book-cta__inverted">
	


	
	
	




















<div class="book-cta" data-handler="ContentTabs" data-mq="(max-width: 480px)">

  
 
<nav class="content-tabs content-tabs--books">
  <ul>
    <li class="content-tab">
      <a href="#">
        <button class="btn btn--small btn--white btn--white--bordered">
          Print + eBook
        </button>
      </a>
    </li>

    <li class="content-tab">
      <a href="#">
        <button class="btn btn--small btn--white btn--white--bordered">
          eBook
        </button>
      </a>
    </li>
  </ul>
</nav>


	<div class="book-cta__col book-cta__hardcover content-tab--content">
		<h3 class="book-cta__title">
			<span>Print + eBook</span>
		</h3>

		
			



	
	
	
	
	
	
	<script class="gocommerce-product" type="application/json" data-sku="understanding-privacy" data-type="Book">
	{
		"sku": "understanding-privacy",
		"type": "Book",
		"price": "44.00",
		
		"prices": [{
			"amount": "44.00",
			"currency": "USD",
			"items": [
				{"amount": "34.00", "type": "Book"},
				{"amount": "10.00", "type": "E-Book"}
			]
		}, {
			"amount": "44.00",
			"currency": "EUR",
			"items": [
				{"amount": "34.00", "type": "Book"},
				{"amount": "10.00", "type": "E-Book"}
			]
		}
		]
	}
	</script>


<span class="book-cta__price" data-handler="PriceTag" data-sku="understanding-privacy" data-type="Book" data-insert="true">
  <span class="placeholder">
    
      
<span class="currency-sign">$</span>
44<span class="sup">.00</span>


    

    
  </span>
</span>

		
		<button class="btn btn--full btn--medium btn--text-shadow"
						
		        data-product-path="/printed-books/understanding-privacy/"
						data-product-sku="understanding-privacy"
            data-author="Heather Burns"
            data-authors=""
						data-link=""
						
            data-component="AddToCart">
			 Get Print + eBook
		</button>
		<p class="book-cta__desc">
			Quality hardcover. <a href="https://www.smashingmagazine.com/delivery-times/">Free worldwide shipping</a>. 100&nbsp;days money-back-guarantee.
		</p>
	</div>
	<div class="book-cta__col book-cta__ebook content-tab--content">
		<h3 class="book-cta__title">
			<span>eBook</span>
		</h3>

		
			<div data-audience="anonymous free supporter" data-remove="true">
				



	
	
	
	
	
	
	<script class="gocommerce-product" type="application/json" data-sku="understanding-privacy-ebook" data-type="E-Book">
	{
		"sku": "understanding-privacy-ebook",
		"type": "E-Book",
		"price": "19.00",
		
		"prices": [{
			"amount": "19.00",
			"currency": "USD"
		}, {
			"amount": "19.00",
			"currency": "EUR"
		}
		]
	}
	</script>


<span class="book-cta__price" data-handler="PriceTag" data-sku="understanding-privacy-ebook" data-type="E-Book" data-insert="true">
  <span class="placeholder">
    
      
<span class="currency-sign">$</span>
19<span class="sup">.00</span>


    

    
  </span>
</span>

			</div>
		

    
      <span class="book-cta__price hidden" data-audience="smashing member" data-remove="true">
        <span class="green">Free!</span>
      </span>
    

		<button class="btn btn--full btn--medium btn--text-shadow"
		        data-product-path="/printed-books/understanding-privacy/"
						data-product-sku="understanding-privacy-ebook"
            data-author="Heather Burns"
            data-authors=""
						data-link=""
            data-component="AddToCart"
						
            
              data-audience="anonymous free supporter"
              data-remove="true"
            
            >
			  Get the eBook
		</button>
		<p
      class="book-cta__desc"
      
        data-audience="anonymous free supporter"
        data-remove="true"
      
    >
			<strong>DRM-free,</strong> of course. 


	

	

	

ePUB, Kindle, PDF.<br/> Included with <a href="/membership/">your Smashing Membership</a>.
		</p>

    
  <div data-audience="smashing member" class="hidden" data-remove="true">
    <a href="understandingprivacypdf" class="btn btn--medium btn--green btn--full js-add-to-cart">
      Get the eBook
    </a>
    <p class="book-cta__desc book-cta__desc--light">
      <a href="understandingprivacypdf">Download PDF</a>, <a href="understandingprivacyepub">ePUB</a>, <a href="understandingprivacymobi">Kindle</a>.<br/>Thanks for being smashing!&nbsp;❤️
    </p>
  </div>


	</div>
</div>

</div>

<h2 id="about-the-author">About the Author</h2>

<p><a href="https://twitter.com/WebDevLaw"><img loading="lazy" decoding="async" style="float:right;margin-top:1em;margin-left:0.9em;margin-bottom:1em;border-radius:50%;    max-width:calc(50% - 5vh);height:auto;" src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/e0e633f8-d459-419c-9b2a-b60a828f9886/heather-burns-200px.jpg" width="150" height="150" alt="Heather Burns" /></a><em>Heather Burns</em> is a tech policy and regulation specialist. She advocates for an open web built around international standards of human rights, privacy, accessibility, and freedom of expression. She’s currently also an <a href="https://webdevlaw.uk/2022/07/07/announcement-im-an-internet-society-mid-career-fellow/">Internet Society Mid-Career Fellow</a>.</p>

<h2 id="technical-details">Technical Details</h2>

<ul>
<li>ISBN: <span class="small-caps">978-3-945749-64-7</span> (print)</li>
<li><strong>Quality hardcover</strong>, stitched binding, ribbon page marker.</li>
<li>Free worldwide airmail <strong>shipping from Germany starting in early December 2022</strong>.</li>
<li>eBook available for <strong>download in October 2022</strong> as PDF, ePUB, and Amazon Kindle.</li>
<li><a href="/printed-books/understanding-privacy/" data-product-sku="understanding-privacy" data-component="AddToCart" data-product-path="/printed-books/understanding-privacy/" data-silent="true"><srtong>Pre-order the book.</strong></a></li>
</ul>

<h2 id="community-matters">Community Matters ❤️</h2>

<p>Producing a book takes quite a bit of time, and we couldn’t pull it off without the support of our wonderful <strong>community</strong>. A huge shout-out to Smashing Members for the kind, ongoing support. The eBook is and always will be <a href="https://www.smashingmagazine.com/membership">free for <em>Smashing Members</em> as soon as it’s out</a>. Plus, Members get a friendly discount when purchasing their printed copy. Just sayin’! ;-)</p>

<h2 id="more-smashing-books-amp-goodies">More Smashing Books &amp; Goodies</h2>

<p>Promoting best practices and providing you with practical tips to master your daily coding and design challenges has always been (and will be) at the <strong>core of everything we do</strong> at Smashing.</p>

<p>In the past few years, we were very lucky to have worked together with some talented, caring people from the web community to publish their wealth of experience as <a href="/printed-books/">printed books that stand the test of time</a>. Steven and Stefan are two of these people. Have you checked out their books already?</p>

<div class="book-grid break-out book-grid__in-post">

<figure class="book--featured"><div class="book--featured__image"><a href="/printed-books/touch-design-for-mobile-interfaces/"><img loading="lazy" decoding="async" src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/b14658fc-bb2d-41a6-8d1a-70eaaf1b8ec8/touch-design-book-shop-opt.png" alt="Touch Design for Mobile Interfaces" width="160" height="232" /></a></div><figcaption><h4 class="book--featured__title"><a style="padding: 7px 0;text-decoration-skip-ink: auto;text-decoration-thickness: 1px;text-underline-offset: 1px;text-decoration-line: underline;text-decoration-color: #006fc6;" href="/printed-books/touch-design-for-mobile-interfaces/">Touch Design for Mobile Interfaces</a></h4><p class="book--featured__desc">Learn how touchscreen devices really work &mdash; and how people really use them.</p><p><a style="font-style: normal !important; color: #fff !important;" class="btn btn--medium btn--green" href="/printed-books/touch-design-for-mobile-interfaces/" data-product-path="/printed-books/touch-design-for-mobile-interfaces/" data-product-sku="touch-design-for-mobile-interfaces" data-component="AddToCart">Add to cart <span style="color:#fff;font-size:1em;">$44</span></a></p></figcaption></figure>

<figure class="book--featured"><div class="book--featured__image"><a href="/printed-books/typescript-in-50-lessons/"><img loading="lazy" decoding="async" src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/c2f2c6d6-4e85-449a-99f5-58bd053bc846/typescript-shop-cover-opt.png" alt="TypeScript in 50 Lessons" width="160" height="232" /></a></div><figcaption><h4 class="book--featured__title"><a href="/printed-books/typescript-in-50-lessons/" style="padding: 7px 0;text-decoration-skip-ink: auto;text-decoration-thickness: 1px;text-underline-offset: 1px;text-decoration-line: underline;text-decoration-color: #006fc6;">TypeScript In 50 Lessons</a></h4><p class="book--featured__desc">Everything you need to know about TypeScript, its type system, generics and its benefits.</p><p><a style="font-style: normal !important; color: #fff !important;" class="btn btn--medium btn--green" href="/printed-books/typescript-in-50-lessons/" data-product-path="/printed-books/typescript-in-50-lessons/" data-product-sku="typescript-in-50-lessons" data-component="AddToCart">Add to cart <span style="color:#fff;font-size:1em;">$44</span></a></p></figcaption></figure>

<figure class="book--featured"><div class="book--featured__image"><a href="/printed-books/checklist-cards/"><img loading="lazy" decoding="async" src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/efffa8a0-82a0-415a-8aa5-8684a32083eb/checklist-cards-box-opt.png"  width="160" height="232" alt="Interface Design Checklists Cards" /></a></div><figcaption><h4 class="book--featured__title"><a style="padding: 7px 0;text-decoration-skip-ink: auto;text-decoration-thickness: 1px;text-underline-offset: 1px;text-decoration-line: underline;text-decoration-color: #006fc6;" href="/printed-books/checklist-cards/">Interface Design Checklists</a></h4><p class="book--featured__desc">100 practical cards for common interface design challenges.</p>
<p><a style="font-style: normal !important; color: #fff !important;" class="btn btn--medium btn--green" href="/printed-books/checklist-cards/" data-product-path="/printed-books/checklist-cards/" data-product-sku="checklist-cards" data-component="AddToCart">Add to cart <span style="color:#fff;font-size:1em;">$39</span></a></p></figcaption></figure>

</div>

              </article>
            </body>
          </html>
        ]]></content:encoded></item><item><author>Alvaro Montoro</author><title>The Autofill Dark Pattern</title><link>https://www.smashingmagazine.com/2021/10/autofill-dark-pattern/</link><pubDate>Mon, 11 Oct 2021 10:00:00 +0000</pubDate><guid>https://www.smashingmagazine.com/2021/10/autofill-dark-pattern/</guid><description>A “dark pattern” is a deceptive UX pattern that tricks users into doing things they may not really want to do. Autofill is a widespread feature either by choice or by accident: who hasn’t accepted to let the browser save/use web form information, either on purpose or by mistake? In this article, Alvaro Montoro does a little experiment to find out how much privacy is taken away from users across three different browsers.</description><content:encoded><![CDATA[
          <html>
            <head>
              <meta charset="utf-8">
              <link rel="canonical" href="https://www.smashingmagazine.com/2021/10/autofill-dark-pattern/" />
              <title>The Autofill Dark Pattern</title>
            </head>
            <body>
              <article>
                <header>
                  <h1>The Autofill Dark Pattern</h1>
                  
                    
                    <address>Alvaro Montoro</address>
                  
                  <time datetime="2021-10-11T10:00:00&#43;00:00" class="op-published">2021-10-11T10:00:00+00:00</time>
                  <time datetime="2021-10-11T10:00:00&#43;00:00" class="op-modified">2026-02-09T03:03:08+00:00</time>
                </header>
                
                

<p>A newspaper sign-up form had fields for name, email, and password. So, I started typing on the name field, and the autofill suggested my profile. But there was something <em>funky</em>. The autocomplete suggestion included my mailing address. Needless to say, it was puzzling: the address was not a field in the form. Why was it even suggested?</p>

<p>By the time this question started forming in my mind, my brain had already signaled my finger to click on the suggestion, and it was done. Next, I was taken to a second form page which requested additional information like address, phone, date of birth, and so on. And all those fields had been pre-populated by the autofill functionality, too.</p>

<p>I sighed in relief. It was a “multi-stepped” form and not a trick by the website. It was a reputable newspaper, after all. I deleted all the optional information from the second page, completed the sign-up, and moved on.</p>

<p>That (troubled) interaction highlighted one of the <strong>risks of using autocompletion features</strong>.</p>

<div data-audience="non-subscriber" data-remove="true" class="feature-panel-container">

<aside class="feature-panel" style="">
<div class="feature-panel-left-col">

<div class="feature-panel-description"><p><strong>Web forms</strong> are at the center of every meaningful interaction. Meet Adam Silver&rsquo;s <strong><a href="https://www.smashingmagazine.com/printed-books/form-design-patterns/">Form Design Patterns</a></strong>, a practical guide to <strong>designing and building forms</strong> for the web.</p>
<a data-instant href="https://www.smashingmagazine.com/printed-books/form-design-patterns/" class="btn btn--green btn--large" style="">Jump to table of contents&nbsp;↬</a></div>
</div>
<div class="feature-panel-right-col"><a data-instant href="https://www.smashingmagazine.com/printed-books/form-design-patterns/" class="feature-panel-image-link">
<div class="feature-panel-image"><picture><source type="image/avif" srcSet="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/64e57b41-b7f1-4ae3-886a-806cce580ef9/form-design-patterns-shop-image-1-1.avif" />
<img
    loading="lazy"
    decoding="async"
    class="feature-panel-image-img"
    src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/51e0f837-d85d-4b28-bfab-1c9a47f0ce33/form-design-patterns-shop-image.png"
    alt="Feature Panel"
    width="481"
    height="698"
/>
</picture>
</div>
</a>
</div>
</aside>
</div>

<h2 id="autocomplete-and-autofill">Autocomplete And Autofill</h2>

<p>They may sound similar, but <strong><code>autocomplete</code> and autofill are not the same thing</strong>. Although they <em>are</em> closely related:</p>

<ul>
<li>Autofill is a browser feature that allows people to save information (on the browser or the OS) and use it on web forms.</li>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/autocomplete"><code>autocomplete</code> is an HTML attribute</a> that provides guidelines to the browser on how to (or not to) autofill in fields in a web form.</li>
</ul>

<p>We could say that autofill is the “what,” while autocomplete the “how”, i.e. <code>autofill</code> stores data and tries to match it in a web form (based on the fields’ <code>name</code>, <code>type</code>, or <code>id</code>), and <code>autocomplete</code> guides the browser on how to do it (what information is expected in each field).</p>

<p>Autocomplete is a powerful feature with many options that allows specifying <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/autocomplete#values">many different types of values</a>:</p>

<ul>
<li><strong>Personal</strong>: Name, address, phone, date of birth;</li>
<li><strong>Financial</strong>: credit card number, name, expiration date;</li>
<li><strong>Demographics</strong>: location, age, sex, language;</li>
<li><strong>Professional</strong>: company and job title.</li>
</ul>

<p>Autofill is a widespread feature either by choice or by accident: who hasn’t accepted to let the browser save/use web form information, either on purpose or by mistake? And that could be a problem — <a href="https://www.netsparker.com/blog/web-security/impact-autocomplete-feature-web-security/">especially combined with bad use of <code>autocomplete</code></a> (and the added outrageous number of phishing emails and SMS messages nowadays.)</p>

<h2 id="privacy-risks">Privacy Risks</h2>

<p>Both of these features present (at least) two main risks for the user, both related to their personal data and its privacy:</p>

<ol>
<li><strong>Non-visible fields are populated</strong> (this is not the same as fields with a hidden type);</li>
<li><strong>Autocompleted information can be read via JavaScript</strong> even before the user submits the form.</li>
</ol>

<p>This means that <strong>once a user selects to autofill the information, all the fields will be available for the developer to read</strong>. Again, independently of the user submitting the form or not, without the user knowing what fields were actually populated.</p>

<p>This last part is relative: knowing what fields are populated will depend on the browser. Safari and Firefox do a good job at this (as we’ll soon see below). On the other hand, Chrome, the most popular browser at the moment, offers a bad experience that may trick even the most knowledgeable users into sharing their personal information.</p>

<p>If we also consider the times in which the user accidentally chooses to populate the fields, this issue becomes more relevant. Let’s check it in more detail with an example.</p>

<h2 id="a-little-experiment">A Little Experiment</h2>

<p>I ran a little experiment creating a form with many fields and attaching the <code>autocomplete</code> attribute with different values. Then, I played a little with the form’s structure:</p>

<ul>
<li>I hid most of the fields by putting them in a container offscreen (instead of using <code>hidden</code> or <code>type=&quot;hidden&quot;</code>);</li>
<li>I removed the visually hidden fields from the tab order (so keyboard users would overlook the hidden fields);</li>
<li>I tried sorting the fields in a different order (and to my surprise, this impacted the autofill!).</li>
</ul>

<p>In the end, the code for the form looked like this:</p>

<div class="break-out">

 <pre><code class="language-javascript">&lt;form method="post" action="javascript:alertData()"&gt;
  &lt;label for="name"&gt;Full name&lt;/label&gt;&lt;input id="name" name="name" autocomplete="name" /&gt;&lt;br/&gt;
  &lt;label for="email"&gt;Email&lt;/label&gt;&lt;input id="email" name="email"/&gt;&lt;br/&gt;
  &lt;label for="postal-code"&gt;ZIP&lt;/label&gt;&lt;input id="postal-code" name="postal-code" autocomplete="postal-code"/&gt;
  &lt;div style="position:absolute;top:-10000in" class="hide-this"&gt;
    &lt;!-- Hidden --&gt;
    &lt;label for="firstname"&gt;First name&lt;/label&gt;&lt;input tabindex="-1" type="hidden" id="firstname" name="firstname" autocomplete="given-name" /&gt;&lt;br/&gt;
    &lt;label for="lastname"&gt;Last name&lt;/label&gt;&lt;input tabindex="-1"  id="lastname" name="lastname" autocomplete="family-name" /&gt;&lt;br/&gt;

    &lt;label for="honorific-prefix"&gt;honorific-prefix&lt;/label&gt;&lt;input tabindex="-1" id="honorific-prefix" name="honorific-prefix" autocomplete="honorific-prefix"/&gt;&lt;br/&gt;
    &lt;label for="organization"&gt;Organization&lt;/label&gt;&lt;input tabindex="-1" id="organization" name="organization" /&gt;&lt;br/&gt;
    &lt;label for="phone"&gt;Phone&lt;/label&gt;&lt;input tabindex="-1" id="phone" name="phone" autocomplete="tel" /&gt;&lt;br/&gt;

    &lt;label for="address"&gt;address&lt;/label&gt;&lt;input tabindex="-1" id="address" name="address" autocomplete="street-address" /&gt;&lt;br/&gt;
    &lt;label for="city"&gt;City&lt;/label&gt;&lt;input tabindex="-1" id="city" name="city" autocomplete="address-level2" /&gt;&lt;br/&gt;
    &lt;label for="state"&gt;State&lt;/label&gt;&lt;input tabindex="-1" id="state" name="state" autocomplete="address-level1" /&gt;&lt;br/&gt;
    &lt;label for="level3"&gt;Level3&lt;/label&gt;&lt;input tabindex="-1" id="level3" name="state" autocomplete="address-level3" /&gt;&lt;br/&gt;
    &lt;label for="level4"&gt;Level4&lt;/label&gt;&lt;input tabindex="-1" id="level4" name="state" autocomplete="address-level4" /&gt;&lt;br/&gt;
    &lt;label for="country"&gt;Country&lt;/label&gt;&lt;input tabindex="-1" id="country" name="country" autocomplete="country" /&gt;&lt;br/&gt;

    &lt;label for="birthday"&gt;Birthday&lt;/label&gt;&lt;input tabindex="-1" id="birthday" name="birthday" autocomplete="bday" /&gt;&lt;br/&gt;
    &lt;label for="language"&gt;Language&lt;/label&gt;&lt;input tabindex="-1" id="language" name="language" autocomplete="language" /&gt;&lt;br/&gt;
    &lt;label for="sex"&gt;Sex&lt;/label&gt;&lt;input tabindex="-1" id="sex" name="sex" autocomplete="sex" /&gt;&lt;br/&gt;
    &lt;label for="url"&gt;URL&lt;/label&gt;&lt;input tabindex="-1" id="url" name="url" autocomplete="url" /&gt;&lt;br/&gt;
    &lt;label for="photo"&gt;Photo&lt;/label&gt;&lt;input tabindex="-1" id="photo" name="photo" autocomplete="photo" /&gt;&lt;br/&gt;
    &lt;label for="impp"&gt;IMPP&lt;/label&gt;&lt;input tabindex="-1" id="impp" name="impp" autocomplete="impp" /&gt;&lt;br/&gt;

    &lt;label for="username"&gt;Username&lt;/label&gt;&lt;input tabindex="-1" id="username" name="username" autocomplete="username" /&gt;&lt;br/&gt;
    &lt;label for="password"&gt;Password&lt;/label&gt;&lt;input tabindex="-1" id="password" name="password" autocomplete="password" /&gt;&lt;br/&gt;
    &lt;label for="new-password"&gt;Password New&lt;/label&gt;&lt;input tabindex="-1" id="new-password" name="new-password" autocomplete="new-password" /&gt;&lt;br/&gt;
    &lt;label for="current-password"&gt;Password Current&lt;/label&gt;&lt;input tabindex="-1" id="current-password" name="current-password" autocomplete="current-password" /&gt;&lt;br/&gt;

    &lt;label for="cc"&gt;CC#&lt;/label&gt;&lt;input tabindex="-1" id="cc" name="cc" autocomplete="cc-number" /&gt;&lt;br/&gt;
    &lt;label for="cc-name"&gt;CC Name&lt;/label&gt;&lt;input tabindex="-1" id="cc-name" name="cc-name" autocomplete="cc-name" /&gt;&lt;br/&gt;
    &lt;label for="cc-expiration"&gt;CC expiration&lt;/label&gt;&lt;input tabindex="-1" id="cc-expiration" name="cc-expiration" autocomplete="cc-expiration" /&gt;&lt;br/&gt;
    &lt;label for="cc-zipcode"&gt;CC Zipcode&lt;/label&gt;&lt;input tabindex="-1" id="cc-zipcode" name="cc-zipcode" autocomplete="cc-postalcode" /&gt;&lt;br/&gt;
  &lt;/div&gt;
  &lt;button&gt;Submit&lt;/button&gt;
&lt;/form&gt;</code></pre>

</div>

<p><strong>Note:</strong> <em>I created this demo a while back, and <a href="https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#autofill">the standard is a living document</a>. Since then, some of the autocomplete names have changed. For example, now we can specify <code>new-password</code> and <code>current-password</code> or more details for address or credit card that were not available before.</em></p>

<p>That form had three visible fields (<code>name</code>, <code>email</code> and <code>zipcode</code>). While that form is common among insurance companies, cable, and other service providers, it may not be too widespread, so I reduced the form even more with a single email field. We see that everywhere to sign up to websites, newsletters, or updates. You can see a running demo <a href="https://jsfiddle.net/alvaromontoro/n2rp1zfe/">here</a>:</p>

<figure class="break-out">
	<p data-height="480"
	data-theme-id="light"
	data-slug-hash="xxLKVga"
	data-user="smashingmag"
	data-default-tab="result"
	class="codepen">See the Pen [Showing autofill/autocomplete dark pattern (II)](https://codepen.io/smashingmag/pen/xxLKVga) by <a href="https://codepen.io/alvaromontoro">Alvaro Montoro</a>.</p>
	<figcaption>See the Pen <a href="https://codepen.io/smashingmag/pen/xxLKVga">Showing autofill/autocomplete dark pattern (II)</a> by <a href="https://codepen.io/alvaromontoro">Alvaro Montoro</a>.</figcaption>
</figure>

<p>If you used autocomplete to fill in the form, you already shared more information than what you wanted (<strong>don’t worry, it’s all local and not shared with me</strong>). And in Chrome, it might have even looked like a perfectly normal subscription form.</p>

<p>If you don’t have/use autofill, don’t worry. Here’s a summary of how the experience is on three different browsers.</p>

<p><strong>Note</strong>: <em>All of these tests assume the use of Autofill and are based on a fake profile!</em></p>

<h3 id="safari">Safari</h3>

<p>When you click on a form control, Safari will show an icon on the right side of the field. Clicking on it will show a pop-up with the information that the browser will share with the form:</p>














<figure class="
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/b2e514e4-9973-49b3-a168-ea0f031d6605/1-autofill-dark-pattern.jpeg">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="691"
			height="357"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/b2e514e4-9973-49b3-a168-ea0f031d6605/1-autofill-dark-pattern.jpeg 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/b2e514e4-9973-49b3-a168-ea0f031d6605/1-autofill-dark-pattern.jpeg 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/b2e514e4-9973-49b3-a168-ea0f031d6605/1-autofill-dark-pattern.jpeg 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/b2e514e4-9973-49b3-a168-ea0f031d6605/1-autofill-dark-pattern.jpeg 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/b2e514e4-9973-49b3-a168-ea0f031d6605/1-autofill-dark-pattern.jpeg 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/b2e514e4-9973-49b3-a168-ea0f031d6605/1-autofill-dark-pattern.jpeg"
			
			sizes="100vw"
			alt="Screenshot of Safari autofill suggestion, indicating that it will share address, company, mobile phone, email, birthday"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      Screenshot of Safari autofill suggestion, indicating that it will share address, company, mobile phone, email, birthday... (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/b2e514e4-9973-49b3-a168-ea0f031d6605/1-autofill-dark-pattern.jpeg'>Large preview</a>)
    </figcaption>
  
</figure>

<p>A good thing: it displays all the data that will be shared as part of the form. Not only the data for the visible fields but all of them. At this point, the user may suspect something is not quite alright. There’s something fishy.</p>

<p>When I reduced the form to just the email field, Safari did something interesting. The autofill popup was different:</p>














<figure class="
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d491940e-35d6-4b1f-b15a-fdfc8777d307/2-autofill-dark-pattern.jpeg">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="582"
			height="316"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d491940e-35d6-4b1f-b15a-fdfc8777d307/2-autofill-dark-pattern.jpeg 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d491940e-35d6-4b1f-b15a-fdfc8777d307/2-autofill-dark-pattern.jpeg 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d491940e-35d6-4b1f-b15a-fdfc8777d307/2-autofill-dark-pattern.jpeg 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d491940e-35d6-4b1f-b15a-fdfc8777d307/2-autofill-dark-pattern.jpeg 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d491940e-35d6-4b1f-b15a-fdfc8777d307/2-autofill-dark-pattern.jpeg 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d491940e-35d6-4b1f-b15a-fdfc8777d307/2-autofill-dark-pattern.jpeg"
			
			sizes="100vw"
			alt="Screenshot of Safari autofill suggestion, showing the email, and below the profile"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      Screenshot of Safari autofill suggestion, showing the email, and below the profile. (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d491940e-35d6-4b1f-b15a-fdfc8777d307/2-autofill-dark-pattern.jpeg'>Large preview</a>)
    </figcaption>
  
</figure>

<p>It states that it will only share the email (and it only does share that piece of information). But the contact info below may be trickier. When we click on that button, the browser shows a summary of the profile with its shared data. But that is not clearly stated anywhere. It simply looks like a regular contact card with some “share/do not share” options. After clicking on the “Autofill” button, the form is populated with all the data. Not only the email:</p>














<figure class="
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/3a82f024-91e7-4f3d-bea1-b938b8951059/3-autofill-dark-pattern.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="467"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/3a82f024-91e7-4f3d-bea1-b938b8951059/3-autofill-dark-pattern.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/3a82f024-91e7-4f3d-bea1-b938b8951059/3-autofill-dark-pattern.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/3a82f024-91e7-4f3d-bea1-b938b8951059/3-autofill-dark-pattern.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/3a82f024-91e7-4f3d-bea1-b938b8951059/3-autofill-dark-pattern.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/3a82f024-91e7-4f3d-bea1-b938b8951059/3-autofill-dark-pattern.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/3a82f024-91e7-4f3d-bea1-b938b8951059/3-autofill-dark-pattern.png"
			
			sizes="100vw"
			alt="Screenshot of alert on Safari with all of the data"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      Screenshot of alert on Safari with all of the data. (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/3a82f024-91e7-4f3d-bea1-b938b8951059/3-autofill-dark-pattern.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>So there is a way for a user to share information with the form inadvertently. It’s tricky but not too far-fetched considering that it is the one “highlighted” with an icon out of the two possible options.</p>

<p>Funny thing, browsers separate the personal data from the credit card data, but Safari populated part of the credit card information based on the personal data (name and ZIP.)</p>

<div class="partners__lead-place"></div>

<h3 id="firefox">Firefox</h3>

<p>Using the autofill in Firefox is a bit more complex. It is not automatic like in Chrome, and there’s no icon like in Safari. Users will have to start typing or click a second time to see the autofill popup, which will have a note with every category that the browser will fill in, not only the visible fields:</p>














<figure class="
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/e0669d8d-d5f8-4bc2-982c-052c4ee06fce/4-autofill-dark-pattern.jpeg">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="618"
			height="330"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/e0669d8d-d5f8-4bc2-982c-052c4ee06fce/4-autofill-dark-pattern.jpeg 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/e0669d8d-d5f8-4bc2-982c-052c4ee06fce/4-autofill-dark-pattern.jpeg 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/e0669d8d-d5f8-4bc2-982c-052c4ee06fce/4-autofill-dark-pattern.jpeg 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/e0669d8d-d5f8-4bc2-982c-052c4ee06fce/4-autofill-dark-pattern.jpeg 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/e0669d8d-d5f8-4bc2-982c-052c4ee06fce/4-autofill-dark-pattern.jpeg 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/e0669d8d-d5f8-4bc2-982c-052c4ee06fce/4-autofill-dark-pattern.jpeg"
			
			sizes="100vw"
			alt="Screenshot of autofill popup on Firefox showing all the controls that will be populated"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      Screenshot of autofill popup on Firefox showing all the controls that will be populated. (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/e0669d8d-d5f8-4bc2-982c-052c4ee06fce/4-autofill-dark-pattern.jpeg'>Large preview</a>)
    </figcaption>
  
</figure>

<p>Testing with the email-only form, Firefox presented the same autofill popup stating which fields categories it would populate. No difference whatsoever.</p>

<p>And similarly to the other browsers, after the autofill ran, we could read all the values with JavaScript.</p>














<figure class="
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/5d3a2b3a-f5a9-428e-b867-391dd9930b7f/5-autofill-dark-pattern.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="500"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/5d3a2b3a-f5a9-428e-b867-391dd9930b7f/5-autofill-dark-pattern.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/5d3a2b3a-f5a9-428e-b867-391dd9930b7f/5-autofill-dark-pattern.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/5d3a2b3a-f5a9-428e-b867-391dd9930b7f/5-autofill-dark-pattern.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/5d3a2b3a-f5a9-428e-b867-391dd9930b7f/5-autofill-dark-pattern.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/5d3a2b3a-f5a9-428e-b867-391dd9930b7f/5-autofill-dark-pattern.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/5d3a2b3a-f5a9-428e-b867-391dd9930b7f/5-autofill-dark-pattern.png"
			
			sizes="100vw"
			alt="Screenshot of alert on Firefox with all of the data"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      Screenshot of alert on Firefox with all of the data. (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/5d3a2b3a-f5a9-428e-b867-391dd9930b7f/5-autofill-dark-pattern.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>Firefox was the best of the three: it clearly stated what information would be shared with the form independently of the fields or their order. And it <em>hid</em> the autofill functionality a second user interaction happened.</p>

<p>A keyboard user could select the autofill without realizing, by getting inside the popup bubble and pressing the tab key.</p>

<h3 id="chrome">Chrome</h3>

<p>Then it came the turn for Chrome. (Here I use “Chrome,” but the results were similar for several Chromium-based browsers tested.) I clicked on the field and, without any further interaction, the autofill popup showed. While Firefox and Safari had many things in common, Chrome is entirely different: it only shows two values, and both are visible.</p>














<figure class="
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/07f5c223-b555-4ad5-8337-079c348b39f2/6-autofill-dark-pattern.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="604"
			height="334"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/07f5c223-b555-4ad5-8337-079c348b39f2/6-autofill-dark-pattern.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/07f5c223-b555-4ad5-8337-079c348b39f2/6-autofill-dark-pattern.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/07f5c223-b555-4ad5-8337-079c348b39f2/6-autofill-dark-pattern.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/07f5c223-b555-4ad5-8337-079c348b39f2/6-autofill-dark-pattern.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/07f5c223-b555-4ad5-8337-079c348b39f2/6-autofill-dark-pattern.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/07f5c223-b555-4ad5-8337-079c348b39f2/6-autofill-dark-pattern.png"
			
			sizes="100vw"
			alt="Screenshot of autofill popup on Chrome showing only two fields: name and zip, both visible"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      Screenshot of autofill popup on Chrome showing only two fields: name and zip, both visible. (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/07f5c223-b555-4ad5-8337-079c348b39f2/6-autofill-dark-pattern.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>This display was by design. I picked the order of the fields on purpose to get that particular combination of visible controls and autocomplete suggestions. However, it looks like Chrome gives some autocomplete properties more “weight” for the second value. And that makes the popup change depending on the order of the fields in the form.</p>

<p>Testing with the second version of the form was not much better:</p>














<figure class="
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/a9328c4b-234d-4e10-9703-89f51537e0c1/7-autofill-dark-pattern.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="644"
			height="346"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/a9328c4b-234d-4e10-9703-89f51537e0c1/7-autofill-dark-pattern.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/a9328c4b-234d-4e10-9703-89f51537e0c1/7-autofill-dark-pattern.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/a9328c4b-234d-4e10-9703-89f51537e0c1/7-autofill-dark-pattern.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/a9328c4b-234d-4e10-9703-89f51537e0c1/7-autofill-dark-pattern.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/a9328c4b-234d-4e10-9703-89f51537e0c1/7-autofill-dark-pattern.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/a9328c4b-234d-4e10-9703-89f51537e0c1/7-autofill-dark-pattern.png"
			
			sizes="100vw"
			alt="Screenshot of autofill popup on Chrome showing only two fields: email and name (the only email is visible)"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      Screenshot of autofill popup on Chrome showing only two fields: email and name (the only email is visible). (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/a9328c4b-234d-4e10-9703-89f51537e0c1/7-autofill-dark-pattern.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>While the popup shows a field that is not visible (the name), it is unclear what the purpose of the name is on the popup. An experienced user may know this happens because the name is shared, but an average user (and even the experienced ones) may think the email is associated with the profile with that name. There is zero indication of the data that the browser will share with the form.</p>

<p>And as soon as the user clicks on the autofill button, the data is available for the developer to read with JavaScript:</p>














<figure class="
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/54fc0bba-541a-474a-b079-3319e1539b54/8-autofill-dark-pattern.jpeg">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="531"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/54fc0bba-541a-474a-b079-3319e1539b54/8-autofill-dark-pattern.jpeg 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/54fc0bba-541a-474a-b079-3319e1539b54/8-autofill-dark-pattern.jpeg 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/54fc0bba-541a-474a-b079-3319e1539b54/8-autofill-dark-pattern.jpeg 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/54fc0bba-541a-474a-b079-3319e1539b54/8-autofill-dark-pattern.jpeg 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/54fc0bba-541a-474a-b079-3319e1539b54/8-autofill-dark-pattern.jpeg 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/54fc0bba-541a-474a-b079-3319e1539b54/8-autofill-dark-pattern.jpeg"
			
			sizes="100vw"
			alt="Screenshot of alert on Chrome with all of the information"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      Screenshot of alert on Chrome with all of the information. (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/54fc0bba-541a-474a-b079-3319e1539b54/8-autofill-dark-pattern.jpeg'>Large preview</a>)
    </figcaption>
  
</figure>

<p>Chrome was the worst offender: it shared the information automatically, it was unclear what data was involved, and the autofill suggestions changed based on the controls’ order and attributes.</p>

<p>The first two issues are common to all/many browsers, to the point that it may even be considered a feature. However, the third issue is exclusive to Chromium browsers, and it facilitates a sketchy dark pattern.</p>

<p>This behavior would be more of an anecdote and not a problem if it wasn’t because <a href="https://gs.statcounter.com/browser-market-share/desktop/worldwide">Chrome takes a considerable market share</a> of the browsers online (includes Chrome and Chromium-based).</p>

<h2 id="the-dark-pattern">The Dark Pattern</h2>

<p>As you probably know, a <em>dark pattern</em> is a deceptive UX pattern that tricks users into doing things they may not really want to do.</p>

<blockquote>“When you use websites and apps, you don’t read every word on every page &mdash; you skim read and make assumptions. If a company wants to trick you into doing something, they can take advantage of this by making a page look like it is saying one thing when it is in fact saying another.”<br /><br />&mdash; Harry Brignull, <a href="https://www.darkpatterns.org/">darkpatterns.org</a></blockquote>

<p>The behavior described in the previous points is clearly a deceptive user experience. Non-experienced users will not realize that they are <strong>sharing their personal data</strong>. Even more tech-savvy people may get tricked by it as Chrome makes it look like the selected option belongs to a profile instead of clearly stating what information is being shared.</p>

<p>The browser implementations cause this behavior, but it requires the developer to set it in place to exploit it. Unfortunately, there already are companies willing to exploit it, selling it as a feature to get leads.</p>

<p>As long as a dark pattern goes, it may also be an illegal one. This is because it breaks many principles relating to the processing of personal data specified in article 5 of the European <a href="https://eur-lex.europa.eu/legal-content/EN/TXT/HTML/?uri=CELEX:02016R0679-20160504&amp;from=EN#tocId9">General Data Protection Regulation</a> (GDPR):</p>

<ul>
<li><strong>Lawfulness, fairness, and transparency</strong><br />
The process is all but transparent.</li>
<li><strong>Purpose limitation</strong><br />
The data is processed in a way incompatible with the initial purpose.</li>
<li><strong>Data minimization</strong><br />
It is quite the opposite. Data maximization: get as much information as possible.</li>
</ul>

<p>For example, if you want to sign up for a newsletter or request information about a product, and you provide your email, the website has no legal right to get your name, address, date of birth, phone number, or anything else without your consent or knowledge. Even if you considered that the user gave permission when clicking on the autofill, the purpose of the obtained data does not match the original intent of the form.</p>

<div class="partners__lead-place"></div>

<h2 id="possible-solutions">Possible Solutions</h2>

<p>To avoid the problem, all actors need to contribute and help fix the issue:</p>

<ol>
<li><a href="https://www.smashingmagazine.com/2021/10/autofill-dark-pattern/#1-users">Users</a></li>
<li><a href="https://www.smashingmagazine.com/2021/10/autofill-dark-pattern/#2-developers-and-designers">Developers and designers</a></li>
<li><a href="https://www.smashingmagazine.com/2021/10/autofill-dark-pattern/#3-browsers">Browsers</a></li>
</ol>

<h3 id="1-users">1. Users</h3>

<p>The only thing on the user side would be to <strong>ensure that the data displayed in the autofill popup is correct</strong>.</p>

<p>But we need to remember that the user is the victim here. We could <em>blame</em> them for not paying enough attention when clicking on the autofill, but that would be unfair. Plus, there are many reasons why a person could click on the button by mistake and share their data by accident. So even well-intentioned and savvy users may fall for it.</p>

<h3 id="2-developers-and-designers">2. Developers And Designers</h3>

<p>Let’s be honest. While the developers are not the root cause of the problem, they play a key role in exploiting the dark pattern. Either accidentally or with malicious intent.</p>

<p>And let’s <strong>be responsible and honest</strong> (this time in a literal way), because that’s the thing that developers and designers can do to build trust and make good use of the autofill and autocomplete features:</p>

<ul>
<li>Only auto-complete the data that you need.</li>
<li>State clearly which data will be collected.</li>
<li>Do not hide form fields that will be later submitted.</li>
<li>Do not mislead or trick users into sending more data.</li>
</ul>

<p>As an extreme measure, maybe try to avoid autocompleting certain fields. But, of course, this brings other issues as it will make the form less usable and accessible. So finding a balance may be tricky.</p>

<p>All this is without considering the possibility of an XSS vulnerability that could exploit the dark pattern. Of course, that would be a completely different story and an even more significant problem.</p>

<h3 id="3-browsers">3. Browsers</h3>

<p>Much of the work would need to be done from the browser side (especially on the Chromium side). But let me start by stating that not all is bad with how web browsers handle autofill/autocomplete. Many things are good. For example:</p>

<ul>
<li><strong>They limit the data that can be shared</strong><br />
Browsers have a list of fields for auto-complete that may not include all the values described in the HTML standard.</li>
<li><strong>They encapsulate and group data</strong><br />
Browsers separate personal and financial information to protect critical values like credit cards. Safari had some issues with this, but it was minor.</li>
<li><strong>They warn about the data that will be shared</strong><br />
Sometimes this may be incomplete (Chrome) or not clear (Safari), but they do alert the user.</li>
</ul>

<p>Still, some things can be improved by many or all of the web browsers.</p>

<h4 id="show-all-fields-that-will-be-autocompleted">Show All Fields That Will Be Autocompleted</h4>

<p>Browsers should always show a list of all the fields that will be autocompleted within the autofill popup (instead of just a partial list.) Also, the information should be clearly identified as data to be shared instead of being displayed as a regular contact card that could be misleading.</p>

<p>Firefox did an excellent job at this point, Safari did a nice job in general, and Chrome was subpar compared to the other two.</p>

<h4 id="do-not-trigger-the-onchange-event-on-autofill">Do Not Trigger The <code>onChange</code> Event On Autofill</h4>

<p>This would be a problematic request because this behavior is part of the <a href="https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#autofill-processing-model">Autofill definition in the HTML standard</a>:</p>

<blockquote>“The autocompletion mechanism must be implemented by the user agent acting as if the user had modified the control’s data [...].”</blockquote>

<p>This means that browsers should treat the autocompleted data as if it had been entered by the user, thus triggering all the events, showing the values, etc. Even on a non-visually available field.</p>

<p>Preventing this behavior on non-visible elements could solve the problem. But validating if a form control is visible or not could be costly for the browser. Also, this solution is only partial because developers could still read the values even without the inputs triggering events.</p>

<h4 id="do-not-allow-devs-to-read-autocompleted-fields-before-submission">Do Not Allow Devs To Read Autocompleted Fields Before Submission</h4>

<p>This would also be problematic because many developers often rely on reading the field values before submission to validate the values (e.g., when the user moves away from the inputs.) But it would make sense: the user doesn’t want to share the information until they submit the form, so the browser shouldn’t either.</p>

<p>An alternative to this would be providing fake data when reading autocompleted values. <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Privacy_and_the_:visited_selector">Web browsers already do something like this with visited links</a>, why not do the same with autocompleted form fields? Provide gibberish as the name, a valid address that matches local authorities instead of the user’s address, a fake phone number? This could solve the developer validation needs while protecting the user’s personal information.</p>

<p>Displaying a complete list of the fields/values that the browser will clearly share with the form would be a great step forward. The other two are ideal but more of stretch goals. Still, they are initiatives that would considerably improve privacy.</p>

<p>Would the autofill dark pattern still be possible to exploit? Unfortunately, yes. But it would be a lot more complicated. And at this point, it would be the user’s responsibility and the developer’s duty to avoid such a situation.</p>

<h2 id="conclusion">Conclusion</h2>

<p>We can argue that autocomplete is not a huge security issue (not even on Chrome) because it requires <strong>user interaction</strong> to select the information. However, we could also argue that the potential loss of data justifies proper action. And Chrome has done more changes for (relatively) less important security/usability concerns (<a href="https://www.theregister.com/2021/08/05/google_chrome_iframe/">see <code>alert()</code>, <code>prompt()</code>, and <code>confirm()</code></a> than what could be done to protect key personal information.</p>

<p>Then we have the issue of the dark pattern. It can be avoided if everyone does their part:</p>

<ul>
<li>Users should be careful with what forms/data they autofill;</li>
<li>Developers should avoid exploiting that data;</li>
<li>Browsers should do a better job at protecting people’s data.</li>
</ul>

<p>At the root, <strong>this dark pattern is a browser issue</strong> (and mainly a Chrome issue), and not a small one (privacy should be key online). But there is a choice. In the end, exploiting the dark pattern or not is up to the developers. So let’s pick wisely and do the right thing.</p>

<h3 id="further-reading">Further Reading</h3>

<ul>
<li><a href="https://www.smashingmagazine.com/2017/05/better-form-design-one-thing-per-page/">Better Form Design: One Thing Per Page (Case Study)</a>, Adam Silver</li>
<li><a href="https://www.smashingmagazine.com/2019/04/privacy-concerns-ux-web-forms/">Common Concerns And Privacy In Web Forms</a>, Vitaly Friedman</li>
<li><a href="https://www.smashingmagazine.com/2021/09/simplifying-form-styles-accent-color/">Simplifying Form Styles With <code>accent-color</code></a>, Michelle Barker</li>
<li><a href="https://www.smashingmagazine.com/2019/01/html5-input-types/">HTML5 Input Types: Where Are They Now?</a>, Drew McLellan</li>
</ul>

<div class="signature">
  <img src="https://www.smashingmagazine.com/images/logo/logo--red.png" alt="Smashing Editorial" width="35" height="46" loading="lazy" decoding="async" />
  <span>(vf, yk, il, mrn)</span>
</div>


              </article>
            </body>
          </html>
        ]]></content:encoded></item><item><author>Ken Harker</author><title>Are Imposter Domains Re-Publishing Your Website?</title><link>https://www.smashingmagazine.com/2021/09/imposter-domains-republishing-website/</link><pubDate>Mon, 20 Sep 2021 11:30:00 +0000</pubDate><guid>https://www.smashingmagazine.com/2021/09/imposter-domains-republishing-website/</guid><description>In the right circumstances, your web analytics or real user measurement data can offer visibility into the world of imposter domains, used by web scrapers to re-publish your site content on their servers. Content scraping is a fact of life on the Internet. When you think of web scraping, you probably do not think about the scrapers turning around and immediately serving your entire, whole page content on another website. But what if your site content is being re-published? It might be already happening.</description><content:encoded><![CDATA[
          <html>
            <head>
              <meta charset="utf-8">
              <link rel="canonical" href="https://www.smashingmagazine.com/2021/09/imposter-domains-republishing-website/" />
              <title>Are Imposter Domains Re-Publishing Your Website?</title>
            </head>
            <body>
              <article>
                <header>
                  <h1>Are Imposter Domains Re-Publishing Your Website?</h1>
                  
                    
                    <address>Ken Harker</address>
                  
                  <time datetime="2021-09-20T11:30:00&#43;00:00" class="op-published">2021-09-20T11:30:00+00:00</time>
                  <time datetime="2021-09-20T11:30:00&#43;00:00" class="op-modified">2026-02-09T03:03:08+00:00</time>
                </header>
                
                

<p>We think of web scraping as a tool used to harvest web content for information analysis purposes, sometimes to the detriment of the site owner. For example, someone might web scrape all the product pages of a competitor’s retail site to harvest information about products being offered and current pricing to try to gain a competitive edge.</p>

<p>Web scraping can be used to harvest marketing data, such as identifying good keywords for advertising campaigns, identifying trending topics for blog posts, or identifying influencers in important blogs and news sites. Manufacturers might scrape retail sites to make sure that <strong>M</strong>anufacturer <strong>A</strong>dvertised <strong>P</strong>ricing (<strong>MAP</strong>) is being adhered to, and security auditors might scrape sites to look for vulnerabilities or breaches in privacy policies. And of course, scrapers could scrape your site to look for security vulnerabilities or exposed contact or sales lead details. None of these activities would result in the scraped content being re-published or delivered to end-users.</p>

<p>There are situations, however, where the scraped web page content is delivered as a page itself directly to visitors. As we shall see below, this can be done for benign or not-so-benign reasons. In the worst-case scenarios, these can be true imposter domains, seeking to engage with real users <strong>without acknowledging the true source of your content</strong>. Even in benign use cases, however, you lose some control over the visitor’s experience. When your content is delivered by other means, from other servers or platforms, it can put the user experience and commercial relationship you have built up with your users at risk.</p>

<p>How can you identify, track, and manage this risk to your business? We explore how you can <strong>use web analytics or real user measurement data</strong> on your website to get insight into any imposter domains re-publishing your work. We also describe the most common types of content re-publishing we see in real-world data we collected in Akamai mPulse, both benign and problematic, so you know what to look for in your data.</p>

<div data-audience="non-subscriber" data-remove="true" class="feature-panel-container">

<aside class="feature-panel" style="">
<div class="feature-panel-left-col">

<div class="feature-panel-description"><p><strong>Web forms</strong> are at the center of every meaningful interaction. Meet Adam Silver&rsquo;s <strong><a href="https://www.smashingmagazine.com/printed-books/form-design-patterns/">Form Design Patterns</a></strong>, a practical guide to <strong>designing and building forms</strong> for the web.</p>
<a data-instant href="https://www.smashingmagazine.com/printed-books/form-design-patterns/" class="btn btn--green btn--large" style="">Jump to table of contents&nbsp;↬</a></div>
</div>
<div class="feature-panel-right-col"><a data-instant href="https://www.smashingmagazine.com/printed-books/form-design-patterns/" class="feature-panel-image-link">
<div class="feature-panel-image"><picture><source type="image/avif" srcSet="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/64e57b41-b7f1-4ae3-886a-806cce580ef9/form-design-patterns-shop-image-1-1.avif" />
<img
    loading="lazy"
    decoding="async"
    class="feature-panel-image-img"
    src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/51e0f837-d85d-4b28-bfab-1c9a47f0ce33/form-design-patterns-shop-image.png"
    alt="Feature Panel"
    width="481"
    height="698"
/>
</picture>
</div>
</a>
</div>
</aside>
</div>

<h2 id="how-to-track-suspicious-activity">How To Track Suspicious Activity</h2>

<p>If you are just starting out wondering if someone might be re-publishing your web content, the easiest thing to do is a Google search. Copy a ten or twelve-word sentence from a page of interest on your site into the Google search bar, put it inside double-quotes, and click on Search. You should hopefully see your own site in the search results, but if you are finding that exact sentence matching on other sites, <strong>you may be the victim of re-publishing</strong>. This approach is obviously a bit ad-hoc. You could maybe script up some Google searches to run these kinds of checks periodically. But how many pages do you check? How can you reliably pick the content on the pages that the re-publishing is not going to modify?  And what if the re-published page views never make it into Google’s search results?</p>

<p>A better approach is to use the data you are already collecting with your web analytics or <strong>R</strong>eal <strong>U</strong>ser <strong>M</strong>easurement (<strong>RUM</strong>) services. These services vary considerably in their capabilities and the depth of data that is collected. They all generally are instrumented as JavaScript processes that are loaded onto your site’s web pages through a tag or snippet of loader code. When the service determines that a page view (and/or some other user activity of interest) is completed, it sends a “beacon” of data back to a collection system, where the data is then further processed, aggregated, and stored for future analysis.</p>

<p>To help identify the re-publishing of web pages by imposter domains, what you want is a service that:</p>

<ul>
<li><strong>Collects data</strong> for every page view on the site (ideally);</li>
<li><strong>Collects the full URL of the base page</strong> HTML resource of the page view;</li>
<li><strong>Accepts beacons</strong> even if the hostname in that base page URL is not the one your site is published under;</li>
<li>Allows you to <strong>query the collected data</strong> yourself and/or already has data queries designed to find “imposter domains”.</li>
</ul>

<h2 id="what-happens-when-a-web-page-is-re-published">What Happens When A Web Page Is Re-Published?</h2>

<p>When a web page is scraped with the intention of being delivered as a complete page view to an end-user, the scraper may modify the content. The modifications may be extensive. Modifying some content is easier than others, and while an imposter domain might change text or images, modifying JavaScript can be a more challenging proposition. Attempted modifications in JavaScript might break page functionality, inhibit proper rendering, or present other problems.</p>

<p>The good news for us is that web analytics trackers or real user measurement services are instrumented as JavaScript and many imposter domains are unlikely to try to modify the content to remove them because of the risks that it might break the page. If the scraper does not intentionally remove the loader snippet code or tag for your web analytics or RUM service, generally speaking, they will load successfully and generate a beacon for the page view — <strong>giving you evidence of the imposter domain activity</strong>.</p>

<p>This is the key to tracking imposter domains with web analytics or RUM data. Even if none of the page content is delivered from your platform or servers, so long as the JavaScript code you are using for analytics or performance tracking loads, you can still get data about the page view.</p>

<h2 id="turning-the-data-into-information">Turning The Data Into Information</h2>

<p>Now that you have data, you can mine it for evidence of imposter domains. At the most basic, this is a database query that counts the number of page views by each hostname in the page URL, something like this pseudocode:</p>

<pre><code class="language-javascript">results = query("""
  select
    host,
    count(*) as count
  from
    $(tableName)
  where
    timestamp between '$(startTime)' and '$(endTime)'
    and url not like 'file:%'
  group by 1
  order by 2 desc
""");
</code></pre>

<p>Any hostname in the results that is not one your site uses is an imposter domain and worth investigating. For ongoing monitoring of the data, you will likely want to categorize the imposter domains you see in the data and have identified.</p>

<p>For example, some domains used by Natural Language Translation services that <strong>re-publish entire web pages</strong> might look like this:</p>

<pre><code class="language-markup"># Translation domains
translationDomains = ["convertlanguage.com","dichtienghoa.com","dict.longdo.com",
  "motionpoint.com","motionpoint.net","opentrad.com","papago.naver.net","rewordify.com",
  "trans.hiragana.jp","translate.baiducontent.com","translate.goog",
  "translate.googleusercontent.com","translate.sogoucdn.com","translate.weblio.jp",
  "translatetheweb.com","translatoruser-int.com","transperfect.com","webtrans.yodao.com",
  "webtranslate.tilde.com","worldlingo.com"]
</code></pre>

<p>Depending on your needs, you might build up arrays of “acceptable” and “problem” domains, or categorize the imposter domains by their function or type. Below are the most common types of imposter domains you might see in real-world data.</p>

<h2 id="benign-re-publishing">Benign Re-publishing</h2>

<p>Not all scraped web pages delivered from a third-party domain are going to be malicious. Based on looking at Akamai mPulse data across a broad spectrum of customers, most <strong>page views from imposter domains</strong> are actually services that a site visitor is intentionally choosing to use. A site visitor may be able to enjoy page content that they would find inaccessible. In some cases, the services are likely being used by the employees of the site owner itself.</p>

<p>The major categories described here are by no means exhaustive.</p>

<h3 id="natural-language-translation">Natural Language Translation</h3>

<p>The most common imposter domains are those used by natural language translation services. These services can scrape a web page, translate the encoded text on the page into another language and deliver that modified content to the end-user.</p>

<p>The page that the end-user sees will have a URL from the top-level domain of the translation service (such as translate.goog, translatoruser-int.com, or translate.weblio.jp among many others). rewordify.com changes the English text on a page into simpler sentences for beginning English speakers. While <strong>you have no control over the quality of the translations</strong> or the performance of the delivered page experience, it is safe to assume that most site owners would not consider this to be a business risk or concern.</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/e7c17c86-61eb-4b17-93a9-fcbcbc523b14/3-imposter-domains-republishing-website.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="723"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/e7c17c86-61eb-4b17-93a9-fcbcbc523b14/3-imposter-domains-republishing-website.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/e7c17c86-61eb-4b17-93a9-fcbcbc523b14/3-imposter-domains-republishing-website.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/e7c17c86-61eb-4b17-93a9-fcbcbc523b14/3-imposter-domains-republishing-website.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/e7c17c86-61eb-4b17-93a9-fcbcbc523b14/3-imposter-domains-republishing-website.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/e7c17c86-61eb-4b17-93a9-fcbcbc523b14/3-imposter-domains-republishing-website.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/e7c17c86-61eb-4b17-93a9-fcbcbc523b14/3-imposter-domains-republishing-website.png"
			
			sizes="100vw"
			alt="A screenshot of a natural language translation service presenting a news web site article translated from English to Japanese."
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      A natural language translation service presenting a news website article translated from English to Japanese. (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/e7c17c86-61eb-4b17-93a9-fcbcbc523b14/3-imposter-domains-republishing-website.png'>Large preview</a>)
    </figcaption>
  
</figure>

<h3 id="search-engine-and-web-archive-cached-results">Search Engine And Web Archive Cached Results</h3>

<p>Another common category of imposter domains are domains used by search engines for delivering cached results or archived versions of page views. Typically, these would be pages that might no longer be available on the site but are available in third-party archives.</p>

<p>You might want to know about the frequency of these page views and <strong>deeper analysis could determine the specifics</strong> of what end-users were seeking in the online caches and archives. With the full URL for each request made to the online caches and archives, you should be able to identify keywords or topics that feature most often in those kinds of page views.</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/6fccd0aa-161d-44a8-8aad-ded00da451da/2-imposter-domains-republishing-website.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="84"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/6fccd0aa-161d-44a8-8aad-ded00da451da/2-imposter-domains-republishing-website.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/6fccd0aa-161d-44a8-8aad-ded00da451da/2-imposter-domains-republishing-website.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/6fccd0aa-161d-44a8-8aad-ded00da451da/2-imposter-domains-republishing-website.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/6fccd0aa-161d-44a8-8aad-ded00da451da/2-imposter-domains-republishing-website.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/6fccd0aa-161d-44a8-8aad-ded00da451da/2-imposter-domains-republishing-website.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/6fccd0aa-161d-44a8-8aad-ded00da451da/2-imposter-domains-republishing-website.png"
			
			sizes="100vw"
			alt="An example screenshot of the message that appears above a cached search result in Google’s search service."
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      The message that appears above a cached search result in Google’s search service. (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/6fccd0aa-161d-44a8-8aad-ded00da451da/2-imposter-domains-republishing-website.png'>Large preview</a>)
    </figcaption>
  
</figure>

<h3 id="developer-tools">Developer Tools</h3>

<p>These services will typically be used by your own employees as part of the natural business of developing and running your site. A typical developer tool might scrape an entire web page, analyze it for syntax errors in JavaScript, XML, HTML, or CSS, and display <strong>a marked-up version of the page</strong> for the developer to explore.</p>

<p>In addition to syntax errors, tools might also evaluate a site for compliance with accessibility or other legally required standards. Some example services seen in the real world include codebeautify.org, webaim.org, and jsonformatter.org.</p>

<h3 id="content-publishing-tools">Content Publishing Tools</h3>

<p>Very similar to developer tools are tools that you might use to manage your content publishing needs. The most commonly seen example is the <a href="https://ads.google.com/anon/AdPreview">Google Ads Preview</a> tool, which fetches a page, modifies it to include an ad tag and ad content from Google, and displays it to the site owner to see what the result would look like if published.</p>

<p>Another kind of content publishing tool is a service that fetches a web page, checks it against databases for any <strong>potential copyright violation or plagiarism</strong>, and displays the page with markup to identify any potentially offending content.</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/99e77741-ee4e-4bb9-9893-e5df37d25f8b/7-imposter-domains-republishing-website.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="605"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/99e77741-ee4e-4bb9-9893-e5df37d25f8b/7-imposter-domains-republishing-website.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/99e77741-ee4e-4bb9-9893-e5df37d25f8b/7-imposter-domains-republishing-website.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/99e77741-ee4e-4bb9-9893-e5df37d25f8b/7-imposter-domains-republishing-website.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/99e77741-ee4e-4bb9-9893-e5df37d25f8b/7-imposter-domains-republishing-website.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/99e77741-ee4e-4bb9-9893-e5df37d25f8b/7-imposter-domains-republishing-website.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/99e77741-ee4e-4bb9-9893-e5df37d25f8b/7-imposter-domains-republishing-website.png"
			
			sizes="100vw"
			alt="A screenshot of an online service that loads a web page in its entirety and highlights any portion of the page that contains text found in databases of previously published content."
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      An example of an online service that loads a web page in its entirety and highlights any portion of the page that contains text found in databases of previously published content. (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/99e77741-ee4e-4bb9-9893-e5df37d25f8b/7-imposter-domains-republishing-website.png'>Large preview</a>)
    </figcaption>
  
</figure>

<div class="partners__lead-place"></div>

<h3 id="transcoder-domains">Transcoder Domains</h3>

<p>Some services deliver a web page in altered form for either improved performance or improved display characteristics. The most common service of this type is <a href="https://support.google.com/websearch/answer/9836344?hl=en">Google Web Light</a>. Available in a limited number of countries on Android OS devices with slow mobile network connections, Google Web Light transcodes the web page to deliver <strong>up to 80% fewer bytes</strong> while preserving a &ldquo;majority of the relevant content&rdquo; all in the name of delivering the content into the Android Mobile browser that much faster.</p>

<p>Other transcoder services modify the page content to change its presentation, e.g. <a href="https://www.printwhatyoulike.com/">printwhatyoulike.com</a> removes advertising elements in preparation for printing to paper, and <a href="https://marker.to/">marker.to</a> lets a user &ldquo;mark up&rdquo; a web page with a virtual yellow highlighter and share the page with others. While transcoder services can be well-intended, there is potential for both abuse (removing advertising) and potential questions of content integrity that you, as a site owner, need to be aware of.</p>

<h3 id="locally-saved-copies-of-web-pages">Locally Saved Copies Of Web Pages</h3>

<p>While not common, we do see beacons in the Akamai mPulse data with pages served from <code>file://</code> URLs. These are page views loaded from a previously-viewed web page that was saved to device local storage. Because every device could have <strong>a different file system structure</strong>, resulting in an infinite number of &ldquo;domains&rdquo; in the URL data, it generally does not make sense to try to aggregate these for patterns. It is safe to assume that site owners would not consider this to be a business risk or concern.</p>

<h3 id="web-proxy-services">Web Proxy Services</h3>

<p>Another category of imposter domains that <em>may</em> be acceptable are those used by web proxy services. There are two large subcategories of presumed benign proxy services. One is <strong>institutional proxies</strong>, such as a university library system subscribing to an online news publication in order to grant access to its student body. When a student views the site, the page may be delivered from a host name in the university’s top-level domain.</p>

<p>It is safe to assume that most publishers would not consider this to be a business risk or concern if it is part of their business model. The other major type of benign proxies are <strong>sites that aim to offer anonymity</strong> so that visitors can consume a website content without being tracked or identified. The most common example of that latter subcategory is the anonymousbrowser.org service. The users of these services may or may not be well-intentioned.</p>

<h2 id="malicious-re-publishing">Malicious Re-Publishing</h2>

<p>While we have seen that there can be benign reasons for a web page to be scraped and then delivered from an alternative domain (and in fact, research shows that benign use cases are by far the most commonly seen in the Akamai mPulse real user measurement data), there are certainly instances where the intentions of the scrapers are malicious. <strong>Scraped content can be used to generate revenue</strong> in a variety of ways from simply passing off stolen content as one’s own to attempting to steal credentials or other secrets. Malicious use cases can harm both the site owner and/or the site visitor.</p>

<h3 id="ad-scraping">Ad Scraping</h3>

<p>In the publishing industry, ad revenue is critical to the commercial success or failure of websites. Of course, selling ads requires content that visitors want to consume, and some bad actors may find it easier to steal that content than to create it themselves. <strong>Ad scrapers can harvest entire articles from a site</strong> and re-publish them on a different top-level domain with completely new advertising tags. If the scraper is not sophisticated enough to fully separate the content from the page structure, and for example includes core page JavaScript code including the loader snippet for your web analytics or RUM service, you can get beacons of data for these page views.</p>

<h3 id="phishing">Phishing</h3>

<p>Phishing is a fraudulent attempt to get users to reveal sensitive or private information such as access credentials, credit card numbers, social security numbers, or other data by impersonating a trusted site. To look as authentic as possible, phishing sites are often built by <strong>scraping the legitimate site that they aim to impersonate</strong>. Again, if the scraper is not sophisticated enough to fully separate the content from the page structure, and for example includes core page code including the loader snippet for your web analytics or RUM service, you can get beacons for these page views in mPulse.</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/c731ff42-8136-4f3a-82b1-e011af074f02/5-imposter-domains-republishing-website.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="559"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/c731ff42-8136-4f3a-82b1-e011af074f02/5-imposter-domains-republishing-website.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/c731ff42-8136-4f3a-82b1-e011af074f02/5-imposter-domains-republishing-website.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/c731ff42-8136-4f3a-82b1-e011af074f02/5-imposter-domains-republishing-website.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/c731ff42-8136-4f3a-82b1-e011af074f02/5-imposter-domains-republishing-website.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/c731ff42-8136-4f3a-82b1-e011af074f02/5-imposter-domains-republishing-website.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/c731ff42-8136-4f3a-82b1-e011af074f02/5-imposter-domains-republishing-website.png"
			
			sizes="100vw"
			alt="A typical browser alert message informing the user that the web page they are about to see is re-published content from another web site that has been altered to deceive the visitor into interacting with it as if it were legitimate."
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      A typical browser alert message informing the user that the web page they are about to see is re-published content from another web site that has been altered to deceive the visitor into interacting with it as if it were legitimate. (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/c731ff42-8136-4f3a-82b1-e011af074f02/5-imposter-domains-republishing-website.png'>Large preview</a>)
    </figcaption>
  
</figure>

<h3 id="browser-or-search-hijacking">Browser Or Search Hijacking</h3>

<p>A web page may be scraped and re-published with additional JavaScript that contains browser or search hijacking attack code. Unlike phishing, which tempts users to surrender valuable data, this kind of attack <strong>attempts to make changes to the browser settings</strong>. Simply changing the browser’s default search engine to point to one that the attacker gains affiliate search result revenue from could be profitable for a bad actor. If the scraper is not sophisticated, injecting new attack code but not changing the pre-existing core page code including the loader snippet for your web analytics or RUM service, you can get beacons for these page views in mPulse.</p>

<h3 id="paywall-or-subscription-bypass-proxies">Paywall Or Subscription Bypass Proxies</h3>

<p>Some services claim to help end-users access pages on sites that require subscriptions to view without having a valid login. For some content publishers, subscription fees can be a very significant portion of site revenue. For others, logins may be required to remain in legal compliance for users to consume content that is restricted by age, citizenship, residency, or other criteria.</p>

<p>Proxy services that bypass (or attempt to bypass) these access restrictions pose <strong>financial and legal risks to your business</strong>. Subjectively, many of these services appear to be focused specifically on pornography sites, but all website owners should be on the lookout for these bad actors.</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/cc81b29a-ed90-4ba7-9081-9a7f6b9f7ff3/1-imposter-domains-republishing-website.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="431"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/cc81b29a-ed90-4ba7-9081-9a7f6b9f7ff3/1-imposter-domains-republishing-website.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/cc81b29a-ed90-4ba7-9081-9a7f6b9f7ff3/1-imposter-domains-republishing-website.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/cc81b29a-ed90-4ba7-9081-9a7f6b9f7ff3/1-imposter-domains-republishing-website.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/cc81b29a-ed90-4ba7-9081-9a7f6b9f7ff3/1-imposter-domains-republishing-website.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/cc81b29a-ed90-4ba7-9081-9a7f6b9f7ff3/1-imposter-domains-republishing-website.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/cc81b29a-ed90-4ba7-9081-9a7f6b9f7ff3/1-imposter-domains-republishing-website.png"
			
			sizes="100vw"
			alt="An example message that a web site with a paywall (where a visitor must be subscribed and pay to view most content) might display to a visitor that has reached their limit of free content. Some content republishing services advertise an ability to bypass these limitations."
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      An example message that a website with a paywall might display to a visitor that has reached their limit of free content. Some content republishing services advertise an ability to bypass these limitations. (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/cc81b29a-ed90-4ba7-9081-9a7f6b9f7ff3/1-imposter-domains-republishing-website.png'>Large preview</a>)
    </figcaption>
  
</figure>

<h3 id="misinformation">Misinformation</h3>

<p>In addition to trying to profit off web scraping, some imposter domains may be used to deliver content that has been modified in a way to intentionally spread misinformation, harm reputations, or for political or other purposes.</p>

<h2 id="managing-the-results">Managing The Results</h2>

<p>Now that you have a way to identify and track when imposter domains are re-publishing your website, what are the next steps? Tools are only as valuable as our ability to use them effectively, so <strong>it is important to develop a strategy for using an imposter domain tracking solution</strong> as part of your business processes. At a high level, I think this reduces to making decisions about a three-step management process:</p>

<ol>
<li><a href="#1-identifying-threats-through-regular-reporting">Identify the threat,</a></li>
<li><a href="#2-categorization-of-the-potential-threat">Prioritize the threat</a>,</li>
<li><a href="#3-take-action-against-the-bad-actors">Fix the threat</a>.</li>
</ol>

<h3 id="1-identifying-threats-through-regular-reporting">1. Identifying Threats Through Regular Reporting</h3>

<p>Once you have developed the database queries to extract potential imposter domain data from your web analytics or Real User Measurement data, you need to look at the data on a regular basis.</p>

<p>As a starting point, I would recommend <strong>a weekly report</strong> that can be quickly scanned for any new activity. A weekly report seems like the best cadence for catching problems before they become too severe. A daily report might feel tedious and become something easy to ignore after a while. Daily numbers can also be more challenging to interpret, as you can be looking at quite small numbers of page views that may or may not represent a concerning trend.</p>

<p>On the other hand, monthly reporting can result in problems going on for too long before being caught. A weekly report seems like the right balance for most sites and is probably the best starting cadence for regular reporting.</p>

<h3 id="2-categorization-of-the-potential-threat">2. Categorization Of The Potential Threat</h3>

<p>As we considered above, not all imposter domains re-publishing your site content are necessarily malicious in nature or a concern to your business. As you gain experience with the landscape of your own site’s data, you might enhance your regular reporting by color-coding or separating domains that you know about and consider non-malicious to help you focus on the unknown, new, or known problem domains that matter the most.</p>

<p>Depending on your needs, you might build up arrays of “acceptable” and “problem” domains, or <strong>categorize the imposter domains by their function or type</strong> (such as the “natural language translation” or “content publishing tools” categories described above). Every site will have different needs, but the objective is to separate the problematic domains from the domains that are not concerning.</p>

<h3 id="3-take-action-against-the-bad-actors">3. Take Action Against The Bad Actors</h3>

<p>For each of the problematic categories you identify, determine the parameters you want to use when deciding how to respond to the threat:</p>

<ul>
<li>What is the <strong>minimum page view count</strong> before we take action?</li>
<li>What is the first point of escalation and <strong>who is responsible</strong> for it?</li>
<li>Which <strong>stakeholders inside the business</strong> need to be aware of the malicious activity and when?</li>
<li>Are the actions to be taken <strong>documented and reviewed</strong> by all stakeholders (executives, legal, etc.) on a regular basis?</li>
<li>When actions are taken (such as filing a “DMCA Takedown” notice with the offender or their service provider or updating Web Application Firewall rules to try to limit access to the content thieves) are the <strong>results of these actions</strong> tracked and acknowledged?</li>
<li>How will the <strong>effectiveness of these actions</strong> be summarized to executive business leaders over time?</li>
</ul>

<p>Even if you are unsuccessful in squashing every malicious republication of your site content, you should still <strong>build a solid process</strong> in place to manage the risks like any other risk to the business. It will generate trust and authority with your business partners, investors, employees, and contributors.</p>

<h2 id="conclusion">Conclusion</h2>

<p>In the right circumstances, your web analytics or real user measurement data can offer visibility into the world of imposter domains, used by web scrapers to re-publish your site content on their servers. Many of these imposter domains are actually benign services that either help end-users or help you in various productive ways.</p>

<p>In other cases, the imposter domains have malicious motives, either to steal content for profit or to manipulate it in a way that causes harm to your business or your site visitor.  Web analytics or RUM data is your secret weapon to help <strong>identify any potentially malicious imposter domains that require immediate action</strong>, as well as to better understand the prevalence of the more benign domains. The data you collect leverages the web analytics or RUM service’s position as an observer in the visitor’s own browser to see that which your platform monitoring and reporting tools cannot.</p>

<p>Analyzing the data over time, you can learn more and more about imposter domains and their intentions in order to better inform your business about the risks they are posing to your reputations and your visitors&rsquo; experiences and develop and enforce mechanisms to protect your intellectual property.</p>

<div class="partners__lead-place"></div>

<h3 id="further-reading">Further Reading</h3>

<ul>
<li><a href="https://www.smashingmagazine.com/2018/12/feature-policy/">Protecting Your Site With Feature Policy</a></li>
<li><a href="https://www.smashingmagazine.com/2020/07/web-dev-live-google-event-2020/">Make Your Sites Fast, Accessible And Secure With Help From Google</a></li>
<li><a href="https://www.smashingmagazine.com/2017/05/oauth2-logging-in-facebook/">What You Need To Know About OAuth2 And Logging In With Facebook</a></li>
<li><a href="https://www.smashingmagazine.com/2016/09/content-security-policy-your-future-best-friend/">Content Security Policy, Your Future Best Friend</a></li>
<li><a href="https://www.smashingmagazine.com/2021/08/against-privacy-infringement-web/">Pushing Back Against Privacy Infringement On The Web</a></li>
</ul>

<div class="signature">
  <img src="https://www.smashingmagazine.com/images/logo/logo--red.png" alt="Smashing Editorial" width="35" height="46" loading="lazy" decoding="async" />
  <span>(vf, il, mrn)</span>
</div>


              </article>
            </body>
          </html>
        ]]></content:encoded></item><item><author>Robin Berjon</author><title>Pushing Back Against Privacy Infringement On The Web</title><link>https://www.smashingmagazine.com/2021/08/against-privacy-infringement-web/</link><pubDate>Thu, 26 Aug 2021 08:00:00 +0000</pubDate><guid>https://www.smashingmagazine.com/2021/08/against-privacy-infringement-web/</guid><description>As a community, we can each work to improve our own little corners of the Web. But, collectively, we can do better. We can improve the Web and make it a better platform for privacy. The Web is still wrestling with issues we take for granted offline, privacy chief among them. These are steps The New York Times took to protect users’ data, and how you can too.</description><content:encoded><![CDATA[
          <html>
            <head>
              <meta charset="utf-8">
              <link rel="canonical" href="https://www.smashingmagazine.com/2021/08/against-privacy-infringement-web/" />
              <title>Pushing Back Against Privacy Infringement On The Web</title>
            </head>
            <body>
              <article>
                <header>
                  <h1>Pushing Back Against Privacy Infringement On The Web</h1>
                  
                    
                    <address>Robin Berjon</address>
                  
                  <time datetime="2021-08-26T08:00:00&#43;00:00" class="op-published">2021-08-26T08:00:00+00:00</time>
                  <time datetime="2021-08-26T08:00:00&#43;00:00" class="op-modified">2026-02-09T03:03:08+00:00</time>
                </header>
                
                

<p>At the ripe old age of 25, <a href="https://nytimes.com">nytimes.com</a> is now older than some of the people who work building it. Wikipedia turned 20 this year, and the first browser shipped 30 years ago. The Web has over 4 billion internet users and is nearing 2 billion websites. By this point, it’s reasonable to expect to have answers to most of the big, basic questions of how people and digital technology work with one another.</p>

<p>As you no doubt know, however, we don’t. We really don’t. If anything, questions of technology and society seem to be <strong>piling up faster than we can address them</strong>. I started working for The Times four years ago. Before that, I had done a range of tech work: developing sites at small web shops, product work with startups, consulting for household name tech companies, and heavy involvement in a range of <a href="https://www.w3.org/">W3C</a> work. One of the things that drew me to The New York Times was the opportunity to work on some of those big unanswered questions in collaboration with excellent teams and with a strong ethical mandate.</p>

<p>Of these issues, perhaps the most surprising to find still unsolved is <strong>privacy</strong>. Outside of the digital realm, we make multiple privacy decisions a day and typically find them obvious enough that we barely notice they’re there. Is it okay to read that stranger’s DMs over their shoulder? Can I recount that intimate detail that a friend shared with me? Will my doctor repeat what I tell them of my symptoms to my boss?</p>

<p>Weighing up whether we — or someone we speak with — may take personal information from one context and share it in another is something we do almost instinctively. If we required expert opinion for every such decision, ethicist would be a high-income profession. So why can’t we seem to put this one to rest online as well?</p>

<div data-audience="non-subscriber" data-remove="true" class="feature-panel-container">

<aside class="feature-panel" style="">
<div class="feature-panel-left-col">

<div class="feature-panel-description"><p>Meet <strong><a data-instant href="https://www.smashingconf.com/online-workshops/">Smashing Workshops</a></strong> on <strong>front-end, design &amp; UX</strong>, with practical takeaways, live sessions, <strong>video recordings</strong> and a friendly Q&amp;A. With Brad Frost, Stéph Walter and <a href="https://smashingconf.com/online-workshops/workshops">so many others</a>.</p>
<a data-instant href="smashing-workshops" class="btn btn--green btn--large" style="">Jump to the workshops&nbsp;↬</a></div>
</div>
<div class="feature-panel-right-col"><a data-instant href="smashing-workshops" class="feature-panel-image-link">
<div class="feature-panel-image">
<img
    loading="lazy"
    decoding="async"
    class="feature-panel-image-img"
    src="/images/smashing-cat/cat-scubadiving-panel.svg"
    alt="Feature Panel"
    width="257"
    height="355"
/>

</div>
</a>
</div>
</aside>
</div>

<h2 id="the-digital-context">The Digital Context</h2>

<p>Several factors stand against us. The first is that <a href="https://bookshop.org/books/10948192/9780804752374">privacy is contextual</a>. We understand what may be shared to whom and how by using different frames for work, home, the subway, a doctor’s office, or the local neighborhood dive. But in our digital lives, everything is a slight variation on a glossy slab of plastic. We chat with friends on the same gadget we work on, speak in public through, and look up symptoms with. It is hard to develop cues for what counts as appropriate amidst such homogeneity.</p>

<p>A second factor is the <strong>usefulness of third parties</strong>. The modern development of complex digital products often requires relying on third parties one way or another. This is not necessarily bad. A company specializing in a clear service might have better data protection than a home-grown equivalent, and not all third parties are privacy-invasive. Some third parties work only for the first-party site and will not reuse user data elsewhere. For privacy purposes, they are indistinguishable from whatever the first party does. One example of this might be Fathom: it’s third-party analytics, but they have <a href="https://usefathom.com/blog/anonymization">openly published the method they use to ensure user privacy</a>.</p>

<p>Conversely, other third parties insist on being <strong>controllers of the data</strong> they take from the users of your site and reuse it independently for entirely different purposes. The latter are clear violations of privacy, but Web technology gives no way for browsers — and therefore users — to tell them apart. Cracking open your ad blocker extension and counting the &ldquo;trackers&rdquo; might be easy but it tells you little about how privacy-invasive a site really is. It is hard to automate protection at the browser level without the ability to tell third parties apart.</p>

<p>A final factor we shan’t be coy about is that there’s <strong>money to be made from this confusion</strong>. Many of the biggest names in tech (and a host of smaller ones too) operate with business models that do nothing other than <strong>convert privacy violations into money</strong>. They often muddy the waters with widely-read positions that extoll a confounding picture of privacy often confused with security, transparency, complex privacy settings and check-ups, or with consent. It can be hard to progress on informed improvements to privacy when so much of the conversation on the topic comes from a place of confusion.</p>

<p>This might feel like a lot to fix at once, but not to worry: we can all make the Web better one website at a time. It’s easy to become paralyzed thinking that all data collection is a privacy issue. That’s not the case. You can <strong>walk this path gradually</strong>. The way I approach privacy for a given site is to first try to find a familiar everyday context that I believe is close to it. Reasoning from known everyday contexts makes it possible to tap into established norms for which we tend to have good intuitions. Because the digital world works differently, there is rarely a perfect one-to-one match, but starting with a concrete situation can help structure your thinking.</p>

<h2 id="enter-my-bookshop">Enter My Bookshop</h2>

<p>Let us look at a bookshop and at how we can <strong>incrementally change its privacy properties</strong> by adding more details that render it increasingly like a modern commercial website. Hopefully, there is a point at which you will want to draw a line — and that point should tell you something about what is appropriate in a comparable context on the Web.</p>

<p>A bookshop makes for a decent <strong>real-world comparison point</strong> for an online publication. You go there looking for things to read. The people who work there can see you enter, and they might even recognize you from previous visits. If you’ve identified yourself, they may know your name, or at least have some moniker for you.</p>

<p>As you browse the shop, the staff can get a sense of what you’re looking at. They might not spy on it in great detail, but they’ll know which section you’re in and could easily notice which book you just pulled out. They can use that and ask you questions to offer recommendations.</p>

<p>It’s a <strong>commercial environment</strong>, and if you buy something there, depending on how you pay they might learn a little bit more about you, and share some of that data with a payment processing company of some sort.</p>

<p>At closer inspection, you notice that the shop has a few <strong>video surveillance cameras</strong> running. This makes you a little uncomfortable, but after a quick chat with the owner they reassure you that these are running on a local closed circuit such that the video never leaves the shop, is automatically kept for a maximum of 24 hours, and is only ever watched for the sole purpose of identifying theft. These properties — highly restricted access, short retention, clear and limited purpose — offer strong guarantees (assuming you trust the business) and limit how invasive the process is.</p>

<p>But, paying more attention, you notice a number of other smaller, more discrete cameras. They are dispersed throughout the store in a way that allows them to analyze which books you are looking at, which you pull out to read the blurb on, which you decide to buy.</p>

<p>The conversation with the bookshop owner is a bit more fraught this time. Those <strong>video feeds</strong> go to a number of companies in exchange for which they help pay a little of the shop’s costs or list the shop on neighborhood maps. You agreed to this by pushing the door open and stepping inside.</p>

<p>The owner is adamant that it’s safe, that the process is entirely “anonymous,” that these monitoring companies “only” use a hash of your facial biometrics to recognize you from shop to shop. What do you have to hide anyway? It’s an important part of making sure that the books stay cheap. Without that, only rich people would have books. Anything else would be bad for small businesses and poor people.</p>

<p>Flipping through the list of companies taking video feeds from this shop, you can’t find a name you recognize. Except for those two that seem to be taking video feeds from every single other shop as well.</p>

<p>Pushing the bookshop owner a little more, you come to realize they’re not very happy with those companies. They use the data they collect in the shop both to <strong>compete with the bookshop</strong> by selling books directly and to recommend other bookshops. They’re also using their position, informed by that data, to push for a model in which they run the infrastructure for all stores — why would a bookshop owner care about walls, shelves, lighting, is their value not just in the book selection? — and an increasing number of other shops have switched over to this worldwide strip mall model. The owner isn’t too sanguine about any of that. &ldquo;But when you don’t comply they drop you off the map and send people to your competitors,&rdquo; they say.</p>

<p>As promised, finding an exact non-digital equivalent to the state of privacy on the Web is imperfect and has some slightly contrived corners. Yet the above is very close to what it’s like to operate a commercial publisher or an online store on the Web today.</p>

<p>In reading the above, <strong>different people will draw the line at different places</strong>. Some are entirely bought into the death of privacy and look forward to the promised bright future of big tech bureaucracy. At the other end of the spectrum, others will prefer a staff-less bookshop where they can pick their next read with nary a human ever seeing what it may be.</p>

<p>If you’re like me, you’ll draw the line somewhere around the addition of the CCTV system. I’m not excited about it, but if its data processing is properly limited and if it helps my favorite source of books to stay alive, I can live with it. I am not inclined, however, to accept the pervasive surveillance of my behavior — the primary effect of which is for a handful of large corporations to either absorb small shops or drive them out of existence.</p>

<p>None of these positions is inherently right or wrong, but we help our users if we agree on a <em>default</em> and set expectations to match it. I believe that a good starting point for a default that works for most sites that perform a relatively small set of related services is the <em>Vegas Rule</em>: <strong>what happens on the site stays on the site</strong>. (Including the parties that work for the site, and only for the site.)</p>

<div class="partners__lead-place"></div>

<h2 id="how-can-we-build-for-privacy">How Can We Build For Privacy?</h2>

<p>What does this mean for those of us who build places on the Web that others visit? There is no one-size-fits-all answer to that. Last year, I wrote about how <a href="https://open.nytimes.com/how-the-new-york-times-thinks-about-your-privacy-bc07d2171531"><em>The Times</em> sees it</a>, but how you approach your own situation will depend on the specifics that you are dealing with.</p>

<p>I recommend <strong>working on privacy iteratively</strong>, with a plan to improve in gradual steps over time. In most cases, it’s unlikely that you’ll be able to deploy a catch-all Big Bang cleanup.</p>

<p>The first step towards making a site more trustworthy in its privacy is to <strong>understand what is going on and why</strong>. If you work on the tech or product side, you might have grown used to grumbling in dismay as the marketing team adds yet another tracker, which they refer to under harmless, cutesy euphemisms like “pixel,” that will slow down your site. But you might only have a limited understanding of why they do that in the first place.</p>

<p>These overlaps are great opportunities to <strong>build actual relationships</strong> with other teams. They are trying to achieve something, and that something is probably covering at least some of your pay-check. But they also sometimes struggle to tell honest vendors from hoaxes and they can benefit from a greater understanding of the technology that underlies what they buy — which you can likely help with. If you’re on their side instead of complaining about them, you might not be able to remove all the trackers, but you’ll be in a position to make progress.</p>

<p>Once you have that relationship (or if you’re the person making those decisions), the next step is to make sure that each third party is held accountable. The reality of online business today is such that you might have to keep some trackers, but those that stay should be <strong>provably effective</strong>. By working closely with our marketing team, we were able to reduce the amount of data <em>The Times</em> shared with third-party data controllers by over 90 percent. Not only did that improve privacy, but it also improved performance. The second step is to develop a habit of healthy skepticism.</p>

<blockquote class="pull-quote">
  <p>
    <a class="pull-quote__link" aria-label="Share on Twitter" href="https://twitter.com/share?text=%0aRead%20the%20fine%20print%20so%20that%20your%20users%20don%e2%80%99t%20have%20to%20%e2%80%94%20it%e2%80%99s%20part%20and%20parcel%20of%20building%20a%20site%20that%20won%e2%80%99t%20betray%20your%20users%e2%80%99%20trust.%0a&url=https://smashingmagazine.com%2f2021%2f08%2fagainst-privacy-infringement-web%2f">
      
Read the fine print so that your users don’t have to — it’s part and parcel of building a site that won’t betray your users’ trust.

    </a>
  </p>
  <div class="pull-quote__quotation">
    <div class="pull-quote__bg">
      <span class="pull-quote__symbol">“</span></div>
  </div>
</blockquote>

<p>That free widget to make it easy to share pages on social media? It’s probably a data broker. That comments system you can drop at the bottom of your blog? <a href="https://twitter.com/martingund/status/1207327648093003777">You might want to check that it’s not selling your users’ data</a>. It’s not uncommon for a third party to strike deals with other third parties so that when you add one to your site it will inject the others as well, a practice known as <a href="https://themarkup.org/blacklight/2020/09/22/blacklight-tracking-advertisers-digital-privacy-sensitive-websites">piggybacking</a>. It’s a good idea to run your site through a tool like <a href="https://themarkup.org/blacklight">Blacklight</a> now and then to make sure that nothing surprising is going on (though if you run ads there will only be so much you can do, sadly).</p>














<figure class="
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/e6e675d6-e150-417a-9ab7-5ab7608e5af0/1-against-privacy-infringement-web.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="574"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/e6e675d6-e150-417a-9ab7-5ab7608e5af0/1-against-privacy-infringement-web.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/e6e675d6-e150-417a-9ab7-5ab7608e5af0/1-against-privacy-infringement-web.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/e6e675d6-e150-417a-9ab7-5ab7608e5af0/1-against-privacy-infringement-web.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/e6e675d6-e150-417a-9ab7-5ab7608e5af0/1-against-privacy-infringement-web.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/e6e675d6-e150-417a-9ab7-5ab7608e5af0/1-against-privacy-infringement-web.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/e6e675d6-e150-417a-9ab7-5ab7608e5af0/1-against-privacy-infringement-web.png"
			
			sizes="100vw"
			alt="Google note asking for key points of Google’s Privacy Policy to be reviewed"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      Just because your site visitors won’t read the fine print doesn’t mean you shouldn’t either.
    </figcaption>
  
</figure>

<p>Finally, you of course want to be thinking about your users, but you should also be thinking about yourself! The business implications of sending your audience data to third parties are often poorly understood and are too rarely taken into account. Understanding your users, your readers, your customers is a key business asset. When you share your audience data with third parties, they benefit from that too — and they can use that data to compete with you.</p>

<p>If you run a shoe store and let a social network track your users so you can target ads to them there later, know that that data, which reveals who is interested in shoes, will also be used to show them shoe ads for your competitors.</p>

<p>If you host your e-commerce pages on a virtual strip mall owned by a company that also runs its own online shopping business, how long will it be before they use what they learn from your customers to outcompete you?</p>

<blockquote class="pull-quote">
  <p>
    <a class="pull-quote__link" aria-label="Share on Twitter" href="https://twitter.com/share?text=%0aPrivacy%20isn%e2%80%99t%20just%20about%20ethics%20and%20earning%20the%20trust%20of%20your%20readers:%20it%e2%80%99s%20also%20a%20sound%20business%20strategy%20when,%20willingly%20or%20not,%20you%20participate%20in%20the%20data%20economy.%0a&url=https://smashingmagazine.com%2f2021%2f08%2fagainst-privacy-infringement-web%2f">
      
Privacy isn’t just about ethics and earning the trust of your readers: it’s also a sound business strategy when, willingly or not, you participate in the data economy.

    </a>
  </p>
  <div class="pull-quote__quotation">
    <div class="pull-quote__bg">
      <span class="pull-quote__symbol">“</span></div>
  </div>
</blockquote>

<h2 id="and-how-about-we-fixed-the-web-too">And How About We Fixed The Web, Too?</h2>

<p>As a community, we can each work to improve our own little corners of the Web. But, collectively, we can do better. We can improve the Web and make it a better platform for privacy.</p>

<p>Perhaps the most important property of the Web is <strong>trust</strong>. You can browse around freely from site to site because you can trust that your browser will protect your security and that, even as those sites run code on your computer, they won’t endanger it. That is a strong promise, much stronger than what you can expect from native platforms, but when it comes to privacy it’s a promise that we have broken. As you browse freely from site to site, your privacy is not in trustworthy hands.</p>

<p>Still, things are looking up. Most browsers have delivered excellent work towards preventing tracking on the Web, and the biggest holdout, Chrome, has promised change in 2023. Projects like the <a href="https://globalprivacycontrol.org/">Global Privacy Control</a> are <a href="https://globalprivacycontrol.org/press">making headway</a>. As <strong>third-party cookies slowly become extinct</strong>, industry stakeholders are working together to propose privacy-preserving standards that enable businesses to function on the Web without infringing on people’s privacy.</p>

<p>Detailing all the proposals on the table would require a whole other article, but Apple’s <a href="https://privacycg.github.io/private-click-measurement/">Private Click Measurement</a>, Google’s <a href="https://github.com/WICG/turtledove/blob/main/FLEDGE.md">FLEDGE</a>, Microsoft’s <a href="https://github.com/microsoft/PARAKEET">PARAKEET</a>, or, if you’ll allow me this shameless plug, The New York Times’s <a href="https://darobin.github.io/garuda/">Garuda</a> are all worth looking at, as is the work taking place in the <a href="https://www.w3.org/community/privacycg/">Privacy CG</a>. Some of the proposals discussed there, like Federated Learning of Cohorts (FLoC), have <a href="https://www.theregister.com/2021/07/08/google_floc_changes/">run into trouble</a>, but that only underscores the value in building a solid understanding of privacy in the Web community in order to develop these novel solutions.</p>

<p>As much as we’d all love to engineer our way out of these complex problems, that’s rarely possible. Solutions will require <strong>cooperation between technologists and policymakers</strong>. As technologists, there are several ways in which we can help. We can act as citizens and take part in policy debates. We can describe our systems in understandable terms, and explain what is riding on them. (You’d be surprised at how many bad descriptions of cookies there can be.) We can use our understanding of technology to <a href="https://berjon.com/stewardship/">try to explore how what we build can create problems when deployed at large scales</a>.</p>

<p>Most importantly, when technology fails society we can make it our responsibility to imagine other ways in which it could work — even if they seem out of immediate reach. Technology is often presented as inevitable as if its current design were the only rational option rather than the accumulation of arbitrary decisions that it is. We hold large, often untapped power in our ability simply to say that “it doesn’t have to be this way” and to show what other paths exist.</p>

<p><strong>We build for users</strong>, not to milk them of their data. The Web has made it hard for them to stand for themselves — it’s on us to do it for them. Few of us who work on commercial sites will be able to produce perfect privacy outcomes immediately, but this should not stop us from doing better. The tide has turned and a privacy-friendly Web now seems possible. We might yet get to check one of those big, basic questions off the list.</p>

<h3 id="other-resources">Other Resources</h3>

<ul>
<li>A great book to read to understand how privacy works is Helen Nissenbaum’s <a href="https://bookshop.org/books/10948192/9780804752374">Privacy in Context</a>. A shorter overview is available in Matt Salganik’s <a href="https://www.bitbybitbook.com/">Bit by Bit</a> which you can <a href="https://www.bitbybitbook.com/en/1st-ed/ethics/dilemmas/privacy/">read online</a>.</li>
<li><a href="https://www.penguin.co.uk/books/1120394/privacy-is-power/9781787634046.html">Privacy is Power</a> by Carissa Véliz offers an effective and well-documented overview of why privacy matters.</li>
<li>James C. Scott’s classic <a href="https://bookshop.org/books/seeing-like-a-state-how-certain-schemes-to-improve-the-human-condition-have-failed/9780300246759">Seeing Like A State</a> presents a dire overview of how society-level engineering can fail, often in catastrophic ways, which includes an extensive description of the problems brought about by “legibility”, which is what collective infringement of privacy leads to.</li>
<li>Maria Farrell’s <a href="https://conversationalist.org/2019/09/13/feminism-explains-our-toxic-relationships-with-our-smartphones/">This Is Your Phone On Feminism</a> is an outstanding description of how we love our devices but don’t trust them, and of how love without trust is the definition of an abusive relationship.</li>
<li>The W3C’s Technical Architecture Group (TAG) is working on a set of privacy definitions to help support discussions in the Web community. The output from that isn’t baked yet, but it is being built based on a blend of the <a href="https://darobin.github.io/pup/">Principles of User Privacy (PUP)</a> and the <a href="https://w3cping.github.io/privacy-threat-model/">Target Privacy Threat Model</a>.</li>
<li>In this article, I could only cover some of the basics, but one important concern in privacy is how data collection affects us at the collective instead of the individual level that we too often fixate on. Salomé Viljoen’s <a href="https://papers.ssrn.com/sol3/papers.cfm?abstract_id=3727562">Democratic Data</a> covers that issue very well.</li>
<li>Woodrow Hartzog and Neil Richards have written so many excellent articles on privacy that it’s hard to pick a favorite, but I would suggest <a href="https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2655719">Taking Trust Seriously In Privacy Law</a> as a great place to start. Don’t be daunted by the “law” part, it’s really about trust.</li>
<li>Looking at a broader issue, <a href="https://bookshop.org/books/re-engineering-humanity-9781107147096/9781108707640">Re-Engineering Humanity</a>, by Brett Frischmann and Evan Selinger, is a great description of how we can misuse technology to shape people against their interests.</li>
<li>More on the advertising side, <a href="https://bookshop.org/books/re-engineering-humanity-9781107147096/9781108707640">Subprime Attention Crisis</a> by Tim Hwang explains why we should worry about online advertising and the businesses it supports.</li>
</ul>

<div class="partners__lead-place"></div>

<h3 id="further-reading">Further Reading</h3>

<ul>
<li><a href="https://www.smashingmagazine.com/2023/03/access-handling-data-management-row-level-security/">Fine-Grained Access Handling And Data Management With Row-Level Security</a></li>
<li><a href="https://www.smashingmagazine.com/2023/04/potentially-dangerous-non-accessibility-cookie-notices/">The Potentially Dangerous Non-Accessibility Of Cookie Notices</a></li>
<li><a href="https://www.smashingmagazine.com/2023/10/passkeys-explainer-future-password-less-authentication/">Passkeys: A No-Frills Explainer On The Future Of Password-Less Authentication</a></li>
<li><a href="https://www.smashingmagazine.com/2023/10/ux-research-learn-from-lt-columbo/">Everything I Know About UX Research I First Learned From Lt. Columbo</a></li>
</ul>

<div class="signature">
  <img src="https://www.smashingmagazine.com/images/logo/logo--red.png" alt="Smashing Editorial" width="35" height="46" loading="lazy" decoding="async" />
  <span>(vf, il, mrn)</span>
</div>


              </article>
            </body>
          </html>
        ]]></content:encoded></item><item><author>Danny Bluestone</author><title>State Of GDPR In 2021: Cookie Consent For Designers And Developers</title><link>https://www.smashingmagazine.com/2021/03/state-gdpr-2021-cookie-consent-designers-developers/</link><pubDate>Mon, 01 Mar 2021 14:30:00 +0000</pubDate><guid>https://www.smashingmagazine.com/2021/03/state-gdpr-2021-cookie-consent-designers-developers/</guid><description>As digital practitioners, GDPR has impacted every facet of our professional and personal lives. Whether you’re addicted to Instagram, message your family on WhatsApp, buy products from Etsy or Google information, no one has escaped the rules that were introduced in 2018. In this article, Danny Bluestone will take a look at two developments that have impacted cookies, plus a third on the horizon.</description><content:encoded><![CDATA[
          <html>
            <head>
              <meta charset="utf-8">
              <link rel="canonical" href="https://www.smashingmagazine.com/2021/03/state-gdpr-2021-cookie-consent-designers-developers/" />
              <title>State Of GDPR In 2021: Cookie Consent For Designers And Developers</title>
            </head>
            <body>
              <article>
                <header>
                  <h1>State Of GDPR In 2021: Cookie Consent For Designers And Developers</h1>
                  
                    
                    <address>Danny Bluestone</address>
                  
                  <time datetime="2021-03-01T14:30:00&#43;00:00" class="op-published">2021-03-01T14:30:00+00:00</time>
                  <time datetime="2021-03-01T14:30:00&#43;00:00" class="op-modified">2026-02-09T03:03:08+00:00</time>
                </header>
                
                

<p><a href="https://www.smashingmagazine.com/2021/02/state-gdpr-2021-key-updates/">Last week</a>, I gave you an update on everything that’s happened with GDPR since 2018. (TL;DR: A lot has changed.) In this article, we’ll look at cookie consent: specifically, the paradox where marketers are heavily reliant on Google Analytics cookie data but need to <strong>comply with regulations</strong>.</p>

<p>We’ll take a look at two developments that have impacted cookies, plus a third on the horizon. Then I’ll walk you through the risk-based approach that we’ve taken — for the moment, at least. And come back next time for a deep dive into first-party ad tracking as we start to see moves away from third-party cookies.</p>

<ul>
<li><a href="https://www.smashingmagazine.com/2021/02/state-gdpr-2021-key-updates/">Part 1: GDPR, Key Updates And What They Mean</a></li>
<li><strong>Part 2: GDPR, Cookie Consent And 3rd Parties</strong>

<br /></li>
</ul>

<div data-audience="non-subscriber" data-remove="true" class="feature-panel-container">

<aside class="feature-panel" style="">
<div class="feature-panel-left-col">

<div class="feature-panel-description"><p>Meet <strong><a data-instant href="/printed-books/touch-design-for-mobile-interfaces/">Touch Design for Mobile Interfaces</a></strong>, Steven Hoober’s brand-new guide on <strong>designing for mobile</strong> with proven, universal, human-centric guidelines. <strong>400 pages</strong>, jam-packed with in-depth user research and <strong>best practices</strong>.</p>
<a data-instant href="https://www.smashingmagazine.com/printed-books/touch-design-for-mobile-interfaces/" class="btn btn--green btn--large" style="">Jump to table of contents&nbsp;↬</a></div>
</div>
<div class="feature-panel-right-col"><a data-instant href="https://www.smashingmagazine.com/printed-books/touch-design-for-mobile-interfaces/" class="feature-panel-image-link">
<div class="feature-panel-image"><picture><source type="image/avif" srcSet="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/14bcab88-b622-47f6-a51d-76b0aa003597/touch-design-book-shop-opt.avif" />
<img
    loading="lazy"
    decoding="async"
    class="feature-panel-image-img"
    src="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/b14658fc-bb2d-41a6-8d1a-70eaaf1b8ec8/touch-design-book-shop-opt.png"
    alt="Feature Panel"
    width="480"
    height="697"
/>
</picture>
</div>
</a>
</div>
</aside>
</div>

<h3 id="big-development-1-cookie-consent">Big Development #1: Cookie Consent</h3>

<p>In May 2020, the EU <a href="https://edpb.europa.eu/sites/edpb/files/files/file1/edpb_guidelines_202005_consent_en.pdf">updated its GDPR guidance</a> to clarify several points, including two key points for cookie consent:</p>

<ul>
<li><strong>Cookie walls</strong> do not offer users a genuine choice, because if you reject cookies you’re blocked from accessing content. It confirms that cookie walls should not be used.</li>
<li><strong>Scrolling or swiping</strong> through web content does not equate to implied consent. The EU reiterates that consent must be explicit.</li>
</ul>

<p>What does this mean for our industry?</p>

<p>Well, the EU is tightening up on cookie consent — perhaps the most noticeable (and annoying!) aspect of GDPR. Critics say that cookie notices are <strong>a cumbersome block for users</strong>, and don’t do anything to protect user privacy. The EU is trying to change this, by promoting simple, meaningful, equitable options for cookie consent.</p>

<p>But that restricts what we can do with cookies, and it hints ahead to when the Privacy and Electronic Communications Regulation (PECR) may come into force. More on that shortly.</p>

<h3 id="big-development-2-google-and-apple-crack-down-on-third-party-tracking-get-hit-by-anti-trust-complaints">Big Development #2: Google And Apple Crack Down On Third-Party Tracking; Get Hit By Anti-Trust Complaints</h3>

<p>As the big digital players figure out <a href="https://www.cyber-duck.co.uk/what-we-do/digital-optimisation/gdpr-compliance">how to comply with GDPR</a> — and how to turn privacy legislation to their advantage — some have already come under fire.</p>

<p>Google is being investigated by the UK’s competition watchdog, the Competition and Markets Authority (CMA), for its ‘<a href="https://www.reuters.com/article/us-google-britain-idUSKBN29D18Q">Privacy Sandbox</a>’ initiative, following complaints from adtech companies and publishers.</p>

<p>The Internet giant, which is also facing an <strong>antitrust investigation</strong> in Italy for <a href="https://www.reuters.com/article/us-italy-google-antitrust/italian-watchdog-investigates-google-over-alleged-advertising-market-abuse-idUKKBN27D0MM?edition-redirect=uk">display advertising</a>, and in the US for its <a href="https://techcrunch.com/2020/10/20/justice-department-will-reportedly-file-its-antitrust-lawsuit-against-google-today/">search advertising services</a>, is looking to remove third-party cookies from Chrome. (Firefox and Safari already block these cookies by default.)</p>

<p>The complainants say that this change will further concentrate advertising revenue in Google’s hands. Google’s response? The advertising industry needs to make ‘<a href="https://www.reuters.com/article/us-google-britain-idUSKBN29D18Q">major changes</a>’ as it shifts to a ‘web without third-party cookies’.</p>

<p>Google’s not alone. In October 2020, four French digital advertising lobbies filed an <a href="https://www.reuters.com/article/apple-advertisting-france-idUSL1N2HJ237">antitrust suit</a> against Apple’s forthcoming iOS privacy change, a feature it’s called <strong>App Tracking Transparency</strong> (ATT).</p>

<p>ATT, coming in an early-spring 2021 release of iOS 14, shifts app users from an opt-out to an opt-in ad-tracking model. With ATT, every app must get your permission to share your Identifier for Advertisers (IDFA), which enables third-party ad tracking across multiple sites and channels.</p>

<p>The complainants say that by restricting apps’ ad revenue, developers may have to boost app subscriptions and in-app purchases or switch to Apple’s targeted ad platform — all of which will funnel ad spend away from them and towards Cupertino.</p>

<p>Critics including Facebook have <a href="https://techcrunch.com/2021/01/27/apple-app-tracking-transparency/">slammed the change</a>, saying it’ll hit small businesses who rely on <strong>microtargeted ads</strong>. Apple has defended the move and praised the EU’s defence of citizens’ data privacy.</p>

<p>To sum up:</p>

<ul>
<li>Implied consent doesn’t equal consent under GDPR, according to the EU.</li>
<li>We should also avoid cookie walls</li>
<li>Google and Apple are moving against third-party cookies — which some say exploits their dominant market position.</li>
</ul>

<p>So what does that mean for us, as designers and developers? First, let’s take a look at why this is important.</p>

<h2 id="here-s-what-designers-should-know-about-cookies">Here’s What Designers Should Know About Cookies</h2>

<ul>
<li><strong>GDPR is critical for you</strong> because you’ll design the points at which cookies are placed, what data is collected, and how it’s processed.</li>
<li>A <strong>functionality audit</strong> means you can map your cookie activity in the data and compliance layers on your service blueprint.</li>
<li>It can help to do a cookie audit and gap analysis, i.e. is the existing cookie pattern compliant? What content does it need around it?</li>
<li>Follow <em>Privacy by Design</em> best practices. Don’t try to reinvent the wheel — if you’ve created a compliant cookie banner, use your proven design pattern.</li>
<li>Work with your compliance and development teams to <strong>ensure designs meet GDPR</strong> and can be implemented. Only ask for the data you need.</li>
<li>If you need to compromise, take a risk-based approach. There’s a walk-through of one that we did further down.</li>
<li>Be aware that your content team may need to <strong>update your privacy policy</strong> as GDPR and your use of cookies evolve.</li>
</ul>

<h2 id="here-s-what-developers-should-know-about-cookies">Here’s What Developers Should Know About Cookies</h2>

<ul>
<li>Make sure you’re involved upfront about cookie consent and tracking, so what’s decided can be implemented.</li>
<li>If you’re doing a product or website redesign, a cookie audit using Chrome Dev Tools can show you what <strong>tracking cookies</strong> are being used. Tools like <a href="https://www.ghostery.com/">Ghostery</a> or <a href="https://www.cookiebot.com/en/">Cookiebot</a> give you more detail.</li>
<li>You should implement the standard cookie opt in/out <strong>as per GDPR guidance</strong>. (Note that while GDPR is standard, the enforcement of it varies across EU countries. There’s more on this further down.) You may stand to lose Google Analytics data. You might also come under pressure to implement things that could be considered as dark patterns. There’s more on this later, with a walk-through of what we did and a look at the risk.</li>
</ul>

<p>So that’s where we are today. Oh, and there’s one more thing to be aware of: a piece of <strong>further legislation</strong> that might be coming our way. I like to call it <em>Schrodinger’s Law</em>.</p>

<h2 id="schrodinger-s-law-the-eprivacy-regulation">Schrodinger’s Law: The ePrivacy Regulation</h2>

<p>You may have heard of GDPR’s twin sister, the ePrivacy Regulation, who’s lurking on the legislative horizon. If you haven’t, here’s an introduction.</p>

<p>As I said above, cookie consent — the notice that pops up when you visit a website — is regulated by the GDPR. However, cookies themselves fall under a different piece of legislation, the <strong>ePrivacy Directive of 2002</strong>, commonly known as the Cookie Law. Like GDPR, it aims to protect customer privacy.</p>

<p>The ePrivacy Directive is due to be replaced by more stringent legislation, the ePrivacy Regulation. (If you’re interested in the difference between EU directives and regulations, EU directives set out the goals for legislation but delegate the implementation of those goals to member states’ legislatures. EU regulations mandate both the goals and the implementation at an EU-wide level.)</p>

<blockquote class="pull-quote">
  <p>
    <a class="pull-quote__link" aria-label="Share on Twitter" href="https://twitter.com/share?text=%0aThe%20draft%20ePrivacy%20Regulation%20goes%20beyond%20cookies%20and%20ad%20tracking.%20It%20applies%20to%20all%20electronic%20communications,%20including%20messaging%20apps,%20spam%20mail,%20IoT%20data%20transfer%20and%20more.%0a&url=https://smashingmagazine.com%2f2021%2f03%2fstate-gdpr-2021-cookie-consent-designers-developers%2f">
      
The draft ePrivacy Regulation goes beyond cookies and ad tracking. It applies to all electronic communications, including messaging apps, spam mail, IoT data transfer and more.

    </a>
  </p>
  <div class="pull-quote__quotation">
    <div class="pull-quote__bg">
      <span class="pull-quote__symbol">“</span></div>
  </div>
</blockquote>

<p>The draft ePrivacy Regulation was first presented by the EU in 2017. However, it has to be agreed by both the European Parliament and the Council of the European Union. (The Council consists of government representatives of each EU member state.)</p>

<p>This is where it gets messy. Since 2017, the European Parliament and the Council haven’t been able to agree on the scope and detail of the ePrivacy Regulation.</p>

<p>That’s because some countries — widely thought to include the Nordic states of Finland and Denmark — want to strengthen the current ePrivacy Directive. They want users, for example, to be able to <strong>set acceptance and rejection of tracking cookies</strong> in their browsers, not on every site they visit.</p>

<p>But other countries, notably Austria and believed also to include those with sizeable digital marketing and advertising sectors, say this is bad for business. It’s thought the 27 EU member states are split down the middle on this issue — and they’re all being heavily lobbied by the tech industry.</p>

<p>So the draft regulation has been ricocheting back and forth between the European Commission and its Working Party on Telecommunications and Information Society as they try to agree its scope. In November 2020, the Working Party <a href="https://data.consilium.europa.eu/doc/document/ST-12891-2020-INIT/en/pdf">rejected</a> the redrafted legislation once again.</p>

<p>What happens next? There are two possibilities. <strong>Either a compromise will be reached</strong>, in which case the legislation will be agreed. Because it takes time for legislation to be implemented, the soonest the ePrivacy Regulation could become law is 2025.</p>

<p>Alternatively, <strong>the legislation cannot be agreed and is withdrawn</strong> by the European Commission. But the EU has staked so much on it. It will be extremely reluctant to take that step.</p>

<p>That’s why I call it Schrodinger’s Law. It’s hard for us to know how to plan for any cookie-related developments because we simply don’t know what’s happening.</p>

<h2 id="so-what-should-i-do-about-cookies-right-now">So What Should I Do About Cookies Right Now?</h2>

<p>Different EU countries are currently implementing the ePrivacy Directive differently. Over in the UK, the ICO (the UK’s data protection authority) is taking a tough stance. It’s requiring <a href="https://ico.org.uk/for-organisations/guide-to-pecr/guidance-on-the-use-of-cookies-and-similar-technologies/how-do-we-comply-with-the-cookie-rules/#comply15">strict consent for analytics cookies</a>, for example, and has spoken out against cookie walls.</p>

<p>Until — and if — we get consistency from a new ePrivacy Regulation, if you’re based in an EU country, start by following the advice from your national Data Protection Authority. Then watch this space for developments around the ePrivacy Regulation.</p>

<blockquote class="pull-quote">
  <p>
    <a class="pull-quote__link" aria-label="Share on Twitter" href="https://twitter.com/share?text=%0aIf%20you%e2%80%99re%20based%20outside%20the%20EU,%20make%20sure%20you%e2%80%99re%20giving%20EU%20citizens%20the%20options%20required%20under%20the%20GDPR%20and%20the%20ePrivacy%20Directive.%0a&url=https://smashingmagazine.com%2f2021%2f03%2fstate-gdpr-2021-cookie-consent-designers-developers%2f">
      
If you’re based outside the EU, make sure you’re giving EU citizens the options required under the GDPR and the ePrivacy Directive.

    </a>
  </p>
  <div class="pull-quote__quotation">
    <div class="pull-quote__bg">
      <span class="pull-quote__symbol">“</span></div>
  </div>
</blockquote>

<p>However, when it comes down to the detail, there are times when I recommend taking a risk-based approach. That’s what we’ve done at Cyber-Duck — and here’s why.</p>

<p>Here’s <strong>our original cookie notice</strong>. You see these everywhere. They’re pretty meaningless — users just hit accept and continue on their way.</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/5015a98f-d1c6-4520-bbb9-4aa35c4a1a44/gdpr-update-original-cookie-banner.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/5015a98f-d1c6-4520-bbb9-4aa35c4a1a44/gdpr-update-original-cookie-banner.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/5015a98f-d1c6-4520-bbb9-4aa35c4a1a44/gdpr-update-original-cookie-banner.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/5015a98f-d1c6-4520-bbb9-4aa35c4a1a44/gdpr-update-original-cookie-banner.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/5015a98f-d1c6-4520-bbb9-4aa35c4a1a44/gdpr-update-original-cookie-banner.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/5015a98f-d1c6-4520-bbb9-4aa35c4a1a44/gdpr-update-original-cookie-banner.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/5015a98f-d1c6-4520-bbb9-4aa35c4a1a44/gdpr-update-original-cookie-banner.png"
			
			sizes="100vw"
			alt="Screengrab of cookie consent banner. It says ‘Learn how we use cookies to manage your experience and change your settings.’"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      It didn’t matter if the user had accepted cookies or not — Google Tag Manager (GTM) fired when they landed as cookies were enabled by default, meaning we would get our analytics data. (Image source: <a href='https://www.cyber-duck.co.uk/'>Cyber-Duck</a>) (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/5015a98f-d1c6-4520-bbb9-4aa35c4a1a44/gdpr-update-original-cookie-banner.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>But we wanted to be compliant, so we replaced it with this notice. You’ll see that tracking cookies are turned off by default — <strong>in line with ICO guidance</strong>. We knew there was a risk we would lose analytics data as GTM would no longer fire on first load.</p>

<p>Let’s see what happened.</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/075a850f-3306-42ca-8991-ff8acc2d335e/gdpr-update-new-cookie-banner.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/075a850f-3306-42ca-8991-ff8acc2d335e/gdpr-update-new-cookie-banner.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/075a850f-3306-42ca-8991-ff8acc2d335e/gdpr-update-new-cookie-banner.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/075a850f-3306-42ca-8991-ff8acc2d335e/gdpr-update-new-cookie-banner.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/075a850f-3306-42ca-8991-ff8acc2d335e/gdpr-update-new-cookie-banner.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/075a850f-3306-42ca-8991-ff8acc2d335e/gdpr-update-new-cookie-banner.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/075a850f-3306-42ca-8991-ff8acc2d335e/gdpr-update-new-cookie-banner.png"
			
			sizes="100vw"
			alt="Screengrab of new cookie consent notice showing marketing and analytics cookies turned off by default"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      Our new cookie banner followed ICO guidelines, but... (Image source: <a href='https://www.cyber-duck.co.uk/'>Cyber-Duck</a>) (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/075a850f-3306-42ca-8991-ff8acc2d335e/gdpr-update-new-cookie-banner.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>Problem solved? Actually, no. It just created another problem. The impact was far more significant than we expected:</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/6681c065-7e13-4aad-86d3-61d47fa952a3/gdpr-update-new-cookie-traffic.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/6681c065-7e13-4aad-86d3-61d47fa952a3/gdpr-update-new-cookie-traffic.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/6681c065-7e13-4aad-86d3-61d47fa952a3/gdpr-update-new-cookie-traffic.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/6681c065-7e13-4aad-86d3-61d47fa952a3/gdpr-update-new-cookie-traffic.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/6681c065-7e13-4aad-86d3-61d47fa952a3/gdpr-update-new-cookie-traffic.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/6681c065-7e13-4aad-86d3-61d47fa952a3/gdpr-update-new-cookie-traffic.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/6681c065-7e13-4aad-86d3-61d47fa952a3/gdpr-update-new-cookie-traffic.png"
			
			sizes="100vw"
			alt="Google Analytics screengrab showing tracked traffic fall when the new cookie consent was implemented"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      The new cookie consent caused our tracked traffic to collapse. (Image credits: <a href='https://www.cyber-duck.co.uk/'>Cyber-Duck</a>) (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/6681c065-7e13-4aad-86d3-61d47fa952a3/gdpr-update-new-cookie-traffic.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>Look at the collapse in the blue line when we implemented the new cookie notice. We released the new cookie consent on 17 December and went straight from plenty of tracked traffic to almost zero. (The orange line shows the previous year’s traffic, for comparison.)</p>

<p>In both the before-and-after scenarios, the default option was by far the most popular. Most users just naturally click on “accept” or “confirm”. That’s tricky, because we now <strong>know so little about the people visiting our site</strong> that we can’t give them the best information tailored to their needs.</p>

<p>We needed a solution. Analytics and marketing data ultimately drive business decisions. I’m sure we all know how important data is. In this case, it was like putting money in a bank account and not knowing how much we’d spent or saved!</p>

<p>Some of the solutions that were posed include <strong>design alternatives</strong> (would removing the toggle, or having two buttons with a visual nudge towards the “accept” help?) Or would we enable analytics cookies by default?</p>

<p>For now, we’ve implemented a compromise position. Marketing and analytics cookies are on by default, with one clear switch to toggle them off:</p>














<figure class="
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/81667310-5d1e-4715-9d6e-5bf12f1ab0db/gdpr-update-2nd-iteration-banner.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/81667310-5d1e-4715-9d6e-5bf12f1ab0db/gdpr-update-2nd-iteration-banner.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/81667310-5d1e-4715-9d6e-5bf12f1ab0db/gdpr-update-2nd-iteration-banner.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/81667310-5d1e-4715-9d6e-5bf12f1ab0db/gdpr-update-2nd-iteration-banner.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/81667310-5d1e-4715-9d6e-5bf12f1ab0db/gdpr-update-2nd-iteration-banner.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/81667310-5d1e-4715-9d6e-5bf12f1ab0db/gdpr-update-2nd-iteration-banner.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/81667310-5d1e-4715-9d6e-5bf12f1ab0db/gdpr-update-2nd-iteration-banner.png"
			
			sizes="100vw"
			alt="Screengrab showing iterated cookie notice with marketing and analytics cookies switched on by default"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      Then we iterated again. (Image credits: <a href='https://www.cyber-duck.co.uk/'>Cyber-Duck</a>) (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/81667310-5d1e-4715-9d6e-5bf12f1ab0db/gdpr-update-2nd-iteration-banner.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>And here’s what that’s done to our stats:</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/23ddeffe-cee5-436f-a91e-6551c596c15d/gdpr-update-2nd-iteration-traffic.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/23ddeffe-cee5-436f-a91e-6551c596c15d/gdpr-update-2nd-iteration-traffic.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/23ddeffe-cee5-436f-a91e-6551c596c15d/gdpr-update-2nd-iteration-traffic.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/23ddeffe-cee5-436f-a91e-6551c596c15d/gdpr-update-2nd-iteration-traffic.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/23ddeffe-cee5-436f-a91e-6551c596c15d/gdpr-update-2nd-iteration-traffic.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/23ddeffe-cee5-436f-a91e-6551c596c15d/gdpr-update-2nd-iteration-traffic.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/23ddeffe-cee5-436f-a91e-6551c596c15d/gdpr-update-2nd-iteration-traffic.png"
			
			sizes="100vw"
			alt="Google Analytics screengrab showing tracked traffic partially recover from 15 January"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      This iteration brought back a chunk of attributable traffic. (Image credits: <a href='https://www.cyber-duck.co.uk/'>Cyber-Duck</a>) (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/23ddeffe-cee5-436f-a91e-6551c596c15d/gdpr-update-2nd-iteration-traffic.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>The new cookie banner was relaunched on 15 January. You can see our website traffic starts to pick back up again. However, we’re not getting the full data we were getting before as Google Tag Manager doesn’t fire unless a user chooses cookies.</p>

<p>The good news is, we are getting some data back again! But the story doesn’t end here. After we had <strong>turned cookie tracking back on by default</strong>, the attribution model got messed up. It wasn’t attributing to the correct channel in Google Analytics.</p>

<p>Here’s what we mean:</p>

<div class="partners__lead-place"></div>

<h3 id="scenario-1-correct-attribution">Scenario 1: (Correct Attribution)</h3>

<ol>
<li>User lands on our website via a paid ad (PPC) or from the search result (organic)</li>
<li>User accepts cookies straight away.</li>
<li>The channel source is attributed correctly, e.g. to PPC.</li>
</ol>

<h3 id="scenario-2-incorrect-attribution">Scenario 2: (Incorrect Attribution)</h3>

<ol>
<li>User lands on our website via a paid ad (PPC) or from the search result (organic)</li>
<li>User visits a few other pages on our website without responding to the cookie banner prompt (banner appears on every page until it gets a response)</li>
<li>User finally accepts cookie banner after browsing a few pages.</li>
<li>Attribution comes through as direct — although they originally came from a search engine.</li>
</ol>

<p>How does that work? When a user browses other pages on the site, <strong>nothing is tracked until they respond to the cookie prompt</strong>. Tracking only kicks in at that point. So to Google, it looks as though the user has just landed on that page — and they are attributed to Direct traffic.</p>

<p>Back to the drawing board.</p>

<p><strong>Note</strong>: <em>I’m sure by now you’re starting to see a pattern here. This entire experience is new for us and there’s not a lot of documentation around, so it’s been a real learning curve.</em></p>

<p>Now, how could we solve this attribution issue and stop users from navigating around the site until they’ve selected their cookie preference?</p>

<p>A <strong>cookie wall</strong> is one option we considered, but that would potentially push us further away from being compliant, according to the ICO. (Though you might like to try browsing their site incognito and see if they stick to their own guidance&hellip;)</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d657d06c-374e-4c0c-9ec0-0737366dd7da/gdpr-update-cookie-compromise.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d657d06c-374e-4c0c-9ec0-0737366dd7da/gdpr-update-cookie-compromise.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d657d06c-374e-4c0c-9ec0-0737366dd7da/gdpr-update-cookie-compromise.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d657d06c-374e-4c0c-9ec0-0737366dd7da/gdpr-update-cookie-compromise.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d657d06c-374e-4c0c-9ec0-0737366dd7da/gdpr-update-cookie-compromise.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d657d06c-374e-4c0c-9ec0-0737366dd7da/gdpr-update-cookie-compromise.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d657d06c-374e-4c0c-9ec0-0737366dd7da/gdpr-update-cookie-compromise.png"
			
			sizes="100vw"
			alt="Screengrab showing compromise cookie consent notice with tracking switched on by default"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      In the end, we had to settle on a compromise. (Image credits: <a href='https://www.cyber-duck.co.uk/'>Cyber-Duck</a>) (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d657d06c-374e-4c0c-9ec0-0737366dd7da/gdpr-update-cookie-compromise.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>But that’s what we’ve chosen to go with. The journey ends here for now, as we’re still gathering data. In the future, we want to <strong>explore other tools</strong> and the potential impact of moving away from Google Analytics.</p>

<p>So what’s everyone else doing?</p>

<p>Well, McDonald’s UK offers straightforward on/off buttons:</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/3138de66-b868-43c0-8735-2489f228e723/gdpr-update-mcdonalds.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/3138de66-b868-43c0-8735-2489f228e723/gdpr-update-mcdonalds.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/3138de66-b868-43c0-8735-2489f228e723/gdpr-update-mcdonalds.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/3138de66-b868-43c0-8735-2489f228e723/gdpr-update-mcdonalds.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/3138de66-b868-43c0-8735-2489f228e723/gdpr-update-mcdonalds.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/3138de66-b868-43c0-8735-2489f228e723/gdpr-update-mcdonalds.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/3138de66-b868-43c0-8735-2489f228e723/gdpr-update-mcdonalds.png"
			
			sizes="100vw"
			alt="Screengrab of McDonald’s cookie consent offering three options: reject all, accept cookies and cookie settings"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      McDonald’s UK gives straightforward cookie choices. (Image credits: <a href='https://www.mcdonalds.com/gb/en-gb.html'>McDonald’s UK</a>) (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/3138de66-b868-43c0-8735-2489f228e723/gdpr-update-mcdonalds.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>Coca Cola’s British site nudges you to accept by making the ‘reject’ option harder to find:</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d0488bcc-c323-43fb-be95-588cbface3ee/gdpr-update-coca-cola.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d0488bcc-c323-43fb-be95-588cbface3ee/gdpr-update-coca-cola.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d0488bcc-c323-43fb-be95-588cbface3ee/gdpr-update-coca-cola.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d0488bcc-c323-43fb-be95-588cbface3ee/gdpr-update-coca-cola.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d0488bcc-c323-43fb-be95-588cbface3ee/gdpr-update-coca-cola.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d0488bcc-c323-43fb-be95-588cbface3ee/gdpr-update-coca-cola.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d0488bcc-c323-43fb-be95-588cbface3ee/gdpr-update-coca-cola.png"
			
			sizes="100vw"
			alt="Screengrab of Coca-Cola’s cookie consent notice with ‘accept all cookies’ highlighted"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      Coca-Cola’s UK site nudges you to accept cookies. (Image credits: <a href='https://www.coca-cola.co.uk/'>Coca Cola UK</a>) (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/d0488bcc-c323-43fb-be95-588cbface3ee/gdpr-update-coca-cola.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>Whereas Sanrio just has an option to agree to ad tracking:</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/328b6fc2-ace4-40ea-a069-d7956e8eb391/gdpr-update-sanrio.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/328b6fc2-ace4-40ea-a069-d7956e8eb391/gdpr-update-sanrio.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/328b6fc2-ace4-40ea-a069-d7956e8eb391/gdpr-update-sanrio.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/328b6fc2-ace4-40ea-a069-d7956e8eb391/gdpr-update-sanrio.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/328b6fc2-ace4-40ea-a069-d7956e8eb391/gdpr-update-sanrio.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/328b6fc2-ace4-40ea-a069-d7956e8eb391/gdpr-update-sanrio.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/328b6fc2-ace4-40ea-a069-d7956e8eb391/gdpr-update-sanrio.png"
			
			sizes="100vw"
			alt="Screengrab of Sanrio’s cookie consent showing ‘Ok’ confirmation button"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      Sanrio just gives the option to agree to cookies. (Image credit: <a href='https://www.sanrio.com/'>Sanrio.com</a>) (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/328b6fc2-ace4-40ea-a069-d7956e8eb391/gdpr-update-sanrio.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>Hello Kitty, hello cookies.</p>

<p>Die Zeit offers free access if you accept tracking cookies — but for an untracked, ad-free experience you’ll have to pay:</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/f5fc212a-3eff-4120-8883-661f8202670e/gdpr-update-zeit.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/f5fc212a-3eff-4120-8883-661f8202670e/gdpr-update-zeit.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/f5fc212a-3eff-4120-8883-661f8202670e/gdpr-update-zeit.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/f5fc212a-3eff-4120-8883-661f8202670e/gdpr-update-zeit.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/f5fc212a-3eff-4120-8883-661f8202670e/gdpr-update-zeit.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/f5fc212a-3eff-4120-8883-661f8202670e/gdpr-update-zeit.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/f5fc212a-3eff-4120-8883-661f8202670e/gdpr-update-zeit.png"
			
			sizes="100vw"
			alt="Screengrab of Zeit’s cookie consent"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      Die Zeit offers free access with cookies — but for an untracked experience, you have to subscribe. (Image credit: <a href='https://www.zeit.de/'>Die Zeit</a>) (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/f5fc212a-3eff-4120-8883-661f8202670e/gdpr-update-zeit.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>And here’s one of my favourite dark patterns. This restaurant site only has the ‘Necessary’ cookies selected. But it nudges you to the ‘Allow all cookies’ big red button — and when you click that, the analytical and ad cookie boxes are automatically checked and set. <a href="https://www.pinchos.se/">Give it a go here!</a></p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/0a7a173b-1844-4ae6-ae2d-d2063c71f360/gdpr-update-pinchos.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/0a7a173b-1844-4ae6-ae2d-d2063c71f360/gdpr-update-pinchos.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/0a7a173b-1844-4ae6-ae2d-d2063c71f360/gdpr-update-pinchos.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/0a7a173b-1844-4ae6-ae2d-d2063c71f360/gdpr-update-pinchos.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/0a7a173b-1844-4ae6-ae2d-d2063c71f360/gdpr-update-pinchos.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/0a7a173b-1844-4ae6-ae2d-d2063c71f360/gdpr-update-pinchos.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/0a7a173b-1844-4ae6-ae2d-d2063c71f360/gdpr-update-pinchos.png"
			
			sizes="100vw"
			alt="Screengrab of Pinchos cookie consent"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      Pinchos’ cookie consent is a good example of a dark pattern. (Imagae credit: <a href='https://www.pinchos.se/'>Pinchos.se</a>) (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/0a7a173b-1844-4ae6-ae2d-d2063c71f360/gdpr-update-pinchos.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>Even the EU isn’t consistent on its own sites.</p>

<p>The European Parliament’s cookie consent offers two clear options:</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/ed83771d-3ab9-4d29-b3f5-5d34218dd527/gdpr-update-euro-parliament.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/ed83771d-3ab9-4d29-b3f5-5d34218dd527/gdpr-update-euro-parliament.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/ed83771d-3ab9-4d29-b3f5-5d34218dd527/gdpr-update-euro-parliament.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/ed83771d-3ab9-4d29-b3f5-5d34218dd527/gdpr-update-euro-parliament.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/ed83771d-3ab9-4d29-b3f5-5d34218dd527/gdpr-update-euro-parliament.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/ed83771d-3ab9-4d29-b3f5-5d34218dd527/gdpr-update-euro-parliament.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/ed83771d-3ab9-4d29-b3f5-5d34218dd527/gdpr-update-euro-parliament.png"
			
			sizes="100vw"
			alt="Screengrab of the European Parliament’s cookie consent"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      The European Parliament’s cookie notice gives two clear options. (Image credit: <a href='https://www.europarl.europa.eu/portal/en'>European Parliament</a>) (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/ed83771d-3ab9-4d29-b3f5-5d34218dd527/gdpr-update-euro-parliament.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>The CJEU’s site isn’t so clear:</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/b16022cb-8280-491f-bdf3-537bd4a71ab6/gdpr-update-cjeu.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/b16022cb-8280-491f-bdf3-537bd4a71ab6/gdpr-update-cjeu.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/b16022cb-8280-491f-bdf3-537bd4a71ab6/gdpr-update-cjeu.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/b16022cb-8280-491f-bdf3-537bd4a71ab6/gdpr-update-cjeu.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/b16022cb-8280-491f-bdf3-537bd4a71ab6/gdpr-update-cjeu.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/b16022cb-8280-491f-bdf3-537bd4a71ab6/gdpr-update-cjeu.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/b16022cb-8280-491f-bdf3-537bd4a71ab6/gdpr-update-cjeu.png"
			
			sizes="100vw"
			alt="Screengrab of the CJEU’s cookie consent"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      The CJEU’s cookie consent offers three choices: necessary cookies, accept all and more information. (Image credit: <a href='https://curia.europa.eu/jcms/jcms/j_6/en/'>EU Court of Justice</a>) (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/b16022cb-8280-491f-bdf3-537bd4a71ab6/gdpr-update-cjeu.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>While Europol’s site comes with two pre-checked boxes:</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/359fdf24-ed49-458b-b2bb-b79473595601/gdpr-update-europol.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/359fdf24-ed49-458b-b2bb-b79473595601/gdpr-update-europol.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/359fdf24-ed49-458b-b2bb-b79473595601/gdpr-update-europol.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/359fdf24-ed49-458b-b2bb-b79473595601/gdpr-update-europol.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/359fdf24-ed49-458b-b2bb-b79473595601/gdpr-update-europol.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/359fdf24-ed49-458b-b2bb-b79473595601/gdpr-update-europol.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/359fdf24-ed49-458b-b2bb-b79473595601/gdpr-update-europol.png"
			
			sizes="100vw"
			alt="Screengrab of Europol’s cookie consent showing mandatory and tracking cookies checked"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      Europol’s cookie consent has analytics cookies automatically checked. (Image credit: <a href='https://www.europol.europa.eu/'>Europol</a>) (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/359fdf24-ed49-458b-b2bb-b79473595601/gdpr-update-europol.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>And if you look at the sites for the <a href="https://www.eu2020.de/eu2020-en">German presidency of the Council of the European Union</a> (July–December 2020), at first it seems as if there’s no cookies at all:</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/aa8c4e88-79f1-4f33-8943-45a738a1ddbb/gdpr-update-eu2020.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/aa8c4e88-79f1-4f33-8943-45a738a1ddbb/gdpr-update-eu2020.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/aa8c4e88-79f1-4f33-8943-45a738a1ddbb/gdpr-update-eu2020.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/aa8c4e88-79f1-4f33-8943-45a738a1ddbb/gdpr-update-eu2020.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/aa8c4e88-79f1-4f33-8943-45a738a1ddbb/gdpr-update-eu2020.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/aa8c4e88-79f1-4f33-8943-45a738a1ddbb/gdpr-update-eu2020.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/aa8c4e88-79f1-4f33-8943-45a738a1ddbb/gdpr-update-eu2020.png"
			
			sizes="100vw"
			alt="Screengrab of Germany’s EU2020 site showing no cookies and no cookie consent notice"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      Cookies? What cookies? (Image credit: <a href='https://www.eu2020.de/eu2020-en'>eu2020.de</a>) (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/aa8c4e88-79f1-4f33-8943-45a738a1ddbb/gdpr-update-eu2020.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>When you land on the site, there are no cookie banners or prompts. A closer look, with cookie extension tools, shows that no cookies are being placed either.</p>

<p>So are they capturing any analytics data? The answer is yes.</p>














<figure class="
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/9e07adc6-6f25-4f5e-bf9e-52d0a039eab1/gdpr-update-piwik.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/9e07adc6-6f25-4f5e-bf9e-52d0a039eab1/gdpr-update-piwik.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/9e07adc6-6f25-4f5e-bf9e-52d0a039eab1/gdpr-update-piwik.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/9e07adc6-6f25-4f5e-bf9e-52d0a039eab1/gdpr-update-piwik.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/9e07adc6-6f25-4f5e-bf9e-52d0a039eab1/gdpr-update-piwik.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/9e07adc6-6f25-4f5e-bf9e-52d0a039eab1/gdpr-update-piwik.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/9e07adc6-6f25-4f5e-bf9e-52d0a039eab1/gdpr-update-piwik.png"
			
			sizes="100vw"
			alt="Screengrab of Matomo code from eu2020.de"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      The eu2020.de site tracks users using Piwik, now Matomo. No cookies here! (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/9e07adc6-6f25-4f5e-bf9e-52d0a039eab1/gdpr-update-piwik.png'>Large preview</a>)
    </figcaption>
  
</figure>

<p>We found this little snippet in their code, which shows they are using ‘Piwik’. Piwik is now known as <a href="https://matomo.org/">Matomo</a>, one of a clutch of new tools that help with cookie compliance along with <a href="https://usefathom.com/">Fathom</a> (server-side tracking) and <a href="http://helloconsent.com/">HelloConsent</a> (cookie management).</p>

<p>So <strong>alternatives and solutions are emerging</strong>. We’ll take a closer look at that next time — with new alternatives to third-party cookies that will help you take control of your data and get the insight you need to deliver optimum experiences to your customers. Stay tuned!</p>

<h3 id="other-resources">Other Resources</h3>

<ul>
<li><a href="https://ec.europa.eu/info/law/law-topic/data-protection_en">Data protection</a> (the EU’s site)</li>
<li>UK ICO’s <a href="https://ico.org.uk/for-organisations/guide-to-pecr/guidance-on-the-use-of-cookies-and-similar-technologies/how-do-we-comply-with-the-cookie-rules/#comply15">Guidance On Cookies</a></li>
<li><a href="https://www.enforcementtracker.com/">GDPR Enforcement Tracker</a>, logs fines applied under GDPR</li>
<li><a href="https://www.cyber-duck.co.uk/insights/resources/gdpr-checklist">GDPR Checklist</a>, by Cyber-Duck — a great place to start</li>
<li>Overview of <a href="https://iclg.com/practice-areas/data-protection-laws-and-regulations/usa">Data Protection Law in the United States</a>, by ICLG</li>
<li><a href="https://fpf.org/wp-content/uploads/2018/11/GDPR_CCPA_Comparison-Guide.pdf">GDPR &amp; CCPA Comparison Guide</a>, by DataGuidance and the Future of Privacy Forum</li>
<li><a href="https://iapp.org/news/a/cpra-analysis-the-good-and-bad-news-for-ccpa-regulated-businesses/">CCPA vs CPRA</a>, from IAPP</li>
<li><a href="https://aws.amazon.com/compliance/security-by-design/">Security By Design</a> (Amazon)</li>
<li><a href="https://www.smashingmagazine.com/2017/07/privacy-by-design-framework/">How To Protect Your Users With The Privacy By Design Framework</a>, Heather Burns, Smashing Magazine</li>
</ul>

<div class="partners__lead-place"></div>

<h3 id="further-reading">Further Reading</h3>

<ul>
<li><a href="https://www.smashingmagazine.com/2018/02/gdpr-for-web-developers/">How GDPR Will Change The Way You Develop</a></li>
<li><a href="https://www.smashingmagazine.com/2018/09/privacy-by-design/">Privacy By Design: How To Sell Privacy And Make Change</a></li>
<li><a href="https://www.smashingmagazine.com/2023/03/access-handling-data-management-row-level-security/">Fine-Grained Access Handling And Data Management With Row-Level Security</a></li>
<li><a href="https://www.smashingmagazine.com/2023/04/potentially-dangerous-non-accessibility-cookie-notices/">The Potentially Dangerous Non-Accessibility Of Cookie Notices</a></li>
</ul>

<div class="signature">
  <img src="https://www.smashingmagazine.com/images/logo/logo--red.png" alt="Smashing Editorial" width="35" height="46" loading="lazy" decoding="async" />
  <span>(vf, il, mrn)</span>
</div>


              </article>
            </body>
          </html>
        ]]></content:encoded></item><item><author>Danny Bluestone</author><title>State Of GDPR In 2021: Key Updates And What They Mean</title><link>https://www.smashingmagazine.com/2021/02/state-gdpr-2021-key-updates/</link><pubDate>Mon, 22 Feb 2021 13:00:00 +0000</pubDate><guid>https://www.smashingmagazine.com/2021/02/state-gdpr-2021-key-updates/</guid><description>As digital practitioners, GDPR has impacted every facet of our professional and personal lives. Whether you’re addicted to Instagram, message your family on WhatsApp, buy products from Etsy or Google information, no one has escaped the rules that were introduced in 2018.</description><content:encoded><![CDATA[
          <html>
            <head>
              <meta charset="utf-8">
              <link rel="canonical" href="https://www.smashingmagazine.com/2021/02/state-gdpr-2021-key-updates/" />
              <title>State Of GDPR In 2021: Key Updates And What They Mean</title>
            </head>
            <body>
              <article>
                <header>
                  <h1>State Of GDPR In 2021: Key Updates And What They Mean</h1>
                  
                    
                    <address>Danny Bluestone</address>
                  
                  <time datetime="2021-02-22T13:00:00&#43;00:00" class="op-published">2021-02-22T13:00:00+00:00</time>
                  <time datetime="2021-02-22T13:00:00&#43;00:00" class="op-modified">2026-02-09T03:03:08+00:00</time>
                </header>
                
                

<p>The EU’s directives have impacted virtually every digital professional as products and services are designed with GDPR in mind, regardless of whether you’re a web design company in Wisconsin or a marketer in Malta. The far-reaching <strong>implications of GDPR</strong> don’t just impact how data should be processed, how products should be built and how data is transferred securely within and between organisations. It defines international data transfer agreements like that between Europe and America.</p>

<p><a href="https://www.theguardian.com/technology/2010/oct/24/my-bright-idea-kevin-kelly">Kevin Kelly</a>, one of the world’s brightest digital futurists, claims that &lsquo;Technology is as great a force as nature&rsquo;. What he means by that is that user data and information technology is causing one of the most profound periods in human history since the invention of language. Just look at what is happening as governments and the tech multinationals grapple to control the Internet.</p>

<p>Last week alone, as the Australian government moved to force platform owners to pay publishers for the content that’s shared on their platform, Facebook decided to <a href="https://www.wired.co.uk/article/facebook-australia-rupert-murdoch">block news to Australian users</a> with a huge uproar from the Australian government.</p>

<p>And that’s in addition to previous controversies (the organisation of the <a href="https://www.cnbc.com/2021/01/11/sandberg-says-us-capitol-riot-was-not-organized-on-facebook.html">U.S. Capitol riot</a>, the <a href="https://www.wired.com/story/cambridge-analytica-facebook-privacy-awakening/">Cambridge Analytica scandal</a>) at the intersection where government and technology meet.</p>

<p>In this article, we’ll look at how GDPR has evolved since 2018. We’ll run through some updates from the EU, some key developments, and where GDPR is likely to evolve. We’ll explore <strong>what that means for us</strong>, as designers and developers. And we’ll look at what that means for companies both inside and outside the EU.</p>

<p>In the next article, we’ll focus on cookie consent and the paradox where marketers are heavily reliant on Google Analytics cookie data but need to comply with regulations. And then we’ll take a deep dive into first-party ad tracking as we start to see moves away from third-party cookies.</p>

<ul>
<li><strong>Part 1: GDPR, Key Updates And What They Mean</strong></li>
<li><a href="https://www.smashingmagazine.com/2021/03/state-gdpr-2021-cookie-consent-designers-developers/">Part 2: Cookie Consent For Designers And Developers</a>

<br /></li>
</ul>

<div data-audience="non-subscriber" data-remove="true" class="feature-panel-container">

<aside class="feature-panel" style="">
<div class="feature-panel-left-col">

<div class="feature-panel-description"><p><p>Meet <a data-instant href="/the-smashing-newsletter/"><strong>Smashing Email Newsletter</strong></a> with useful tips on front-end, design &amp; UX. Subscribe and <strong>get “Smart Interface Design Checklists”</strong> &mdash; a <strong>free PDF deck</strong> with 150+ questions to ask yourself when designing and building almost <em>anything</em>.</p><div><section class="nlbf"><form action="//smashingmagazine.us1.list-manage.com/subscribe/post?u=16b832d9ad4b28edf261f34df&amp;id=a1666656e0" method="post"><div class="nlbwrapper"><label for="mce-EMAIL-hp" class="sr-only">Your (smashing) email</label><div class="nlbgroup"><input type="email" name="EMAIL" class="nlbf-email" id="mce-EMAIL-hp" placeholder="Your email">
<input type="submit" value="Meow!" name="subscribe" class="nlbf-button"></div></div></form><style>.c-garfield-the-cat .nlbwrapper{margin-bottom: 0;}.nlbf{display:flex;padding-bottom:.25em;padding-top:.5em;text-align:center;letter-spacing:-.5px;color:#fff;font-size:1.15em}.nlbgroup:hover{box-shadow:0 1px 7px -5px rgba(50,50,93,.25),0 3px 16px -8px rgba(0,0,0,.3),0 -6px 16px -6px rgba(0,0,0,.025)}.nlbf .nlbf-button,.nlbf .nlbf-email{flex-grow:1;flex-shrink:0;width:auto;margin:0;padding:.75em 1em;border:0;border-radius:11px;background:#fff;font-size:1em;box-shadow:none}.promo-box .nlbf-button:focus,.promo-box input.nlbf-email:active,.promo-box input.nlbf-email:focus{box-shadow:none}.nlbf-button:-ms-input-placeholder,.nlbf-email:-ms-input-placeholder{color:#777;font-style:italic}.nlbf-button::-webkit-input-placeholder,.nlbf-email::-webkit-input-placeholder{color:#777;font-style:italic}.nlbf-button:-ms-input-placeholder,.nlbf-button::-moz-placeholder,.nlbf-button::placeholder,.nlbf-email:-ms-input-placeholder,.nlbf-email::-moz-placeholder,.nlbf-email::placeholder{color:#777;font-style:italic}.nlbf .nlbf-button{transition:all .2s ease-in-out;color:#fff;background-color:#0168b8;font-weight:700;box-shadow:0 1px 1px rgba(0,0,0,.3);width:100%;border:0;border-left:1px solid #ddd;flex:2;border-top-left-radius:0;border-bottom-left-radius:0}.nlbf .nlbf-email{border-top-right-radius:0;border-bottom-right-radius:0;width:100%;flex:4;min-width:150px}@media all and (max-width:650px){.nlbf .nlbgroup{flex-wrap:wrap;box-shadow:none}.nlbf .nlbf-button,.nlbf .nlbf-email{border-radius:11px;border-left:none}.nlbf .nlbf-email{box-shadow:0 13px 27px -5px rgba(50,50,93,.25),0 8px 16px -8px rgba(0,0,0,.3),0 -6px 16px -6px rgba(0,0,0,.025);min-width:100%}.nlbf .nlbf-button{margin-top:1em;box-shadow:0 1px 1px rgba(0,0,0,.5)}}.nlbf .nlbf-button:active,.nlbf .nlbf-button:focus,.nlbf .nlbf-button:hover{cursor:pointer;color:#fff;background-color:#0168b8;border-color:#dadada;box-shadow:0 1px 1px rgba(0,0,0,.3)}.nlbf .nlbf-button:active,.nlbf .nlbf-button:focus{outline:0!important;text-shadow:1px 1px 1px rgba(0,0,0,.3);box-shadow:inset 0 3px 3px rgba(0,0,0,.3)}.nlbgroup{display:flex;box-shadow:0 13px 27px -5px rgba(50,50,93,.25),0 8px 16px -8px rgba(0,0,0,.3),0 -6px 16px -6px rgba(0,0,0,.025);border-radius:11px;transition:box-shadow .2s ease-in-out}.nlbwrapper{display:flex;flex-direction:column;justify-content:center}.nlbf form{width:100%}.nlbf .nlbgroup{margin:0}.nlbcaption{font-size:.9em;line-height:1.5em;color:#fff;border-radius:11px;padding:.5em 1em;display:inline-block;background-color:#0067b859;text-shadow:1px 1px 1px rgba(0,0,0,.3)}.wf-loaded-stage2 .nlbf .nlbf-button{font-family:Mija}.mts{margin-top: 5px !important;}.mbn{margin-bottom: 0 !important;}</style></section><p class="mts mbn"><small class="promo-box__footer mtm block grey"><em>Once a week. Useful tips on <a href="https://www.smashingmagazine.com/the-smashing-newsletter/">front-end &amp; UX</a>. Trusted by 207.000 friendly folks.</em></small></p></div></p>
</div>
</div>
<div class="feature-panel-right-col">
<div class="feature-panel-image">
<img
    loading="lazy"
    decoding="async"
    class="feature-panel-image-img"
    src="/images/smashing-cat/cat-firechat.svg"
    alt="Feature Panel"
    width="310"
    height="400"
/>

</div>

<p></div>
</aside>
</div></p>

<h2 id="a-quick-recap-of-gdpr">A Quick Recap Of GDPR</h2>

<p>Let’s start by reminding ourselves what GDPR is. The GDPR became law within the EU on 25 May 2018. It’s based on 7 key <a href="https://ico.org.uk/for-organisations/guide-to-data-protection/guide-to-the-general-data-protection-regulation-gdpr/principles/">principles</a>:</p>

<ol>
<li><strong>Lawfulness, fairness and transparency</strong><br />
You must process data so that people understand what, how, and why you’re processing their data.</li>
<li><strong>Purpose limitation</strong><br />
You should only collect data for clear, specified, and legitimate purposes. You can’t then process it in ways that are incompatible with your original purposes.</li>
<li><strong>Data minimization</strong><br />
You should only collect the data you need.</li>
<li><strong>Accuracy</strong><br />
Your data must be accurate and kept up to date. Inaccurate data should be erased or corrected.</li>
<li><strong>Storage limitation</strong><br />
If data can be linked to individuals, you can only keep it for as long as you need to carry out the purposes you specified. (Caveats for scientific, statistical, or historical research use.)</li>
<li><strong>Integrity and confidentiality (i.e. security)</strong><br />
You must ensure the personal data you hold is processed securely. You must protect it from unauthorized or unlawful processing and against accidental loss, destruction, or damage.</li>
<li><strong>Accountability</strong><br />
You are now responsible for the data you hold and should be able to demonstrate your compliance with the GDPR.</li>
</ol>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/bcf6e148-b2f3-48d5-b752-ad8a541841cc/gdpr-update-gdpr-diagram.jpg">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="539"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/bcf6e148-b2f3-48d5-b752-ad8a541841cc/gdpr-update-gdpr-diagram.jpg 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/bcf6e148-b2f3-48d5-b752-ad8a541841cc/gdpr-update-gdpr-diagram.jpg 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/bcf6e148-b2f3-48d5-b752-ad8a541841cc/gdpr-update-gdpr-diagram.jpg 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/bcf6e148-b2f3-48d5-b752-ad8a541841cc/gdpr-update-gdpr-diagram.jpg 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/bcf6e148-b2f3-48d5-b752-ad8a541841cc/gdpr-update-gdpr-diagram.jpg 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/bcf6e148-b2f3-48d5-b752-ad8a541841cc/gdpr-update-gdpr-diagram.jpg"
			
			sizes="100vw"
			alt="Diagram showing the seven principles of GDPR: lawfulness, integrity, storage and purpose limitations, data minimisation and accuracy, and accountability - overlaid with transparency, privacy and controls"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      GDPR’s principles are based on transparency, privacy and user control. (Image credit: <a href='https://www.cyber-duck.co.uk/what-we-do/digital-optimisation/gdpr-compliance'>Cyber-Duck</a>) (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/bcf6e148-b2f3-48d5-b752-ad8a541841cc/gdpr-update-gdpr-diagram.jpg'>Large preview</a>)
    </figcaption>
  
</figure>

<h3 id="some-definitions">Some Definitions</h3>

<ul>
<li><strong>CJEU</strong><br /><a href="https://europa.eu/european-union/about-eu/institutions-bodies/court-justice_en">Court of Justice of the European Union</a>. This court’s decisions clarify EU laws like GDPR.</li>
<li><strong>DPAs</strong><br />National Data Protection Authorities. Each EU country has one. GDPR is enforced, and fines are issued, at the national level by these bodies. The UK equivalent is the Information Commissioner’s Office (<a href="https://ico.org.uk/">ICO</a>). In the United States, GDPR-style data privacy is largely legislated by each state.</li>
<li><strong>European Commission</strong><br />The executive branch of the European Union (essentially the EU’s civil service). The European Commission drafts legislation including the GDPR.</li>
<li><strong>GDPR</strong><br /><a href="https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX%3A02016R0679-20160504&qid=1532348683434">The 2018 General Data Protection Regulation</a>.</li>
</ul>

<h2 id="key-updates-from-the-eu">Key Updates From The EU</h2>

<p>GDPR hasn’t stood still since May 2018. Here’s a quick run-through of what’s happened since it came into effect.</p>

<h3 id="how-have-the-eu-and-its-member-states-implemented-gdpr">How Have The EU And Its Member States Implemented GDPR?</h3>

<p>The European Commission <a href="https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX%3A52020DC0264">reports</a> that GDPR is almost fully implemented across the EU, though some countries — it namechecks Slovenia — have dragged their feet. However, the depth of implementation varies. The EU also says its member countries are, in its opinion, using their new powers fairly.</p>

<p>However, it has also expressed concern that some divergence and fragmentation are creeping in. GDPR can only work effectively across the EU’s single market <strong>if member states are aligned</strong>. If the laws diverge, it muddies the water.</p>

<h3 id="how-does-the-eu-want-gdpr-to-develop">How Does The EU Want GDPR To Develop?</h3>

<p>We know the EU wants it to be easier for individuals to exercise their rights under GDPR. That means cross-border collaboration and <strong>class-action lawsuits</strong>. It wants to see data portability for consumers beyond banking and telecoms.</p>

<p>It also wants to make it easier for
small and medium-sized enterprises (<em>SMEs</em>) to comply with GDPR. That’s likely to come in the form of extra support and tools such as more standard contractual clauses — essentially templated legalese that SMEs can copy/paste into contracts — as the EU isn’t keen to bend the rules for them.</p>

<h2 id="big-development-1-the-unexpectedly-broad-definition-of-joint-controller">Big Development #1: The Unexpectedly Broad Definition Of ‘Joint Controller’</h2>

<p>Right, here’s the first big change since GDPR became law. In two test cases involving Facebook, the Court of Justice of the European Union has defined a far broader interpretation of ‘joint controller’ than expected.</p>

<p>A <strong>joint controller</strong> situation arises when two or more controllers both have responsibility for meeting the terms of the GDPR. (Here’s a good explainer from the ICO on <a href="https://ico.org.uk/for-organisations/guide-to-data-protection/guide-to-the-general-data-protection-regulation-gdpr/controllers-and-processors/what-does-it-mean-if-you-are-joint-controllers/">joint controllers</a>.) Essentially:</p>

<ul>
<li>When you process customer data, you decide with your fellow joint controller(s) who will manage each step so you’re compliant with the GDPR.</li>
<li>However, you all have full <strong>responsibility to ensure the entire process is compliant</strong>. Each of you is fully accountable to the data protection authority in the country handling any complaints.</li>
<li>An individual can raise a complaint against each and all joint controllers.</li>
<li>You are all responsible for any damage caused — unless you can prove you have no connection to the event that’s caused the damage.</li>
<li>An individual can seek compensation from any joint controller. You may be able to reclaim some of that compensation from your fellow controllers.</li>
</ul>

<p>In the first Facebook case, the CJEU confirmed that <a href="https://panopticonblog.com/2018/06/05/the-facebook-fan-page-judgment-joint-data-controllers-cookies-and-targeted-advertising/">a company that ran a Facebook fan page</a> counted as a joint controller alongside Facebook. In the second, the CJEU also confirmed that <a href="https://www.insideprivacy.com/international/european-union/cjeu-rules-that-facebook-and-website-operators-are-joint-controllers-if-the-website-embeds-facebooks-like-button/">a company that embedded a Facebook Like button</a> onto its website held joint controller status with the social network.</p>

<p>These cases sent shockwaves through the privacy community, as essentially it makes social publishers, website operators, and fan page moderators responsible for user data alongside platforms like Facebook.</p>

<p>However, the CJEU also clarified that <strong>shared responsibility does not mean equal responsibility</strong>. In both cases, responsibility sat primarily with Facebook — only Facebook had access to the data and only Facebook could delete it. So the impact of this decision may be less severe than it sounds at first — but it’s still critically important.</p>

<p>And that might be why some sites — such as the website for <a href="https://www.eu2020.de/eu2020-en">Germany’s 2020 presidency of the EU</a> — block embedded social content by default, until you’ve specifically opted in:</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/6dd85278-fdf4-4fba-a955-2e196d00e998/gdpr-update-eu2020-social.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="466"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/6dd85278-fdf4-4fba-a955-2e196d00e998/gdpr-update-eu2020-social.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/6dd85278-fdf4-4fba-a955-2e196d00e998/gdpr-update-eu2020-social.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/6dd85278-fdf4-4fba-a955-2e196d00e998/gdpr-update-eu2020-social.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/6dd85278-fdf4-4fba-a955-2e196d00e998/gdpr-update-eu2020-social.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/6dd85278-fdf4-4fba-a955-2e196d00e998/gdpr-update-eu2020-social.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/6dd85278-fdf4-4fba-a955-2e196d00e998/gdpr-update-eu2020-social.png"
			
			sizes="100vw"
			alt="Screengrab of eu2020.de showing social feed content blocked until third-party tracking is switched on"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      Some sites are starting to block embedded social feeds from appearing on their sites by default, offering users the choice to opt-in with tracking. (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/6dd85278-fdf4-4fba-a955-2e196d00e998/gdpr-update-eu2020-social.png'>Large preview</a>)
    </figcaption>
  
</figure>

<h2 id="big-development-2-bye-bye-privacy-shield-hello-cpra">Big Development #2: Bye Bye Privacy Shield, Hello CPRA</h2>

<p>The second big change was more predictable: <strong>Privacy Shield</strong>, the mechanism that made it easier for American businesses to process European customer data, has been struck down by the courts.</p>

<p>Here’s why.</p>

<p>The EU wants to protect its citizens’ personal data. However, it also wants to encourage international trade, plus cross-border collaboration in areas like security.</p>

<blockquote class="pull-quote">
  <p>
    <a class="pull-quote__link" aria-label="Share on Twitter" href="https://twitter.com/share?text=%0aThe%20EU%20sees%20itself%20%e2%80%94%20quite%20rightly%20%e2%80%94%20as%20a%20pioneer%20in%20data%20protection.%20So%20it%e2%80%99s%20using%20its%20political%20muscle%20to%20encourage%20countries%20who%20want%20to%20trade%20with%20the%20bloc%20to%20match%20its%20data%20privacy%20standards.%0a&url=https://smashingmagazine.com%2f2021%2f02%2fstate-gdpr-2021-key-updates%2f">
      
The EU sees itself — quite rightly — as a pioneer in data protection. So it’s using its political muscle to encourage countries who want to trade with the bloc to match its data privacy standards.

    </a>
  </p>
  <div class="pull-quote__quotation">
    <div class="pull-quote__bg">
      <span class="pull-quote__symbol">“</span></div>
  </div>
</blockquote>

<p>Enter the United States. European and American philosophies around data privacy are <strong>diametrically opposed</strong>. (In essence, the European view is that personal data is private unless you give explicit permission. The American view is that your data is public unless you expressly request that it’s kept private.) But as the world’s two biggest consumer markets, they need to trade. So the EU and the US developed Privacy Shield.</p>

<p>Privacy Shield was designed to enable US companies to process EU citizens’ data, as long as those companies signed up to its higher privacy standards.</p>

<p>But under US law, the US government could still monitor that data. This was challenged in a case brought by Austrian privacy advocate Max Schrems. The CJEU sided with him: <a href="https://www.bbc.co.uk/news/technology-53418898">Privacy Shield was struck down</a> and the 5,300 American SMEs who used Privacy Shield were given no choice but to adopt the EU’s prescribed Standard Contractual Clauses.</p>

<p>Obviously, it’s in everyone’s interests for Privacy Shield to be <em>replaced</em> — and it will be. But experts say that its replacement is likely to be struck down again in due course because European and American approaches to privacy are essentially incompatible.</p>

<p>Meanwhile, in California, 2018’s GDPR-inspired California Consumer Privacy Act (CCPA) was strengthened in November 2020 when the <a href="https://iapp.org/resources/article/the-california-privacy-rights-act-of-2020/">California Privacy Rights Act (CPRA)</a> was passed.</p>

<h4 id="the-california-consumer-privacy-act-ccpa">The California Consumer Privacy Act (CCPA)</h4>

<p>The CCPA, which came into effect in January 2020, gives California citizens the <strong>right to opt out of their data being sold</strong>. They can also ask for any data that’s been collected to be disclosed and they can ask for that data to be deleted.
Unlike GDPR, the CCPA only applies to commercial companies:</p>

<ul>
<li>Who process the data of more than 50,000 California residents a year, OR</li>
<li>Who generate gross revenue of more than $25m a year, OR</li>
<li>Who make more than half of their annual revenue from selling California residents’ personal data</li>
</ul>

<h4 id="the-california-privacy-rights-act-cpra">The California Privacy Rights Act (CPRA)</h4>

<p>The CPRA, which comes into force in January 2023, <strong>goes beyond the CCPA</strong>. Its key points include:</p>

<ul>
<li>It raises the bar to companies that process the data of 100,000 California residents a year</li>
<li>It gives more <strong>protection to Californians’ sensitive data</strong>, such as their race, religion, sexual orientation, and health data and government ID</li>
<li>It triples the fines for breaches of minors’ data</li>
<li>It gives Californians the right to request their data is corrected</li>
<li>It obliges companies to help with CPRA investigations</li>
<li>And it establishes a California Privacy Protection Agency to enforce the CPRA</li>
</ul>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/544a350a-6ae6-4d0b-8ddb-63f1b3d691e9/cpra-principles-2023.jpg">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="450"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/544a350a-6ae6-4d0b-8ddb-63f1b3d691e9/cpra-principles-2023.jpg 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/544a350a-6ae6-4d0b-8ddb-63f1b3d691e9/cpra-principles-2023.jpg 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/544a350a-6ae6-4d0b-8ddb-63f1b3d691e9/cpra-principles-2023.jpg 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/544a350a-6ae6-4d0b-8ddb-63f1b3d691e9/cpra-principles-2023.jpg 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/544a350a-6ae6-4d0b-8ddb-63f1b3d691e9/cpra-principles-2023.jpg 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/544a350a-6ae6-4d0b-8ddb-63f1b3d691e9/cpra-principles-2023.jpg"
			
			sizes="100vw"
			alt="Graphic summarising the CPRA"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      California is tightening its privacy legislation with the CPRA, coming in 2023. (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/544a350a-6ae6-4d0b-8ddb-63f1b3d691e9/cpra-principles-2023.jpg'>Large preview</a>)
    </figcaption>
  
</figure>

<p>Further pushes towards privacy laws are happening in other states, and together these may reinforce the need for federal privacy measures under the new Biden administration.</p>

<h2 id="big-development-3-cookie-consent">Big Development #3: Cookie Consent</h2>

<p>In May 2020, <a href="https://edpb.europa.eu/sites/edpb/files/files/file1/edpb_guidelines_202005_consent_en.pdf">the EU updated its GDPR guidance</a> to clarify several points, including two key points for cookie consent:</p>

<ul>
<li>Cookie walls do not offer users a genuine choice, because if you reject cookies you’re blocked from accessing content. It confirms that cookie walls should not be used.</li>
<li>Scrolling or swiping through web content <strong>does not equate to implied consent</strong>. The EU reiterates that consent must be explicit.</li>
</ul>

<p>I’ll be going deeper into this in the second article next week.</p>














<figure class="
  
    break-out article__image
  
  
  ">
  
    <a href="https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/181a1f5a-0d6c-4dd9-84c3-62c0a8d1c171/cyber-duck-marketing-analytics-cookies.png">
    
    <img
      loading="lazy"
      decoding="async"
      fetchpriority="low"
			width="800"
			height="383"
			
			srcset="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/181a1f5a-0d6c-4dd9-84c3-62c0a8d1c171/cyber-duck-marketing-analytics-cookies.png 400w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_800/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/181a1f5a-0d6c-4dd9-84c3-62c0a8d1c171/cyber-duck-marketing-analytics-cookies.png 800w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1200/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/181a1f5a-0d6c-4dd9-84c3-62c0a8d1c171/cyber-duck-marketing-analytics-cookies.png 1200w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_1600/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/181a1f5a-0d6c-4dd9-84c3-62c0a8d1c171/cyber-duck-marketing-analytics-cookies.png 1600w,
			        https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_2000/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/181a1f5a-0d6c-4dd9-84c3-62c0a8d1c171/cyber-duck-marketing-analytics-cookies.png 2000w"
			src="https://res.cloudinary.com/indysigner/image/fetch/f_auto,q_80/w_400/https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/181a1f5a-0d6c-4dd9-84c3-62c0a8d1c171/cyber-duck-marketing-analytics-cookies.png"
			
			sizes="100vw"
			alt="Cyber-Duck cookie notice with ad tracking turned on by default"
		/>
    
    </a>
  

  
    <figcaption class="op-vertical-bottom">
      The EU has updated its guidance on cookie consent. (<a href='https://archive.smashing.media/assets/344dbf88-fdf9-42bb-adb4-46f01eedd629/181a1f5a-0d6c-4dd9-84c3-62c0a8d1c171/cyber-duck-marketing-analytics-cookies.png'>Large preview</a>)
    </figcaption>
  
</figure>

<h2 id="big-development-4-google-and-apple-start-to-shift-from-third-party-tracking">Big Development #4: Google And Apple Start To Shift From Third-Party Tracking</h2>

<p>As the big digital players figure out how to meet GDPR — and how to turn privacy legislation to their advantage — some have already come under fire.</p>

<p>Both <a href="https://www.reuters.com/article/us-google-britain-idUSKBN29D18Q">Google</a> and <a href="https://www.reuters.com/article/apple-advertisting-france-idUSL1N2HJ237">Apple</a> are <strong>facing antitrust lawsuits</strong>, following complaints from adtech companies and publishers.</p>

<p>In both cases, the complainants says the big tech companies are exploiting their dominant market position.</p>

<p>Again, more on this next time.</p>

<div class="partners__lead-place"></div>

<h2 id="big-development-5-big-gdpr-fines-coming-this-way">Big Development #5: Big GDPR Fines Coming This Way</h2>

<p>Of course, many organizations jumped to comply with GDPR because they feared the fines that regulators could apply. Those fines have started rolling in:</p>

<p>The French data regulator has slapped Google with a <a href="https://www.complianceweek.com/gdpr/french-court-upholds-googles-57m-gdpr-fine/29096.article">€50m fine</a> for &ldquo;lack of transparency, inadequate information and lack of valid consent regarding ads personalization&rdquo;, saying users were “not sufficiently informed” about how and why Google collected their data.</p>

<p>Its UK equivalent, the ICO, has fined US hotel conglomerate Marriott International Inc. £18.4m for failing to keep 339 million guest records secure. The 2014 cyber-attack on Starwood Hotels and Resorts Worldwide, Inc., which Marriott acquired in 2016, wasn’t discovered until 2018.</p>

<p>The UK’s ICO has also fined British Airways a record <a href="https://www.bbc.co.uk/news/technology-54568784">£20m for a 2018 data breach of 400,000 customers’ personal and credit card data</a>.</p>

<p>Then there’s my personal favorite, a shocking breach of employee trust by H&amp;M that led to a €35m penalty.</p>

<p>So that’s where we stand today.</p>

<h2 id="what-does-this-mean-for-you">What Does This Mean For You?</h2>

<p>As designers and developers, GDPR has — and will continue to have — a big impact in the products we design and build, and the way that we design for data.</p>

<h3 id="here-s-what-we-as-designers-should-know">Here’s What We, As Designers, Should Know</h3>

<ul>
<li>GDPR is critical for you because you’ll <strong>design the points at which users share their data</strong>, what data is collected, and how it’s processed.</li>
<li>Follow <a href="https://www.smashingmagazine.com/2017/07/privacy-by-design-framework/">Privacy by Design best practices</a>. Don’t try to reinvent the wheel — if you’ve created a compliant cookie banner, use your proven design pattern.</li>
<li>Work with your compliance and development teams to ensure designs meet GDPR and can be implemented. Only ask for the data you need.</li>
<li>Finally, ask your users what data they’re comfortable sharing and how they’d like you to use it. If they find it creepy, revisit your approach.</li>
</ul>

<h3 id="here-s-what-we-as-developers-should-know">Here’s What We, As Developers, Should Know</h3>

<ul>
<li>GDPR is critical for you because you <strong>enable data processing</strong>, sharing and integrations.</li>
<li>As a general rule with GDPR, take a <strong>need-to-access approach</strong>. Start by implementing everything with no access, then only give your team access to data as and when it’s necessary (e.g. giving developers access to the Google Analytics console). Audit and document as you go.</li>
<li>Follow <a href="https://www.smashingmagazine.com/2017/07/privacy-by-design-framework/">privacy by design</a> and <a href="https://aws.amazon.com/compliance/security-by-design/">security by design</a> principles. Robust, secure templates for implementing infrastructure are key.</li>
<li>Make sure you’re involved upfront about technical aspects e.g. cookie consent/tracking conversations, so what’s decided can be implemented.</li>
<li><strong>Process mapping</strong> shows where data is being shared with different parts of the business.</li>
<li>Automation offers secure data handling that cuts human error. It also helps prevent the wrong people accessing data.</li>
<li><strong>GDPR checklists</strong> and of course run books will help you manage your process. Again, audit and document as you go.</li>
</ul>

<p>Now let’s see how GDPR is going to evolve in the near future. We’ll focus on three areas.</p>

<h2 id="three-areas-where-gdpr-is-swiftly-evolving">Three Areas Where GDPR Is Swiftly Evolving</h2>

<h3 id="1-how-the-eu-is-implementing-gdpr">1. How The EU Is Implementing GDPR</h3>

<p>First up, let’s see how GDPR will be further embedded in the legislative landscape.</p>

<p>The EU wants to <strong>keep its member states aligned</strong>, because that will make cross-border suits and international collaboration easier. So it has reinforced that countries should neither divert from, nor overstep the GDPR. Some member states, as I said, are paying lip service to the regulation. Others want to exceed GDPR’s standards.</p>

<p>In return for their alignment, the EU <strong>will enforce compliance</strong>, work to enable class action and cheaper cross-border suits, and also promote privacy and consistent standards outside the EU. In addition to extra support and tools for SMEs, we may also see certification for security and data protection by design.</p>

<p>Finally, this could raise some eyebrows in Silicon Valley: the EU has hinted that it might consider <strong>bans on data processing to encourage compliance</strong>. €50m fines aren’t the end of the world for Google and friends. But time out on the naughty step — and the resulting bad PR — is a very different thing.</p>

<h3 id="2-how-gdpr-works-with-innovation">2. How GDPR Works With Innovation</h3>

<p>GDPR was designed to be technology-neutral and to support, not hinder, innovation. That’s certainly been tested over the past 12 months, and the EU points to the <strong>rapid rollout of COVID-19 apps</strong> as proof that its legislation works.</p>

<p>We can expect to see <strong>codes of conduct for sensitive categories of data</strong> (health and scientific research). These will be welcomed.</p>

<p>However, they’re watching innovators closely. The EU has expressed concern about data privacy in video, IoT devices and blockchain. They are particularly concerned about facial (and presumably voice) recognition and developments in AI.</p>

<p>Most notably, the Commission is deeply concerned about what it calls “multinational technology companies”, “large digital platforms” and “online advertising and micro-targeting”. Yes, once again it’s looking at you, Facebook, Amazon, Google and friends.</p>

<h3 id="3-how-the-eu-is-promoting-gdpr-standards-beyond-the-eu">3. How The EU Is Promoting GDPR Standards Beyond The EU</h3>

<p>Our digital economy is global, so GDPR’s impact ripples beyond the EU’s borders — and not just in terms of compliance. The EU is setting the bar for data protection legislation worldwide. Beyond California’s CCPA, see Brazil’s LGPD, plus developments in Canada, Australia, India and a clutch of American states.</p>

<p>Of course, it’s in the EU’s interests if other countries and trading blocs match their standards. So it’s <strong>promoting GDPR via several avenues</strong>:</p>

<ul>
<li>Through “mutual adequacy decisions” with Japan and shortly South Korea</li>
<li>Embedded into bilateral trade agreements e.g. with New Zealand, Australia, UK</li>
<li>Through fora like the OECD, ASEAN, the G7 and the G20</li>
<li>Through its Data Protection Academy for EU and international regulators</li>
</ul>

<p>It is particularly keen to empower innovation through <strong>trusted data flows</strong> and to enable international cooperation between law enforcement authorities and private operators.</p>

<blockquote class="pull-quote">
  <p>
    <a class="pull-quote__link" aria-label="Share on Twitter" href="https://twitter.com/share?text=%0aThe%20EU%20is%20leading%20the%20world%20in%20data%20protection.%20Where%20it%20goes,%20others%20will%20follow.%20So%20even%20if%20you%e2%80%99re%20not%20designing/developing%20for%20an%20EU%20audience,%20you%20need%20to%20be%20aware%20of%20what%e2%80%99s%20happening.%0a&url=https://smashingmagazine.com%2f2021%2f02%2fstate-gdpr-2021-key-updates%2f">
      
The EU is leading the world in data protection. Where it goes, others will follow. So even if you’re not designing/developing for an EU audience, you need to be aware of what’s happening.

    </a>
  </p>
  <div class="pull-quote__quotation">
    <div class="pull-quote__bg">
      <span class="pull-quote__symbol">“</span></div>
  </div>
</blockquote>

<h2 id="what-does-all-of-this-mean-for-companies-in-the-eu">What Does All Of This Mean For Companies In The EU?</h2>

<p>Companies who operate in the EU <strong>need to comply with GDPR</strong> or risk being fined. Those fines can be pretty hefty, as we’ve seen. So you need to be able to demonstrate that you’re adhering to GDPR’s 7 principles and to specific guidance from your national Data Protection Authority.</p>

<p>However, that’s not as straightforward as it sounds, and you may choose to evaluate your risk in some cases. I’ll take you through an example of that next time.</p>

<h2 id="what-does-this-mean-for-companies-based-outside-the-eu">What Does This Mean For Companies Based Outside The EU?</h2>

<p>The implications for companies based outside the EU are <strong>exactly the same as those for EU countries</strong>, if they process personal data from the EU. That’s because GDPR applies to the personal data of people based in the EU. If you want to process it, e.g. to sell to customers in the EU, you have to abide by the rules. Otherwise, you risk being fined, like Facebook and Google.</p>

<p><strong>Here’s how that’s enforced</strong>: If you have a presence in the EU, as many multinationals do, and you don’t pay a GDPR fine, your EU assets may be seized. If you don’t have a presence, you’re obliged under GDPR to appoint a representative in the EU. Any fines will be levied through that representative. Alternatively, you may face a <strong>complex and expensive international lawsuit</strong>.</p>

<p>And here’s where it gets complex for everyone:</p>

<p>If your customer base includes people in the EU and citizens of other places with privacy laws, such as the State of California, you have to comply <strong>both</strong> with the California Consumer Privacy Act (CCPA) and with GDPR. These batches of legislation generally align — but they don’t match.</p>

<p>Take cookies, for example. Under
GDPR, you <strong>must get active consent</strong> from a user before you place a cookie on their device, bar those strictly needed for your site to function.</p>

<p>However, under the CCPA, you must disclose what data you’re collecting, and enable your customer to deny you permission to sell their data. But they don’t have to actively agree you can collect it.</p>

<p>That’s why the EU is pushing for international standards to simplify global compliance.</p>

<p><strong>N.B.</strong> <em>If you’re in the United States and eagerly awaiting the replacement to Privacy Shield, you might like to take a leaf from Microsoft’s book instead — they and others have stated they’ll comply with GDPR rather than depend on any bilateral mechanisms to enable data processing.</em></p>

<h2 id="what-lessons-can-web-designers-and-developers-learn-from-gdpr">What Lessons Can Web Designers And Developers Learn From GDPR?</h2>

<p>Privacy regulation is here to stay and it affects all our priorities and workflows. Here are six lessons to remember as you work with customer data:</p>

<ol>
<li><strong>We had to sprint to comply with GDPR. Now it’s a marathon.</strong><br />
We know that GDPR will continue to evolve alongside the technology it aims to regulate. That means the demands on us won’t remain the same. Not only that, but GDPR has inspired similar — but not identical — legislation around the world. These legal requirements are set to keep evolving.</li>
<li><strong>Compliance builds competitive advantage.</strong><br />
While the first major GDPR fines have been eye-watering, it’s actually the negative publicity that many say is most damaging. Who benefits from a large data leak? The company’s competitors. On the other hand, if you embed GDPR compliance as you strengthen your design and development processes, you’ll be better able to adapt as the regulations evolve.</li>
<li><strong>GDPR compliance and better COVID-19 outcomes are linked by user-centred design.</strong><br />
We know that companies who’d begun their digital transformation were better able to adapt to the COVID-19 crisis. User-centred design supports GDPR, too. It has the process and customer focus you need to build products that align with the idea that customer data is precious and must be protected. That will make it easier to evolve your products in line with future legislation.</li>
<li><strong>You can build compliance into your digital products.</strong><br />
Privacy by design is here to stay. If you already use service design, you can include customer information as a data layer in your service blueprints. If you don’t, now’s a great time to start. Mapping where data is collected, processed and stored highlights weak points where potential breaches may occur. Automated compliance tools will help lessen the burden on companies, plus has the potential to make data processing more secure.</li>
<li><strong>GDPR supports innovation — if you do it right.</strong><br />
Some warn that GDPR is suffocating innovation by restricting data flows and especially by deterring companies from innovating with data. Others point to opportunities to innovate with blockchain, IoT and AI in a way that’s secure and where data is protected. The truth? Yes, of course, you can innovate and be GDPR compliant. But ethics in AI is vital: you must respect your customers and their data.</li>
<li><strong>Keep an eye on your third-party partners.</strong><br />
This goes back to the joint controllers decision above. Companies now share responsibility for customer data with any third parties who process it and that processing must be documented. You can expect third-party checks, monitoring and contractual obligations to be a priority for companies from now on.</li>
</ol>

<h2 id="here-s-how-gdpr-could-develop">Here’s How GDPR Could Develop</h2>

<p>Phew. That’s a lot to take in. But looking ahead, here’s where I’m betting we’ll see change.</p>

<ol>
<li>GDPR will <strong>continue to evolve</strong>, with clarity coming from test cases and potentially further legislation including the ePrivacy Regulation.</li>
<li>The EU will continue to promote international adoption of data privacy law. We’ll see more countries embrace data protection, often baked into trade and security agreements.</li>
<li>If we’re lucky, we may start to see <strong>international convergence of data privacy legislation</strong> — especially if the US implements data privacy at the federal level.</li>
<li>But we’ll also see more clashes between the EU and the US, because of their opposite approaches to privacy.</li>
<li>As ‘data is the new oil’, we could see more situations where users receive free products and services by giving away data through cookies.</li>
<li>Businesses will <strong>shift away from third-party cookies</strong> and towards server-side tracking and automation, in order to stay compliant.</li>
<li>Businesses will adopt <em>Privacy by Design</em> (PdB) and service design tools and process, to help them stay compliant to multiple sets of privacy laws.</li>
<li>And finally — and this one’s a definite — we’ll see <strong>more and bigger privacy lawsuits</strong>. Who’ll emerge as the winners — big tech or privacy advocates? That I don’t know, but we can be certain of one thing: privacy lawyers will make a lot of money.</li>
</ol>

<h2 id="a-final-word-on-trust">A Final Word On Trust</h2>

<p>The theme underpinning both the European Commission’s communications and the commentary from industry experts is <strong>trust</strong>. Digital agencies like ours now need to provide evidence of data security and <a href="https://www.cyber-duck.co.uk/what-we-do/digital-optimisation/gdpr-compliance">GDPR compliance</a> — even down to staff training policies for data protection. That’s new. The EU’s priority is to support safe, secure data flows and innovation, both within the EU and outside. Standards compliance is their solution for this. And we, as designers and developers, have a crucial role to play.</p>

<ul>
<li><strong>Part 1: GDPR, Key Updates And What They Mean</strong></li>
<li><a href="https://www.smashingmagazine.com/2021/03/state-gdpr-2021-cookie-consent-designers-developers/">Part 2: Cookie Consent For Designers And Developers</a></li>
</ul>

<h3 id="other-resources">Other Resources</h3>

<ul>
<li><a href="https://commission.europa.eu/law/law-topic/data-protection_en">Data Protection</a>, the EU’s site</li>
<li>UK ICO’s <a href="https://ico.org.uk/for-organisations/guide-to-pecr/guidance-on-the-use-of-cookies-and-similar-technologies/how-do-we-comply-with-the-cookie-rules/#comply15">Guidance On Cookies</a></li>
<li><a href="https://www.enforcementtracker.com/">GDPR Enforcement Tracker</a>, logs fines applied under GDPR</li>
<li><a href="https://www.cyber-duck.co.uk/insights/resources/gdpr-checklist">GDPR Checklist</a>, by Cyber-Duck (a great place to start)</li>
<li>Overview of <a href="https://iclg.com/practice-areas/data-protection-laws-and-regulations/usa">Data Protection Law in the United States</a>, by ICLG</li>
<li><a href="https://fpf.org/wp-content/uploads/2018/11/GDPR_CCPA_Comparison-Guide.pdf">GDPR &amp; CCPA Comparison Guide</a>, by DataGuidance and the Future of Privacy Forum</li>
<li><a href="https://iapp.org/news/a/cpra-analysis-the-good-and-bad-news-for-ccpa-regulated-businesses/">CCPA vs CPRA</a>, from IAPP</li>
<li><a href="https://aws.amazon.com/compliance/security-by-design/">Security By Design</a> (Amazon)</li>
<li><a href="https://www.smashingmagazine.com/2017/07/privacy-by-design-framework/">How To Protect Your Users With The Privacy By Design Framework</a>, Heather Burns, Smashing Magazine</li>
</ul>

<div class="partners__lead-place"></div>

<h3 id="further-reading">Further Reading</h3>

<ul>
<li><a href="https://www.smashingmagazine.com/2018/02/gdpr-for-web-developers/">How GDPR Will Change The Way You Develop</a></li>
<li><a href="https://www.smashingmagazine.com/2021/10/autofill-dark-pattern/">The Autofill Dark Pattern</a></li>
<li><a href="https://www.smashingmagazine.com/2023/03/access-handling-data-management-row-level-security/">Fine-Grained Access Handling And Data Management With Row-Level Security</a></li>
<li><a href="https://www.smashingmagazine.com/2023/04/potentially-dangerous-non-accessibility-cookie-notices/">The Potentially Dangerous Non-Accessibility Of Cookie Notices</a></li>
</ul>

<div class="signature">
  <img src="https://www.smashingmagazine.com/images/logo/logo--red.png" alt="Smashing Editorial" width="35" height="46" loading="lazy" decoding="async" />
  <span>(vf, il, mrn)</span>
</div>


              </article>
            </body>
          </html>
        ]]></content:encoded></item></channel></rss>