-
Notifications
You must be signed in to change notification settings - Fork 319
Add a Service-Worker-Exclude Header #1690
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
A service worker is controlled by the same origin that you’re sending the request to. What’s being imagined here, exactly? It seems considerably more shaky at a glance to me to suggest requests from a different origin should be able to choose to bypass internal aspects of that origin’s own implementation of its endpoints. |
That's not what I'm proposing. I'm proposing that, when an origin installs it's worker, a I do have a use-case where this would be useful, by allowing me to make sure the client side of my application won't be able to intercept a request to a specific location on my applications origin. But that is just a use-case, something this would be useful for, not the proposal itself. |
Thanks for filing this! I have an extremely similar use case, where I need to be able to exclude certain paths from being handled by the service worker. When chatting through this on Chromium's worker-dev it was mentioned that the static routing API can handle this use case. SpecificityIt's not immediately obvious to me what happens with addEventListener('install', (event) => {
event.addRoutes({
condition: {
urlPattern: new URLPattern({pathname: "/.well-known/*"})
},
source: "network"
});
}
addEventListener('install', (event) => {
event.addRoutes({
condition: {
urlPattern: new URLPattern({pathname: "/.well-known/secret/*"})
},
source: "fetch-event"
});
} Would the route added in the second event be ignored? Subresource requestsMy use case is about excluding the environment from the SW scope, not just the request itself. DeployabilityHaving to programmatically call |
For that case, I think the second event will be ignored because the rule will be added upon addRoutes() and evaluated from the beginning. Since a path "/.well-known/secret/" should be covered by "/.well-known/", the first rule is matched and executed, and the second rule won't be evaluated. Let me go back to the original proposal on the Please correct if I understand wrong but I feel To realize the expectations, I suppose there are three ways:
I feel 1. is straight forward to realize the concept, but it brings scope matching more complex. I am leaning on 2., but I would like to listen to how others think on this. |
I think this was one of the original use cases for |
Just to clarify, Conceptually we have two options I think. Making some resources out of SW control 1) at the scope level or 2) via Static Routing API. In each option, we have to store the information that this resource is excluded somewhere e.g. database, and use it in the next navigation. So essentially those are not so different I guess. IMHO, I feel it's better not to expose the header to exclude some paths in order to keep the API simple. Unlike I'm inclined to 1 or 2, but 2 sounds more easier to achieve because this can be achieved as the extension of the existing static routing infra from both standardization and implementation wise. |
I don't care all that much how it'll work in the end. However, I proposed a header because the server delivering the site will be in control of setting them, and the browser can enforce them. The scripts run on the site can then not circumvent that. Maybe another idea would be to just define a fixed location that can never be handled by a service worker. If it was defined that, for example, |
I'm revisiting my earlier comment in #1690 (comment) in light of our evolving understanding of the threat model. Originally, I had assumed a scenario where the server, ServiceWorker script, and the registering page were under the same ownership or at least trusted parties. I now understand that we need to account for a more hostile environment where each component could be adversarial. This has clarified why the header approach is being considered. The use of headers brings Content Security Policy to mind. Since script injection is a primary concern, I would like to understand why using a |
I'm currently developing an SSO solution, and ran into some difficulties: https://github.com/Daniel-Abrecht/dpa-sso#security-relevant-limitations
To sum it up, I can't rely on cross origin cookies to store a session token, because browsers allow disabling them nowadays. For that reason, I pass it to a well known location at the origin which needs the token as a get parameter. If that origin has a service worker installed, it could intercept that token. For some applications, that may be desirable, but for others, it could be problematic.
I'm still looking for a safer way to pass the token, but it would be nice to also have a way to prevent a service worker from handling requests to certain locations too.
For that reason, I propose adding a
Service-Worker-Exclude
header, that would have some similarities to theService-Worker-Allowed
header. I would like it to work as follows.Service-Worker-Exclude
should contain a list of locations who will not be handled by the service worker and just bypass it entirely. It should be set when installing the service worker. That way, I could, for example, make sure the entire/.well-known/
directory won't be handled by a service worker.The text was updated successfully, but these errors were encountered: