It is true that clients can overwrite replicated with custom values, aka try to cheat.
But for the server the values will still be as they were, and as soon as the server changes values for replicated variables these new values get replicated to the client.
If a player has his health status set to 100 via replication, and then tries to cheat and changes his health to 9999 locally it won’t do the cheater any good, the server won’t notice that change and still keeps the health at 100 and as soon as his health drops by 1 the server will replicate the new health value 99 to all clients and the cheater will gets his 9999 cheat-heatlth overwritten by a 99…
The important part is to keep the important logic (taking damage, telling people that someone died, etc) on the server.
Never let the client do hit- or damage calculations, let the server do it and let the server via replicated values and RPCs tell clients whether they hit something or not.
In your case, just make Health a replicated variable in the character.
When a player logs in he’ll automatically get the current up-to-date value for it, no need for RPC calls.
In fact, you can make your replicated variable be a RepNotify-Value, so whenever it gets update it calls the RepNotify-Function for that value. In that function you can get PlayerController index 0 (which is the current clients player), get his hud and call functions to update the widgets with the newly recieved health value.