Keep wallet money on the canister or user's account?

What is the correct (or best) way to implement a wallet? I have two ideas:

  • Do icrc1_transfer in frontend JS, so using the user’s principal.
  • Create a method like do_icrc1_transfer in wallet’s backend that will in regard of the user transfer from the backend’s principal.

Please, give advantages and disadvantages of either. I see the advantage of “canister’s account”, that the addresses can be shorter, because canister principals are shorter than user principal. Any other advantages or deficiencies?