The usual way for a user to authenticate themselves to a website at the application layer is with a shared secret - the user's password. If a user is connecting to a bank, they give the bank their password, and the bank stores the password, hopefully not in plaintext, but as a salted hash run through a slow KDF.
There are some weaknesses to this scheme, for example the fact that users tend to reuse passwords across websites, and that many server operators do not take the appropriate precautions when storing their users' passwords. Even if a user randomly generates strong passwords for each website, the server could still lose the password, so the user must trust the server operator to safely store the password.
If a public key scheme was used, similar to SSH key authentication, the user would not have to trust the server. The server could store the user's public key, which compromises nothing if stolen. If the user's private key is stolen, they can still revoke the key, preventing the thief from using it.
SSH supports this kind of authentication. Are there any existing systems that do authentication to websites, as opposed to SSH servers, like this?
Basically, are there any systems that replace user passwords with signatures from the user's private key?