<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Autional</title>
    <description>The latest articles on DEV Community by Autional (@autional).</description>
    <link>https://dev.to/autional</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4176210%2Fc1d238eb-cd81-4914-aaf0-d3a5fc564088.png</url>
      <title>DEV Community: Autional</title>
      <link>https://dev.to/autional</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/autional"/>
    <language>en</language>
    <item>
      <title>0.1 + 0.2 Is Not 0.3. Here Is Why Money Needs Its Own Way to Be Stored</title>
      <dc:creator>Autional</dc:creator>
      <pubDate>Mon, 19 Oct 2026 01:59:53 +0000</pubDate>
      <link>https://dev.to/autional/01-02-is-not-03-here-is-why-money-needs-its-own-way-to-be-stored-4j36</link>
      <guid>https://dev.to/autional/01-02-is-not-03-here-is-why-money-needs-its-own-way-to-be-stored-4j36</guid>
      <description>&lt;p&gt;A small shop owner runs a discount split on one order.&lt;/p&gt;

&lt;p&gt;She calculates it with the till software. Then she does it again on paper. The two numbers differ by one cent.&lt;/p&gt;

&lt;p&gt;She rubs her eyes and tries again. Still one cent off.&lt;/p&gt;

&lt;p&gt;The customer says nothing. But the look says: "Are you overcharging me?"&lt;/p&gt;

&lt;p&gt;She can cover the cent herself. But if the books do not add up, why should anyone trust her?&lt;/p&gt;

&lt;p&gt;She wants to understand one small thing: where did that cent come from?&lt;/p&gt;

&lt;h3&gt;
  
  
  It is not a calculation error. And it is not a display quirk.
&lt;/h3&gt;

&lt;p&gt;Many programs compute 0.1 + 0.2 and get this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;0.30000000000000004&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The first reaction is usually: "That is just a display bug, right?"&lt;/p&gt;

&lt;p&gt;No. &lt;strong&gt;The difference is real.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Computers store decimals in an approximate way. That way is called floating point.&lt;/p&gt;

&lt;p&gt;Here is an analogy. Write one third as a decimal: 0.3333... It never ends.&lt;/p&gt;

&lt;p&gt;In binary, 0.1 is the same kind of number. It never ends either.&lt;/p&gt;

&lt;p&gt;If it never ends, it cannot fit. If it cannot fit, the computer stores an approximation.&lt;/p&gt;

&lt;p&gt;The 0.1 you stored is already a tiny bit short. Add two of those, and you get that tiny difference.&lt;/p&gt;

&lt;h3&gt;
  
  
  Three ways to store a number
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Storage&lt;/th&gt;
&lt;th&gt;Exact 0.1?&lt;/th&gt;
&lt;th&gt;Rounding under control?&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;th&gt;Good for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Floating point (float/double)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Small&lt;/td&gt;
&lt;td&gt;Graphics, science&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Integer minor units (cents)&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Fixed 2 digits&lt;/td&gt;
&lt;td&gt;Must fix one unit&lt;/td&gt;
&lt;td&gt;Single currency, payments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fixed-point decimal (DECIMAL)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes, explicitly&lt;/td&gt;
&lt;td&gt;A bit slower, a bit bigger&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Default for ledgers&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In one line: &lt;strong&gt;where "close enough" is fine, floating point is fine. Where "not one cent off" matters, it is not.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  A short history
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;When&lt;/th&gt;
&lt;th&gt;What happened&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1985&lt;/td&gt;
&lt;td&gt;IEEE 754 is published: floating point gets an international standard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1982–1983&lt;/td&gt;
&lt;td&gt;A Vancouver stock exchange index keeps three decimals and &lt;strong&gt;truncates&lt;/strong&gt; the rest&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;22 months later&lt;/td&gt;
&lt;td&gt;The index "falls" from 1000 to 524.811; newspapers say the market is finished&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nov 1983&lt;/td&gt;
&lt;td&gt;A weekend fix; the index jumps back to 1098.892&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;After that&lt;/td&gt;
&lt;td&gt;Financial systems move to &lt;strong&gt;fixed-point decimal&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The counter-intuitive part: &lt;strong&gt;the index did not halve because of floating point. It halved because the rounding rule was wrong.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  There is one test: money is not a number. It is a ledger.
&lt;/h3&gt;

