<?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: Tanya</title>
    <description>The latest articles on DEV Community by Tanya (@tanya_monoware).</description>
    <link>https://dev.to/tanya_monoware</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%2F4048666%2Fd478dfa8-9d4d-40ac-8159-bbba780e392d.jpg</url>
      <title>DEV Community: Tanya</title>
      <link>https://dev.to/tanya_monoware</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tanya_monoware"/>
    <language>en</language>
    <item>
      <title>How to Remove EXIF and GPS Metadata Before Sharing a Photo</title>
      <dc:creator>Tanya</dc:creator>
      <pubDate>Fri, 31 Jul 2026 06:04:44 +0000</pubDate>
      <link>https://dev.to/tanya_monoware/how-to-remove-exif-and-gps-metadata-before-sharing-a-photo-2c6i</link>
      <guid>https://dev.to/tanya_monoware/how-to-remove-exif-and-gps-metadata-before-sharing-a-photo-2c6i</guid>
      <description>&lt;p&gt;A JPEG can contain GPS coordinates, capture times, camera and lens details,&lt;br&gt;
editing software, comments, and copyright fields. That may be useful in a&lt;br&gt;
private archive, but risky in a public issue, marketplace listing, or social&lt;br&gt;
post.&lt;/p&gt;

&lt;p&gt;Do not assume the upload destination will remove it. Platforms process formats&lt;br&gt;
differently and can change behavior. Create a clean public copy before the file&lt;br&gt;
leaves your control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Inspect a sharing copy
&lt;/h2&gt;

&lt;p&gt;Keep the original private. On a separate copy, check for GPS data, timestamps,&lt;br&gt;
camera identifiers, and EXIF, XMP, or IPTC fields. The goal is not to damage&lt;br&gt;
your archive; it is to make a public file containing only what the destination&lt;br&gt;
needs.&lt;/p&gt;

&lt;p&gt;A practical workflow is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Inspect the sharing copy locally.&lt;/li&gt;
&lt;li&gt;Export a cleaned file.&lt;/li&gt;
&lt;li&gt;Inspect that exact output again.&lt;/li&gt;
&lt;li&gt;Review what is visible in the pixels.&lt;/li&gt;
&lt;li&gt;Rename it clearly before uploading.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The MonoTools EXIF Inspector &amp;amp; Cleaner does this in the current browser tab.&lt;br&gt;
The selected photo is read through browser APIs and is not uploaded to a&lt;br&gt;
processing server.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understand the JPEG boundary
&lt;/h2&gt;

&lt;p&gt;JPEG stores metadata in segments around its compressed image data. The cleaner&lt;br&gt;
can remove those segments without recompressing the pixels. It currently&lt;br&gt;
removes APP1 EXIF and XMP, APP2 ICC profiles, APP13 Photoshop and IPTC data,&lt;br&gt;
and JPEG comments when present.&lt;/p&gt;

&lt;p&gt;Removing an ICC profile can change color rendering in managed workflows, so&lt;br&gt;
compare the cleaned copy with the original when color accuracy matters.&lt;/p&gt;

&lt;p&gt;The cleaned export currently supports JPEG only. PNG and WebP use different&lt;br&gt;
container structures; the tool can inspect them but does not yet rewrite their&lt;br&gt;
metadata.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check the pixels too
&lt;/h2&gt;

&lt;p&gt;Metadata removal cannot hide information already visible in a photo. Look for&lt;br&gt;
street signs, faces, badges, vehicle plates, screens, shipping labels, QR&lt;br&gt;
codes, landmarks, and reflections. Cropping, blurring, or replacing the image&lt;br&gt;
may still be necessary.&lt;/p&gt;

&lt;p&gt;If the public copy also needs resizing or format conversion, do that after the&lt;br&gt;
privacy review, then inspect the final file again. Compression and metadata&lt;br&gt;
cleanup solve different problems.&lt;/p&gt;

&lt;p&gt;I maintain MonoTools and wrote a fuller guide for its browser-local EXIF&lt;br&gt;
Inspector &amp;amp; Cleaner:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://monoware.app/guides/remove-exif-metadata-before-sharing?utm_source=devto&amp;amp;utm_medium=content&amp;amp;utm_campaign=exif_cleanup_guide" rel="noopener noreferrer"&gt;https://monoware.app/guides/remove-exif-metadata-before-sharing?utm_source=devto&amp;amp;utm_medium=content&amp;amp;utm_campaign=exif_cleanup_guide&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Disclosure: MonoTools is my project.&lt;/p&gt;

