Compare / browsers
Naver Whale vs Chrome
Whale 5.39 runs on Chromium 150, five majors behind Chrome 155, names itself in the user agent and client hints, and sends a TLS hello one extension short of Chrome's. What that means for driving it and for how sites see it.
Naver Whale is Naver's Chromium browser, the one that ships with Naver services in Korea. On the fleet, Whale 5.39.412.57 stable is built on Chromium 150.0.7871.252, while Chrome stable is 155.0.8059.84 — measured the same night. Both run headful by default and cost the same two threads. The questions for a scraper: does Whale look like Chrome on the wire, does it hide that it's Whale, and what does running five Chromium majors behind cost you?
As a developer: driving them
| Naver Whale | Google Chrome | |
|---|---|---|
| Version on the fleet | Whale 5.39 stable on Chromium 150. Stable channel only, no pinned versions. | Chrome 155 stable on Chromium 155, with beta (156) and dev (157) channels and pinned previous majors (version). |
| Launch options | channel, live_view, screen_size, keep_alive, start_url, record. No cdp (400) and no persistent profile (400 profile_unsupported_engine). | The same plus cdp, profile and version. |
| Playwright features | Main-world evaluate, console events, init scripts, routing, screenshots, PDF, device emulation, tracing — all work (measured). | The same list, all working (measured). |
| Web platform | Chromium 150: no Iterator.prototype.includes/join/Iterator.zip, no FontFace width, no <camera> element, no CSS margin-trim, text-decoration-skip-spaces or symbols(), no media-playback-while-not-visible policy (measured). | Chromium 155: all of the above present (measured). |
| Privacy Sandbox | No Topics API; Shared Storage and document.requestStorageAccessFor are exposed (measured). | Topics API exposed; Shared Storage and requestStorageAccessFor are not (measured). |
| WebGL | WebGL 2.0 on SwiftShader (ANGLE, Vulkan), like Chrome (measured; before 2026-10-17 headful Whale had no WebGL context on the fleet). | WebGL 2.0 on SwiftShader (ANGLE, Vulkan), the software renderer of a GPU-less server. |
As a scraper: what the site sees
| Naver Whale | Google Chrome | |
|---|---|---|
| User agent | Chrome/150.0.0.0 Whale/5.39.412.57 Safari/537.36 — Whale names itself, with its full version. | Chrome/155.0.0.0 … Safari/537.36. |
| Client hints | Brands Whale 5, Chromium 150; full versions 5.39.412.57 and 150.0.7871.252. | Brands Google Chrome 155, Chromium 155; full version 155.0.8059.84. |
| TLS | JA4 t13d1516h2_8daaf6152771_806a8c22fdea: 16 ciphers, 18 extensions; its own peetprint. | JA4 t13d1517h2_8daaf6152771_cb7bf5808d99: the same 16 ciphers, 19 extensions. The cipher part of JA4 matches; the extension part doesn't. |
| HTTP/2 and headers | Chromium's SETTINGS and WINDOW_UPDATE (1:65536;2:0;4:6291456;6:262144|15663105); header order sec-ch-ua … user-agent, accept, sec-fetch-*. | Identical HTTP/2 fingerprint and header order. |
| Fingerprint values | The machine's own cores, memory and screen; canvas hash 4f88e08a, 5 plugins, en-US, en; the same WebGL renderer as Chrome. | Canvas hash f5a94624 — a different canvas hash from Whale's on the same renderer; the same plugins and languages. Neither adds fingerprint randomisation. |
| Bot checks | bot.sannysoft.com: 1 flag, "WebGL Renderer" (SwiftShader on a GPU-less server). | The same 1 flag. |
Which to pick
- Chrome for the most common visitor on the web, the newest stable engine, CDP, persistent profiles, beta/dev channels and pinned majors.
- Whale when a site — typically a Korean one built around Naver — should see a real Whale visitor: the brand is consistent in the user agent, the client hints and a TLS hello that differs from Chrome's. It doesn't pass as Chrome, and it isn't meant to.
- Mind the engine age: code written for Chromium 151–155 features may not run on Whale's Chromium 150. Use Chrome or Edge for those.
Measured on the fleet (2026-10-17)
One headful launch of each through the same proxy, probed from inside a page and via tls.peet.ws.
Launch and cost
Single run; timings depend on the proxy and on fleet load.
| Naver Whale | Google Chrome | |
|---|---|---|
| Launch body | {"headless":false} | {"headless":false} |
| Threads used | 2 (linux_headful) | 2 (linux_headful) |
| Browser version | 150.0.7871.252 | 155.0.8059.84 |
| Launch request → browser ready | 0.4 s | 0.4 s |
| Playwright connect | 0.1 s | 0.1 s |
| Load example.com | 1.4 s | 2.6 s |
| Load tls.peet.ws/api/all | 1.3 s | 2.1 s |
What the network sees
From tls.peet.ws/api/all, requested by the browser itself. JA3 hashes change between runs of the same build (GREASE), so compare JA4 and the HTTP/2 fingerprint.
| Naver Whale | Google Chrome | |
|---|---|---|
| HTTP version | h2 | h2 |
| JA4 | t13d1516h2_8daaf6152771_806a8c22fdea | t13d1517h2_8daaf6152771_cb7bf5808d99 |
| Peetprint hash | 67c3e9111bed9e7f03d2f21d6d88994b | fc97c1cdfb1409c9a9326c1b726d1dee |
| Akamai HTTP/2 fingerprint | 1:65536;2:0;4:6291456;6:262144|15663105|0|m,a,s,p | 1:65536;2:0;4:6291456;6:262144|15663105|0|m,a,s,p |
| Cipher suites / extensions | 16 / 18 | 16 / 19 |
| Header order (first 12) | method, authority, scheme, path, sec-ch-ua, sec-ch-ua-mobile, sec-ch-ua-platform, upgrade-insecure-requests, user-agent, accept, sec-fetch-site, sec-fetch-mode | method, authority, scheme, path, sec-ch-ua, sec-ch-ua-mobile, sec-ch-ua-platform, upgrade-insecure-requests, user-agent, accept, sec-fetch-site, sec-fetch-mode |
What page scripts see
Read with page.evaluate on example.com. Cores and memory are the server's and vary between fleet nodes.
| Naver Whale | Google Chrome | |
|---|---|---|
| navigator.userAgent | Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/150.0.0.0 Whale/5.39.412.57 Safari/537.36 | Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/155.0.0.0 Safari/537.36 |
| UA-CH brands | Whale 5 · Chromium 150 · Not/A)Brand 24 | Google Chrome 155 · Chromium 155 · Not(A:Brand 24 |
| UA-CH full version list | Whale 5.39.412.57 · Chromium 150.0.7871.252 · Not/A)Brand 24.0.0.0 | Google Chrome 155.0.8059.84 · Chromium 155.0.8059.84 · Not(A:Brand 24.0.0.0 |
| navigator.platform / vendor | Linux x86_64 / Google Inc. | Linux x86_64 / Google Inc. |
| Languages | en-US, en | en-US, en |
| Timezone / locale | UTC / en-US | UTC / en-US |
| Screen (w×h×availW×availH×depth) | 1280x720x1280x720x24 | 1280x720x1280x720x24 |
| Window outer / inner / DPR | 1288x805 / 1280x720 / 1 | 1288x805 / 1280x720 / 1 |
| hardwareConcurrency / deviceMemory | 16 / 32 | 32 / 32 |
| WebGL vendor | Google Inc. (Google) | Google Inc. (Google) |
| WebGL renderer | ANGLE (Google, Vulkan 1.3.0 (SwiftShader Device (Subzero) (0x0000C0DE)), SwiftShader driver) | ANGLE (Google, Vulkan 1.3.0 (SwiftShader Device (Subzero) (0x0000C0DE)), SwiftShader driver) |
| WebGL version | WebGL 2.0 (OpenGL ES 3.0 Chromium) | WebGL 2.0 (OpenGL ES 3.0 Chromium) |
| WebGPU (navigator.gpu) | yes | yes |
| Canvas hash | 4f88e08a | f5a94624 |
| navigator.webdriver | no | no |
| window.chrome / navigator.connection | yes / yes | yes / yes |
| Plugins / PDF viewer | 5 / yes | 5 / yes |
| Notification.permission / permissions.query | default / prompt | default / prompt |
Web platform features
Presence probes; a user agent that claims one version while exposing another's features is a detectable inconsistency.
| Naver Whale | Google Chrome | |
|---|---|---|
Iterator.prototype.includes (new in Chrome 154) | no | yes |
FontFace.width (new in Chrome 154) | no | yes |
CSS text-decoration-inset (new in Chrome 154) | no | no |
Iterator.prototype.join (Chrome 153) | no | yes |
Iterator.zip (Chrome 153) | no | yes |
CSS scroll-axis-lock (Chrome 153) | no | no |
<camera> element (Chrome 153) | no | yes |
document.requestStorageAccessFor (deprecated in 153) | yes | no |
Topics API (document.browsingTopics) | no | yes |
Protected Audience (navigator.joinAdInterestGroup) | yes | yes |
Shared Storage (window.sharedStorage) | yes | no |
Attribution Reporting (window.attributionReporting) | no | no |
| Private Aggregation | no | no |
WebHID (navigator.hid) | yes | yes |
CSS margin-trim (Chrome 155) | no | yes |
CSS text-decoration-skip-spaces (Chrome 155) | no | yes |
CSS corner shorthand (Chrome 155) | no | no |
CSS symbols() (Chrome 155) | no | yes |
Element.streamAppendHTML (Chrome 155) | no | no |
WebTransport.reliability (Chrome 155) | no | no |
window.maximize() — Additional Windowing Controls (Chrome 155) | no | no |
Canvas srgb-linear colour space (Chrome 155) | no | no |
Permission policy media-playback-while-not-visible (Chrome 155) | no | yes |
CSS random() (Chrome 156) | no | no |
CSS scroll-snap-type: pair (Chrome 156) | no | no |
Fenced frames (window.fence) — removal starts in 157 | yes | yes |
rel=compression-dictionary (Chrome 156 updates) | yes | yes |
bot.sannysoft.com
The classic headless-detection test page; what it marks red.
| Naver Whale | Google Chrome | |
|---|---|---|
| Checks / failed | 57 / 1 | 57 / 1 |
| Failed checks | WebGL Renderer | WebGL Renderer |
A plain-HTTP URL (http://ip-api.com/json)
Chrome 154 warns before loading insecure HTTP by default — does that reach an automated session?
| Naver Whale | Google Chrome | |
|---|---|---|
| Final URL | http://ip-api.com/json/?fields=status | http://ip-api.com/json/?fields=status |
| HTTP status | 200 | 200 |
| Content loaded / warning page first | yes / no | yes / no |
Playwright over the remote connection
Which client features work on this side.
| Naver Whale | Google Chrome | |
|---|---|---|
| page.evaluate runs in the page's own world | yes | yes |
| addInitScript visible to page scripts | yes | yes |
| Console events | yes | yes |
| Request interception (page.route) | yes | yes |
| Screenshot | yes | yes |
| yes | yes | |
| Mobile device emulation | yes | yes |
| Tracing | yes | yes |
Rows where the two sides differ are highlighted. IP addresses are replaced with placeholders (203.0.113.x). The probe is compare/probe.mjs in our repository; the raw result is below.
Raw output
{
"ran_at": "2026-10-17T10:49:59.430Z",
"sides": [
{
"label": "Naver Whale",
"engine": "whale",
"body": {
"headless": false
},
"launch": {
"browser": "whale",
"resource_class": "linux_headful",
"weight": 2,
"launch_ms": 421,
"connect_ms": 108,
"example_ms": 1353,
"peet_ms": 1294
},
"network": {
"http_version": "h2",
"ja4": "t13d1516h2_8daaf6152771_806a8c22fdea",
"ja3_hash": "3acae35a89afdb93498313660eb078c5",
"peetprint_hash": "67c3e9111bed9e7f03d2f21d6d88994b",
"ciphers": 16,
"extensions": 18,
"akamai_h2": "1:65536;2:0;4:6291456;6:262144|15663105|0|m,a,s,p",
"akamai_h2_hash": "52d84b11737d980aef856699f885ca86",
"header_order": [
"method",
"authority",
"scheme",
"path",
"sec-ch-ua",
"sec-ch-ua-mobile",
"sec-ch-ua-platform",
"upgrade-insecure-requests",
"user-agent",
"accept",
"sec-fetch-site",
"sec-fetch-mode"
]
},
"page": {
"user_agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/150.0.0.0 Whale/5.39.412.57 Safari/537.36",
"platform": "Linux x86_64",
"vendor": "Google Inc.",
"languages": [
"en-US",
"en"
],
"hardware_concurrency": 16,
"device_memory": 32,
"max_touch_points": 0,
"webdriver": false,
"plugins": 5,
"pdf_viewer": true,
"ua_data": {
"brands": [
{
"brand": "Whale",
"version": "5"
},
{
"brand": "Chromium",
"version": "150"
},
{
"brand": "Not/A)Brand",
"version": "24"
}
],
"mobile": false,
"platform": "Linux",
"architecture": "x86",
"bitness": "64",
"formFactors": [
"Desktop"
],
"fullVersionList": [
{
"brand": "Whale",
"version": "5.39.412.57"
},
{
"brand": "Chromium",
"version": "150.0.7871.252"
},
{
"brand": "Not/A)Brand",
"version": "24.0.0.0"
}
],
"model": "",
"platformVersion": "",
"uaFullVersion": "5.39.412.57",
"wow64": false
},
"screen": "1280x720x1280x720x24",
"window": {
"outer": "1288x805",
"inner": "1280x720",
"dpr": 1
},
"timezone": "UTC",
"locale": "en-US",
"webgl": {
"vendor": "Google Inc. (Google)",
"renderer": "ANGLE (Google, Vulkan 1.3.0 (SwiftShader Device (Subzero) (0x0000C0DE)), SwiftShader driver)",
"version": "WebGL 2.0 (OpenGL ES 3.0 Chromium)"
},
"canvas_hash": "4f88e08a",
"webgpu": true,
"chrome_object": true,
"chrome_runtime": false,
"notification_permission": "default",
"notification_query": "prompt",
"has_focus": true,
"connection_api": true,
"stack_read_by_debugger": false,
"features": {
"iterator_includes": false,
"iterator_join": false,
"iterator_zip": false,
"fontface_width": false,
"css_text_decoration_inset": false,
"css_scroll_axis_lock": false,
"websocket_options_bag": null,
"camera_element": false,
"topics_api": false,
"protected_audience": true,
"shared_storage": true,
"attribution_reporting": false,
"request_storage_access_for": true,
"webhid": true,
"private_aggregation": false,
"css_margin_trim": false,
"css_text_decoration_skip_spaces": false,
"css_corner_shorthand": false,
"css_symbols": false,
"stream_append_html": false,
"webtransport_reliability": false,
"window_maximize": false,
"canvas_srgb_linear": false,
"policy_media_playback_while_not_visible": false,
"css_random": false,
"css_scroll_snap_pair": false,
"fenced_frames": true,
"compression_dictionary": true
}
},
"page_main_world": null,
"sannysoft": {
"checks": 57,
"failed": 1,
"failed_names": [
"WebGL Renderer"
],
"passed": 30
},
"plain_http": {
"final_url": "http://ip-api.com/json/?fields=status",
"status": 200,
"title": "",
"loaded": true,
"warning_page": false,
"page_text": "{\"status\":\"success\"}"
},
"playwright": {
"evaluate_in_main_world": true,
"console_events": true,
"init_script": true,
"route": true,
"screenshot": true,
"pdf": true,
"mobile_emulation": true,
"tracing": true
},
"browser_version": "150.0.7871.252"
},
{
"label": "Google Chrome",
"engine": "chrome",
"body": {
"headless": false
},
"launch": {
"browser": "chrome",
"resource_class": "linux_headful",
"weight": 2,
"launch_ms": 409,
"connect_ms": 90,
"example_ms": 2588,
"peet_ms": 2094
},
"network": {
"http_version": "h2",
"ja4": "t13d1517h2_8daaf6152771_cb7bf5808d99",
"ja3_hash": "0402a942f2641c0452b616ab4bacc02d",
"peetprint_hash": "fc97c1cdfb1409c9a9326c1b726d1dee",
"ciphers": 16,
"extensions": 19,
"akamai_h2": "1:65536;2:0;4:6291456;6:262144|15663105|0|m,a,s,p",
"akamai_h2_hash": "52d84b11737d980aef856699f885ca86",
"header_order": [
"method",
"authority",
"scheme",
"path",
"sec-ch-ua",
"sec-ch-ua-mobile",
"sec-ch-ua-platform",
"upgrade-insecure-requests",
"user-agent",
"accept",
"sec-fetch-site",
"sec-fetch-mode"
]
},
"page": {
"user_agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/155.0.0.0 Safari/537.36",
"platform": "Linux x86_64",
"vendor": "Google Inc.",
"languages": [
"en-US",
"en"
],
"hardware_concurrency": 32,
"device_memory": 32,
"max_touch_points": 0,
"webdriver": false,
"plugins": 5,
"pdf_viewer": true,
"ua_data": {
"brands": [
{
"brand": "Google Chrome",
"version": "155"
},
{
"brand": "Chromium",
"version": "155"
},
{
"brand": "Not(A:Brand",
"version": "24"
}
],
"mobile": false,
"platform": "Linux",
"architecture": "x86",
"bitness": "64",
"formFactors": [
"Desktop"
],
"fullVersionList": [
{
"brand": "Google Chrome",
"version": "155.0.8059.84"
},
{
"brand": "Chromium",
"version": "155.0.8059.84"
},
{
"brand": "Not(A:Brand",
"version": "24.0.0.0"
}
],
"model": "",
"platformVersion": "",
"uaFullVersion": "155.0.8059.84",
"wow64": false
},
"screen": "1280x720x1280x720x24",
"window": {
"outer": "1288x805",
"inner": "1280x720",
"dpr": 1
},
"timezone": "UTC",
"locale": "en-US",
"webgl": {
"vendor": "Google Inc. (Google)",
"renderer": "ANGLE (Google, Vulkan 1.3.0 (SwiftShader Device (Subzero) (0x0000C0DE)), SwiftShader driver)",
"version": "WebGL 2.0 (OpenGL ES 3.0 Chromium)"
},
"canvas_hash": "f5a94624",
"webgpu": true,
"chrome_object": true,
"chrome_runtime": false,
"notification_permission": "default",
"notification_query": "prompt",
"has_focus": true,
"connection_api": true,
"stack_read_by_debugger": false,
"features": {
"iterator_includes": true,
"iterator_join": true,
"iterator_zip": true,
"fontface_width": true,
"css_text_decoration_inset": false,
"css_scroll_axis_lock": false,
"websocket_options_bag": null,
"camera_element": true,
"topics_api": true,
"protected_audience": true,
"shared_storage": false,
"attribution_reporting": false,
"request_storage_access_for": false,
"webhid": true,
"private_aggregation": false,
"css_margin_trim": true,
"css_text_decoration_skip_spaces": true,
"css_corner_shorthand": false,
"css_symbols": true,
"stream_append_html": false,
"webtransport_reliability": false,
"window_maximize": false,
"canvas_srgb_linear": false,
"policy_media_playback_while_not_visible": true,
"css_random": false,
"css_scroll_snap_pair": false,
"fenced_frames": true,
"compression_dictionary": true
}
},
"page_main_world": null,
"sannysoft": {
"checks": 57,
"failed": 1,
"failed_names": [
"WebGL Renderer"
],
"passed": 30
},
"plain_http": {
"final_url": "http://ip-api.com/json/?fields=status",
"status": 200,
"title": "",
"loaded": true,
"warning_page": false,
"page_text": "{\"status\":\"success\"}"
},
"playwright": {
"evaluate_in_main_world": true,
"console_events": true,
"init_script": true,
"route": true,
"screenshot": true,
"pdf": true,
"mobile_emulation": true,
"tracing": true
},
"browser_version": "155.0.8059.84"
}
]
}Bottom line
Whale is a Chromium browser that tells every site it's Whale: its own brand in the user agent and client hints, a TLS hello one extension short of Chrome's, the same HTTP/2 and headers, and an engine five Chromium majors behind.
Both cost the same two threads headful; choose by which browser the site should believe it's talking to — and use Chrome when you need CDP or profiles.