&lt;p&gt;The same error, in different places, has very different consequences.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In a draft or an image&lt;br&gt;
   off by 0.00000000000004  -&amp;gt;  nobody notices&lt;/p&gt;

&lt;p&gt;In a money ledger&lt;br&gt;
   off by 0.01  -&amp;gt;  the books do not balance; someone spends a day hunting it&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A draft can be "close enough." Money cannot.&lt;/p&gt;

&lt;p&gt;Money has to reconcile: your entry and mine must match to the cent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So money is not an ordinary number. Money is a ledger.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What actually breaks is often not "cannot store it"
&lt;/h3&gt;

&lt;p&gt;That exchange index was not a floating point problem.&lt;/p&gt;

&lt;p&gt;Its rule was: after each calculation, keep three decimals and &lt;strong&gt;truncate&lt;/strong&gt; the rest — not round, truncate.&lt;/p&gt;

&lt;p&gt;It ran two to three thousand times a day. Each time it cut a little off.&lt;/p&gt;

&lt;p&gt;The error only ever went one way. After 22 months, the index had "halved."&lt;/p&gt;

&lt;p&gt;That is what a &lt;strong&gt;rounding rule&lt;/strong&gt; is: how many decimals to keep, and how to treat the remainder. You have to write it down first.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rule&lt;/th&gt;
&lt;th&gt;How&lt;/th&gt;
&lt;th&gt;Bias&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Truncate&lt;/td&gt;
&lt;td&gt;Drop extra digits&lt;/td&gt;
&lt;td&gt;Always downward; accumulates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Round half up&lt;/td&gt;
&lt;td&gt;5 and above rounds up&lt;/td&gt;
&lt;td&gt;Nearly unbiased, but .5 always up&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Banker's rounding&lt;/td&gt;
&lt;td&gt;.5 goes to even&lt;/td&gt;
&lt;td&gt;Close to unbiased; common in finance&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  So how should money be stored?
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Case&lt;/th&gt;
&lt;th&gt;Practice&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Amount fields&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Fixed-point decimal&lt;/strong&gt;, digit by digit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Precision&lt;/td&gt;
&lt;td&gt;Do not stop at two decimals; multi-currency and tax need more&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FX rate&lt;/td&gt;
&lt;td&gt;Not a fixed number; a &lt;strong&gt;quote with an ID and an expiry&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ledger&lt;/td&gt;
&lt;td&gt;Append-only; verify entry by entry&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rounding&lt;/td&gt;
&lt;td&gt;Hard-code the rule; never rely on defaults&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A common setup: amounts as &lt;code&gt;DECIMAL(20,4)&lt;/code&gt;, tax rates at higher precision, currencies as ISO 4217 three-letter codes.&lt;/p&gt;

&lt;p&gt;When you send or display an amount, send it as a &lt;strong&gt;string&lt;/strong&gt;, not a number. Every extra hop can make it "close enough" again.&lt;/p&gt;