</description>
      <category>privacy</category>
      <category>security</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to Compress Images in the Browser Without Uploading Them</title>
      <dc:creator>Tanya</dc:creator>
      <pubDate>Fri, 31 Jul 2026 05:59:23 +0000</pubDate>
      <link>https://dev.to/tanya_monoware/how-to-compress-images-in-the-browser-without-uploading-them-4hc7</link>
      <guid>https://dev.to/tanya_monoware/how-to-compress-images-in-the-browser-without-uploading-them-4hc7</guid>
      <description>&lt;p&gt;A screenshot can be 4000 pixels wide even when a page renders it at 900&lt;br&gt;
pixels. Lowering the quality slider may help, but the better first question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What is the largest size at which this image will actually be displayed?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Resize first
&lt;/h2&gt;

&lt;p&gt;If an image never renders wider than 1200 pixels, shipping a 4000-pixel source&lt;br&gt;
wastes download bytes and browser memory. Resize to the largest useful display&lt;br&gt;
width, preserve the aspect ratio, and do not upscale a smaller source.&lt;/p&gt;

&lt;p&gt;For a one-off asset, the whole process can stay in the browser:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Decode the selected file locally.&lt;/li&gt;
&lt;li&gt;Scale it to a maximum width.&lt;/li&gt;
&lt;li&gt;Draw it to a Canvas.&lt;/li&gt;
&lt;li&gt;Export with the browser's WebP, JPEG, or PNG encoder.&lt;/li&gt;
&lt;li&gt;Compare dimensions and file size, then inspect the preview.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is how the MonoTools Image Optimizer works. The selected file remains in&lt;br&gt;
the current tab instead of being sent to an image-processing service.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choose a format for the content
&lt;/h2&gt;

&lt;p&gt;WebP is a useful default for screenshots and mixed-content images. It supports&lt;br&gt;
transparency and often produces smaller files than JPEG or PNG.&lt;/p&gt;

&lt;p&gt;JPEG suits photographs when transparency is unnecessary. Reduce quality&lt;br&gt;
carefully around faces, text overlays, sharp UI edges, and gradients.&lt;/p&gt;

&lt;p&gt;PNG remains appropriate for lossless graphics and transparency. A browser's&lt;br&gt;
quality setting does not make PNG behave like lossy JPEG, so moving the slider&lt;br&gt;
may have little effect.&lt;/p&gt;

&lt;p&gt;Conversion alone is not optimization. Compare the actual output and view it&lt;br&gt;
near its intended page size. Small text, one-pixel borders, shadows, and logo&lt;br&gt;
edges tend to reveal damage first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Know the limits
&lt;/h2&gt;

&lt;p&gt;Local processing avoids an upload, but decoded images can consume far more&lt;br&gt;
memory than their compressed files. Very large sources may slow the tab or&lt;br&gt;
make Canvas export fail. Reduce the target width or process one image at a&lt;br&gt;
time when that happens.&lt;/p&gt;

&lt;p&gt;Browser encoders can also produce slightly different output. This workflow is&lt;br&gt;
good for individual assets and visual review; a versioned build dependency is&lt;br&gt;
better for large batches or reproducible production output.&lt;/p&gt;

&lt;p&gt;Use &lt;code&gt;srcset&lt;/code&gt; or &lt;code&gt;picture&lt;/code&gt; when a page needs several responsive sizes. Also&lt;br&gt;
inspect GPS, camera, or timestamp metadata separately: resizing an image does&lt;br&gt;
not guarantee that private metadata is removed.&lt;/p&gt;

