<?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: Mykyta Korniienko</title>
    <description>The latest articles on DEV Community by Mykyta Korniienko (@mykytaio).</description>
    <link>https://dev.to/mykytaio</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3715929%2Fd1134c9b-190a-4482-83f2-67680514bae6.png</url>
      <title>DEV Community: Mykyta Korniienko</title>
      <link>https://dev.to/mykytaio</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mykytaio"/>
    <language>en</language>
    <item>
      <title>How we built Afina and why WebRTC + QUIC actually matter</title>
      <dc:creator>Mykyta Korniienko</dc:creator>
      <pubDate>Sat, 17 Jan 2026 04:58:19 +0000</pubDate>
      <link>https://dev.to/mykytaio/how-we-built-afina-and-why-webrtc-quic-actually-matter-31gh</link>
      <guid>https://dev.to/mykytaio/how-we-built-afina-and-why-webrtc-quic-actually-matter-31gh</guid>
      <description>&lt;p&gt;When we started building Afina, we didn’t plan to create “another antidetect browser”.&lt;/p&gt;

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

&lt;p&gt;Honestly, the original idea was simpler:&lt;br&gt;
why do modern antifraud systems detect browsers so easily, even when everything looks fine?&lt;/p&gt;

&lt;p&gt;User agent matches.&lt;br&gt;
Canvas spoofed.&lt;br&gt;
WebGL looks normal.&lt;/p&gt;

&lt;p&gt;And still… blocked.&lt;/p&gt;

&lt;p&gt;So we stopped looking at fingerprints first and started looking at network behavior.&lt;/p&gt;

&lt;p&gt;The uncomfortable truth about WebRTC&lt;/p&gt;

&lt;p&gt;A lot of tools treat WebRTC as a checkbox.&lt;/p&gt;

&lt;p&gt;“Disable WebRTC”&lt;br&gt;
“Mask WebRTC IP”&lt;br&gt;
“Use proxy for WebRTC”&lt;/p&gt;

&lt;p&gt;But WebRTC is not just about IP leaks.&lt;/p&gt;

&lt;p&gt;It’s a real-time networking stack with strict rules:&lt;/p&gt;

&lt;p&gt;ICE candidates&lt;/p&gt;

&lt;p&gt;STUN behavior&lt;/p&gt;

&lt;p&gt;host → srflx chain&lt;/p&gt;

&lt;p&gt;timing patterns&lt;/p&gt;

&lt;p&gt;In a real browser, WebRTC always starts from a local interface, even if you’re behind a proxy.&lt;/p&gt;

&lt;p&gt;Many solutions break this flow by routing WebRTC through servers or skipping steps.&lt;br&gt;
Functionally it works.&lt;br&gt;
From antifraud perspective it looks fake instantly.&lt;/p&gt;

&lt;p&gt;So in Afina we made a hard decision:&lt;br&gt;
no server-side WebRTC hacks at all.&lt;/p&gt;

&lt;p&gt;Everything runs inside the browser process, using the real Chromium stack.&lt;/p&gt;

&lt;p&gt;That alone broke compatibility with a lot of existing proxy approaches.&lt;/p&gt;

&lt;p&gt;Why QUIC and UDP were non-negotiable&lt;/p&gt;

&lt;p&gt;Another thing we noticed while testing antifraud systems:&lt;br&gt;
TCP-only browsers stand out more than people think.&lt;/p&gt;

&lt;p&gt;Modern Chrome:&lt;/p&gt;

&lt;p&gt;prefers QUIC (HTTP/3)&lt;/p&gt;

&lt;p&gt;uses UDP heavily&lt;/p&gt;

&lt;p&gt;negotiates TLS differently over QUIC vs TCP&lt;/p&gt;

&lt;p&gt;Many “secure” browsers still tunnel everything over TCP SOCKS proxies.&lt;br&gt;
That’s convenient.&lt;br&gt;
And very detectable.&lt;/p&gt;

&lt;p&gt;So we went the harder route:&lt;/p&gt;

&lt;p&gt;native UDP support&lt;/p&gt;

&lt;p&gt;real QUIC handshake&lt;/p&gt;

&lt;p&gt;no protocol downgrading&lt;/p&gt;

&lt;p&gt;This meant rewriting parts of the networking layer and rejecting a lot of proxy providers that simply don’t support UDP correctly.&lt;/p&gt;

&lt;p&gt;Painful, but necessary.&lt;/p&gt;

&lt;p&gt;Fingerprints are useless without behavior&lt;/p&gt;

&lt;p&gt;One thing we learned pretty fast:&lt;/p&gt;

&lt;p&gt;Perfect fingerprints don’t save you if behavior is wrong.&lt;/p&gt;

&lt;p&gt;Antifraud systems don’t just check:&lt;/p&gt;

&lt;p&gt;what your browser reports&lt;/p&gt;

&lt;p&gt;but how it behaves&lt;/p&gt;

&lt;p&gt;Timing, packet order, protocol choice, fallback logic.&lt;/p&gt;

&lt;p&gt;That’s why Afina focuses less on “spoof everything” and more on:&lt;/p&gt;

&lt;p&gt;consistency&lt;/p&gt;

&lt;p&gt;real Chromium behavior&lt;/p&gt;

&lt;p&gt;no shortcuts&lt;/p&gt;

&lt;p&gt;Sometimes that means fewer options for the user.&lt;br&gt;
But it also means fewer red flags.&lt;/p&gt;

&lt;p&gt;What surprised us the most&lt;/p&gt;

&lt;p&gt;Probably this:&lt;/p&gt;

&lt;p&gt;Many detection systems don’t flag you immediately.&lt;/p&gt;

&lt;p&gt;They observe.&lt;/p&gt;

&lt;p&gt;You pass login.&lt;br&gt;
You pass checkout.&lt;br&gt;
And then you get shadow-limited or silently flagged.&lt;/p&gt;

&lt;p&gt;Most users blame fingerprints.&lt;br&gt;
In reality it’s often networking.&lt;/p&gt;

&lt;p&gt;Once we fixed WebRTC and QUIC, a lot of “random” issues disappeared.&lt;/p&gt;

&lt;p&gt;Afina is not for everyone&lt;/p&gt;

&lt;p&gt;And that’s fine.&lt;/p&gt;

&lt;p&gt;If you need:&lt;/p&gt;

&lt;p&gt;mass spoofing&lt;/p&gt;

&lt;p&gt;aggressive automation&lt;/p&gt;

&lt;p&gt;unrealistic setups&lt;/p&gt;

&lt;p&gt;Afina is probably not the best fit.&lt;/p&gt;

&lt;p&gt;But if you care about:&lt;/p&gt;

&lt;p&gt;real browser behavior&lt;/p&gt;

&lt;p&gt;long sessions&lt;/p&gt;

&lt;p&gt;antifraud systems that actually analyze traffic&lt;/p&gt;

&lt;p&gt;Then building things the hard way makes sense.&lt;/p&gt;

&lt;p&gt;Final thought&lt;/p&gt;

&lt;p&gt;The biggest lesson for us:&lt;/p&gt;

&lt;p&gt;You can’t fake reality forever.&lt;/p&gt;

&lt;p&gt;At some point it’s easier to just behave like a real browser than to pretend.&lt;/p&gt;

&lt;p&gt;That’s what Afina is about.&lt;/p&gt;

&lt;p&gt;More details: &lt;a href="https://afina.io" rel="noopener noreferrer"&gt;https://afina.io&lt;/a&gt;&lt;/p&gt;

</description>
      <category>networking</category>
      <category>privacy</category>
      <category>security</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