&lt;h3&gt;
  
  
  Four common mistakes
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mistake&lt;/th&gt;
&lt;th&gt;Fact&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;"0.1+0.2 is just a display issue."&lt;/td&gt;
&lt;td&gt;No. There is no exact 0.1 in binary.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Two decimals are always enough."&lt;/td&gt;
&lt;td&gt;Not with multiple currencies and tax.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Precision incidents are calculation errors."&lt;/td&gt;
&lt;td&gt;Often the rounding rule was wrong.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"An FX rate is just a number."&lt;/td&gt;
&lt;td&gt;It is a quote that expires.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Takeaway
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Numbers can be "close enough." Money cannot: one cent off means the books are wrong.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Next time a bill is off by a cent, ask one more question: did it calculate wrong — or was money never treated as a ledger?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We hit this ourselves while building &lt;strong&gt;Autional&lt;/strong&gt;, an identity and access management platform: we migrated amount fields from floating point to fixed-point decimal, and from two decimals to four — seven models in total. Slower and a bit bigger, in exchange for books that balance to the cent. &lt;a href="https://www.autional.com" rel="noopener noreferrer"&gt;https://www.autional.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Sources
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;IEEE 754-2019, IEEE Standard for Floating-Point Arithmetic.&lt;/li&gt;
&lt;li&gt;ISO 4217, Codes for the representation of currencies.&lt;/li&gt;
&lt;li&gt;Wall Street Journal (1983-11-08), Toronto Star (1983-11-29) — coverage of the Vancouver Stock Exchange index truncation.&lt;/li&gt;
&lt;li&gt;McCullough &amp;amp; Vinod, Journal of Economic Literature (1999), retrospective on the same event.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
      <category>programming</category>
      <category>database</category>
      <category>webdev</category>
    </item>
    <item>
      <title>The Page Looked Exactly Like the Real One. So Why Was the Account Still Stolen?</title>
      <dc:creator>Autional</dc:creator>
      <pubDate>Sun, 18 Oct 2026 10:22:17 +0000</pubDate>
      <link>https://dev.to/autional/the-page-looked-exactly-like-the-real-one-so-why-was-the-account-still-stolen-3562</link>
      <guid>https://dev.to/autional/the-page-looked-exactly-like-the-real-one-so-why-was-the-account-still-stolen-3562</guid>
      <description>&lt;p&gt;You get a message: "Unusual activity. Please sign in again."&lt;/p&gt;

&lt;p&gt;You click. The icon, the colors, the font — exactly like the real site.&lt;/p&gt;

&lt;p&gt;You type your password. You even check: two-factor is on. You feel safe.&lt;/p&gt;

&lt;p&gt;The next day, the account is gone. Someone is using your name to ask your friends for money.&lt;/p&gt;

&lt;p&gt;What went wrong?&lt;/p&gt;

&lt;p&gt;Not a weak password. Not a useless one-time code. &lt;strong&gt;The page was fake.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Phishing is not "guessing your password." It is a fake page plus a live relay.
&lt;/h3&gt;

&lt;p&gt;The attacker puts a fake page in front of the real site.&lt;/p&gt;

&lt;p&gt;You think you are talking to the site. In fact, someone sits in the middle.&lt;/p&gt;

&lt;p&gt;Whatever you hand over, they pass it on — to the real site.&lt;/p&gt;

&lt;p&gt;So the real question is not "how strong is my password?" It is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can the thing you use be handed over?&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Five login methods, side by side
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;What proves it&lt;/th&gt;
&lt;th&gt;Can it be handed over?&lt;/th&gt;
&lt;th&gt;Phishing-resistant&lt;/th&gt;
&lt;th&gt;Main weakness&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Password&lt;/td&gt;
&lt;td&gt;something you remember&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Yes&lt;/strong&gt; — typed straight into the fake page&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;reuse, leaks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SMS code&lt;/td&gt;
&lt;td&gt;a code sent to your phone&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Yes&lt;/strong&gt; — the attacker asks you for it&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;SIM swap, live relay&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Magic link&lt;/td&gt;
&lt;td&gt;a link in your email&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Yes&lt;/strong&gt; — whoever finds it, gets in&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;link theft&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;QR login&lt;/td&gt;
&lt;td&gt;your logged-in phone confirms a number&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Yes&lt;/strong&gt; — the number can be swapped&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;td&gt;wrong code, swapped code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Passkey&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;a key inside your device&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;No&lt;/strong&gt; — the key never leaves the device, and it only trusts the site it registered with&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;lost device, cross-device sync&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In one line: &lt;strong&gt;if it can be spoken, typed, or clicked open, it can be handed over.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  A short history
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;When&lt;/th&gt;
&lt;th&gt;What happened&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1990s&lt;/td&gt;
&lt;td&gt;"Phishing" appears: fake email + fake page to steal passwords&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2019&lt;/td&gt;
&lt;td&gt;W3C publishes the WebAuthn standard (the basis of phishing resistance)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2022&lt;/td&gt;
&lt;td&gt;Apple, Google, and Microsoft push &lt;strong&gt;Passkeys&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2022&lt;/td&gt;
&lt;td&gt;Microsoft reports a wave of "adversary-in-the-middle" phishing that steals the login session too&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The direction is clear: &lt;strong&gt;take the key out of the network, and lock it in the device.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  There is only one test
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;A fake page sits between you and the real site&lt;br&gt;
   You (something hand-over-able) -&amp;gt; fake page -&amp;gt; real site   &amp;lt;- the hand copies it&lt;br&gt;
   You (Passkey) -&amp;gt; x  the fake page is not trusted -&amp;gt; cannot be handed over&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Why does a Passkey resist phishing? Two reasons:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;The key lives inside your device. It never leaves.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It only trusts the exact site it registered with.&lt;/strong&gt; Wrong address, no deal.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A fake page is simply not trusted. Even if you wanted to hand it over, you cannot.&lt;/p&gt;

&lt;h3&gt;
  
  
  What the standards say
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;NIST SP 800-63B-4&lt;/strong&gt; (2025): passwords, look-up secrets, and out-of-band (SMS/QR) are &lt;strong&gt;not&lt;/strong&gt; phishing-resistant. Higher assurance levels require phishing resistance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Microsoft (2022)&lt;/strong&gt;: an AiTM wave stole &lt;strong&gt;password + login session&lt;/strong&gt; together, and &lt;strong&gt;walked past MFA&lt;/strong&gt;; by its own report, it targeted &lt;strong&gt;10,000+ organizations&lt;/strong&gt; in under a year.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Together: &lt;strong&gt;not every "extra step" is equally strong.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  So what should you pick?
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Who you are&lt;/th&gt;
&lt;th&gt;What to do&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Regular user&lt;/td&gt;
&lt;td&gt;Turn on Passkeys first; if you cannot, &lt;strong&gt;at least stop reusing one password everywhere&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Everyday work&lt;/td&gt;
&lt;td&gt;Prefer Passkeys (phishing-resistant); keep one usable fallback&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sensitive roles / admins&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Require&lt;/strong&gt; phishing resistance: Passkey or a hardware key&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Four common mistakes
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mistake&lt;/th&gt;
&lt;th&gt;Fact&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;"With a code, I am safe from phishing."&lt;/td&gt;
&lt;td&gt;Not always. &lt;strong&gt;The code can be relayed live.&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"If the page looks right, it is right."&lt;/td&gt;
&lt;td&gt;A fake page can copy the design 1:1. Check the &lt;strong&gt;address&lt;/strong&gt;, not the look.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"One-click login is both easier and safer."&lt;/td&gt;
&lt;td&gt;The easier it is to hand over, the easier it is to steal.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Passkeys are foolproof."&lt;/td&gt;
&lt;td&gt;They fear lost devices, missing cross-device sync, and old sites that do not support them.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Takeaway
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Phishing resistance comes down to one thing: can the thing you use be handed over? If it can, a fake page is dangerous.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;(If the account was already stolen: revoke all sessions, sign in again, then switch to something that cannot be handed over.)&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;These practices come from building &lt;strong&gt;Autional&lt;/strong&gt;, an identity and access management platform — &lt;a href="https://www.autional.com" rel="noopener noreferrer"&gt;https://www.autional.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Sources
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;NIST, SP 800-63B-4, Digital Identity Guidelines (2025) — phishing resistance.&lt;/li&gt;
&lt;li&gt;W3C, WebAuthn Level 2 (2021); FIDO Alliance, FIDO2 / CTAP2.&lt;/li&gt;
&lt;li&gt;Microsoft Security Blog (2022-07-12), adversary-in-the-middle (AiTM) phishing: password and session theft, MFA bypass.&lt;/li&gt;
&lt;li&gt;Zscaler ThreatLabz (2022-08-02), independent observation of the same AiTM proxy phishing.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>security</category>
      <category>webdev</category>
      <category>phishing</category>
      <category>passkey</category>
    </item>
    <item>
      <title>"Sign in with Google": Why It Bounces You Out and Back</title>
      <dc:creator>Autional</dc:creator>
      <pubDate>Sun, 11 Oct 2026 05:47:18 +0000</pubDate>
      <link>https://dev.to/autional/sign-in-with-google-why-it-bounces-you-out-and-back-3la9</link>
      <guid>https://dev.to/autional/sign-in-with-google-why-it-bounces-you-out-and-back-3la9</guid>
      <description>&lt;p&gt;You click "Sign in with Google." The page jumps away, jumps back a second later, and you are in. So why the round trip — why not just type something on this page?&lt;/p&gt;