&lt;p&gt;I maintain MonoTools and wrote a fuller guide for its browser-local Image&lt;br&gt;
Optimizer:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://monoware.app/guides/compress-images-locally?utm_source=devto&amp;amp;utm_medium=content&amp;amp;utm_campaign=local_image_compression" rel="noopener noreferrer"&gt;https://monoware.app/guides/compress-images-locally?utm_source=devto&amp;amp;utm_medium=content&amp;amp;utm_campaign=local_image_compression&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Disclosure: MonoTools is my project.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>performance</category>
      <category>javascript</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How to Inspect a JWT Without Uploading a Production Token</title>
      <dc:creator>Tanya</dc:creator>
      <pubDate>Thu, 30 Jul 2026 16:08:15 +0000</pubDate>
      <link>https://dev.to/tanya_monoware/how-to-inspect-a-jwt-without-uploading-a-production-token-4co6</link>
      <guid>https://dev.to/tanya_monoware/how-to-inspect-a-jwt-without-uploading-a-production-token-4co6</guid>
      <description>&lt;p&gt;A JSON Web Token often looks like opaque security data, but its header and&lt;br&gt;
payload are normally readable Base64URL segments. That makes local inspection&lt;br&gt;
straightforward. It also creates two common mistakes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uploading a live bearer token to an unknown server-side decoder.&lt;/li&gt;
&lt;li&gt;Treating decoded claims as proof that the token is authentic.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This workflow separates three different jobs:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Inspecting the token structure.&lt;/li&gt;
&lt;li&gt;Checking claims such as issuer, audience and expiration.&lt;/li&gt;
&lt;li&gt;Verifying that a trusted issuer signed the token.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The first two can be done locally in a browser tab. The third requires the&lt;br&gt;
expected algorithm and trusted key material.&lt;/p&gt;
&lt;h2&gt;
  
  
  1. Treat the JWT as a credential
&lt;/h2&gt;

&lt;p&gt;A JWT may be readable, but it can still grant access to an API. If it is a&lt;br&gt;
bearer token, anyone who receives the original compact token may be able to use&lt;br&gt;
it until it expires or is revoked.&lt;/p&gt;

&lt;p&gt;Before debugging, decide what kind of token you are handling:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A fake or test token is usually safe to paste into examples.&lt;/li&gt;
&lt;li&gt;A staging token may still expose internal systems.&lt;/li&gt;
&lt;li&gt;A production token should not be copied into public tools, tickets or chat.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If a production token has already crossed an untrusted boundary, redaction is&lt;br&gt;
not enough. Rotate or revoke it and treat the event as a credential exposure.&lt;/p&gt;
&lt;h2&gt;
  
  
  2. Split the compact token
&lt;/h2&gt;

&lt;p&gt;A typical JWT has three dot-separated segments:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;header.payload.signature
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The header and payload are Base64URL-encoded JSON. They are not encrypted by&lt;br&gt;
default. That means you can decode the first two segments locally and read the&lt;br&gt;
claims without sending the compact token to a server.&lt;/p&gt;

&lt;p&gt;The header usually includes fields such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"alg"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"RS256"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"typ"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"JWT"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"kid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"example-key-id"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The payload may include registered claims:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"iss"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://issuer.example"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"aud"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"api.example"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sub"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user_123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"exp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1764211200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"nbf"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1764207600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"iat"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1764207600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scope"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"read:profile"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Do not paste a real token into an article, issue or support ticket. Use a&lt;br&gt;
synthetic example or share only the claim values needed to explain the failure.&lt;/p&gt;
&lt;h2&gt;
  
  
  3. Check the claims that commonly fail
&lt;/h2&gt;

&lt;p&gt;Most authentication debugging starts with a small set of fields.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;code&gt;iss&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;The issuer must match the identity provider or token service expected by the&lt;br&gt;
API. A common failure is using a token from the right environment but the wrong&lt;br&gt;
issuer configuration.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;code&gt;aud&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;The audience should identify the API or client that the token was issued for.&lt;br&gt;
If the token was minted for a different API, the claims may look correct while&lt;br&gt;
the request still fails authorization.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;code&gt;exp&lt;/code&gt;, &lt;code&gt;nbf&lt;/code&gt; and &lt;code&gt;iat&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;JWT numeric date fields are seconds since the Unix epoch. Many bugs come from&lt;br&gt;
mixing seconds and milliseconds.&lt;/p&gt;

&lt;p&gt;Check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is &lt;code&gt;exp&lt;/code&gt; already in the past?&lt;/li&gt;
&lt;li&gt;Is &lt;code&gt;nbf&lt;/code&gt; still in the future?&lt;/li&gt;
&lt;li&gt;Does &lt;code&gt;iat&lt;/code&gt; make sense for the login or refresh event?&lt;/li&gt;
&lt;li&gt;Are the server and client clocks skewed?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Custom roles and scopes
&lt;/h3&gt;

