First, the MCU must be capable of writing to its own firmware memory. This is generally true for most modern MCUs, but not for some very early and/or low-end devices.
Second, the memory must be large enough to hold two copies of the firmware: The copy that you're running now, and the copy that you're receiving. You can only switch to the new copy once you have confirmed that it has been received correctly; otherwise, you run the risk of "bricking" your device.
There are many things that might go wrong during an update, including communication errors and power interruptions. You need to make sure that in every possible scenario, the system can recover to a known-good version of the firmware and either resume or restart the update.
And beware of attempts to hack your device -- you'll need some way to authenticate the new firmware before you run it. Either you know the communication channel is secure, or you cryptographically sign the firmware itself.
It has been suggested that external memory can be used to buffer the new image if it's too large to fit in firmware memory. But that works only if you're sure that the power can't be interrupted during the process of transferring from external memory to internal memory, which is something that can take a significant amount of time (or energy, if you're battery powered). If you don't have room for two copies, it's generally a good idea to make the loader separate from the application code, so that even if you've killed the application, you can still get into the loader.