&lt;p&gt;Because the safe way is to &lt;strong&gt;never hand over your password&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The old way: hand over your password
&lt;/h2&gt;

&lt;p&gt;Twenty years ago, if a site wanted to read your data somewhere else, you gave it your password. Convenient — and costly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It &lt;strong&gt;stored&lt;/strong&gt; your password, sometimes in plaintext.&lt;/li&gt;
&lt;li&gt;It got the &lt;strong&gt;full set&lt;/strong&gt;, so it could do things you never agreed to.&lt;/li&gt;
&lt;li&gt;To undo it, you could only &lt;strong&gt;change your password&lt;/strong&gt; — which logged you out everywhere else too.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The new way: bounce out, approve, bounce back
&lt;/h2&gt;

&lt;p&gt;The password stays put. You click "Sign in with Google": you bounce to Google, sign in, and &lt;strong&gt;approve&lt;/strong&gt;; you come back with a &lt;strong&gt;single-use ticket&lt;/strong&gt; — the authorization code; the site trades that ticket for an &lt;strong&gt;access token&lt;/strong&gt; — a pass that says on whose behalf, until when, and what it can do. The site never touches your password.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you get back: a pass with a scope
&lt;/h2&gt;

&lt;p&gt;The pass carries three things: on whose behalf, until when, and what it can do. Whatever you did not tick &lt;strong&gt;is not on the pass&lt;/strong&gt;, and the door stays shut (scope, RFC 6749 3.3). The pass &lt;strong&gt;expires&lt;/strong&gt;, and you can revoke it anytime under "authorized apps."&lt;/p&gt;

&lt;h2&gt;
  
  
  How it got here: 1.0 to 2.0 to patches
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stage&lt;/th&gt;
&lt;th&gt;When&lt;/th&gt;
&lt;th&gt;What changed&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;OAuth 1.0&lt;/td&gt;
&lt;td&gt;2007 (RFC 5849)&lt;/td&gt;
&lt;td&gt;First version; convoluted, everyone rolled their own&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OAuth 2.0&lt;/td&gt;
&lt;td&gt;2012 (RFC 6749)&lt;/td&gt;
&lt;td&gt;Rewritten into one common version; codes become single-use&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PKCE&lt;/td&gt;
&lt;td&gt;2015 (RFC 7636)&lt;/td&gt;
&lt;td&gt;A proof key makes a stolen code useless&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security BCP&lt;/td&gt;
&lt;td&gt;2025 (RFC 9700)&lt;/td&gt;
&lt;td&gt;Implicit flow deprecated; PKCE mandatory&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The real opening: the consent step
&lt;/h2&gt;

&lt;p&gt;The danger is not the password — it is you, at the consent prompt. In 2022, attackers built malicious OAuth apps (one even passed a Verified Publisher review) that tricked people into clicking &lt;strong&gt;approve&lt;/strong&gt; — then quietly read their email and calendar (Microsoft / Proofpoint). That "bounce out" is your one clear look: see who is asking before you approve.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three things people get wrong
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;"Sign in with X" is not the same as the site being secure. Your password only went to the provider.&lt;/li&gt;
&lt;li&gt;It is not a login protocol. OAuth is authorization; proving who you are is OIDC.&lt;/li&gt;
&lt;li&gt;Approving is not forever. You can revoke access under "authorized apps."&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Takeaway
&lt;/h2&gt;

&lt;p&gt;With third-party sign-in, the site never gets your password. It gets a scoped, expiring, revocable pass.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;These practices come from building &lt;strong&gt;Autional&lt;/strong&gt;, an open-core identity and access management platform — &lt;a href="https://www.autional.com" rel="noopener noreferrer"&gt;https://www.autional.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Reference: RFC 6749, RFC 7636, RFC 9700, RFC 5849, OpenID Connect Core 1.0; case: Microsoft consent phishing (2022).&lt;/p&gt;

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