&lt;p&gt;Applications often encode permissions in custom claims such as &lt;code&gt;scope&lt;/code&gt;,&lt;br&gt;
&lt;code&gt;roles&lt;/code&gt;, &lt;code&gt;permissions&lt;/code&gt; or tenant-specific fields. These are useful for&lt;br&gt;
debugging, but they are only trustworthy after signature verification.&lt;/p&gt;
&lt;h2&gt;
  
  
  4. Decoding is not verification
&lt;/h2&gt;

&lt;p&gt;Anyone can construct a JWT-looking string with a header and payload. A decoder&lt;br&gt;
can tell you what the token claims. It cannot tell you whether the token was&lt;br&gt;
signed by the expected issuer.&lt;/p&gt;

&lt;p&gt;Verification needs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The expected algorithm.&lt;/li&gt;
&lt;li&gt;The trusted signing secret or public key.&lt;/li&gt;
&lt;li&gt;Issuer and audience checks.&lt;/li&gt;
&lt;li&gt;Rejection of unexpected algorithms.&lt;/li&gt;
&lt;li&gt;Current time validation for &lt;code&gt;exp&lt;/code&gt; and &lt;code&gt;nbf&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For HS256 development tokens, the verifier needs the shared secret. For RS256,&lt;br&gt;
ES256 or production identity providers, the backend normally verifies against a&lt;br&gt;
published JWKS or a configured public key.&lt;/p&gt;

&lt;p&gt;Do not trust the &lt;code&gt;alg&lt;/code&gt; value from the token by itself. Your verification code&lt;br&gt;
should enforce the algorithm that the application expects.&lt;/p&gt;
&lt;h2&gt;
  
  
  5. Build a share-safe diagnostic
&lt;/h2&gt;

&lt;p&gt;The useful output of JWT debugging is usually not the original token. It is a&lt;br&gt;
small set of facts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Token structure: 3 JWT segments
Header alg: RS256
Header kid: example-key-id
Issuer: https://issuer.example
Audience: api.example
Subject: user_123
exp: 1764211200 / 2025-11-27T00:00:00Z
nbf: 1764207600 / 2025-11-26T23:00:00Z
Verification error: audience mismatch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Before sharing the diagnostic:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Remove the original compact token.&lt;/li&gt;
&lt;li&gt;Remove unrelated cookies or authorization headers.&lt;/li&gt;
&lt;li&gt;Scan the remaining text for other credentials.&lt;/li&gt;
&lt;li&gt;Include the exact verification error and expected issuer or audience.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That gives the next person enough context to debug without receiving a reusable&lt;br&gt;
credential.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. A local workflow
&lt;/h2&gt;

&lt;p&gt;My preferred workflow is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Decode the JWT header and payload locally.&lt;/li&gt;
&lt;li&gt;Convert &lt;code&gt;exp&lt;/code&gt;, &lt;code&gt;nbf&lt;/code&gt; and &lt;code&gt;iat&lt;/code&gt; to readable dates.&lt;/li&gt;
&lt;li&gt;Compare &lt;code&gt;iss&lt;/code&gt; and &lt;code&gt;aud&lt;/code&gt; with the API configuration.&lt;/li&gt;
&lt;li&gt;Verify the signature in backend code or a local lab with trusted key
material.&lt;/li&gt;
&lt;li&gt;Redact the original token before opening a ticket or asking for help.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I maintain MonoTools, including a browser-local JWT decoder and the longer&lt;br&gt;
canonical guide for this workflow:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://monoware.app/guides/inspect-jwt-without-uploading?utm_source=devto&amp;amp;utm_medium=content&amp;amp;utm_campaign=jwt_local_guide" rel="noopener noreferrer"&gt;https://monoware.app/guides/inspect-jwt-without-uploading?utm_source=devto&amp;amp;utm_medium=content&amp;amp;utm_campaign=jwt_local_guide&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Disclosure: MonoTools is my project. The guide and decoder are useful for local&lt;br&gt;
inspection, but signature verification still belongs in trusted verification&lt;br&gt;
code with the expected key material.&lt;/p&gt;

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