Aiming to return to winning ways after its UEFA Nations League exit, France's task was made harder when Mbappe – who had squandered a great early chance – went off with a shoulder injury following an awkward collision with visiting goalkeeper Martin Campana.
But, having failed to score in the first half for a fourth successive game, France's luck changed when Martin Caceres was harshly adjudged to have handled Antoine Griezmann's effort.
Giroud made no mistake from the resulting penalty, ensuring that Mbappe's absence was not felt too much by Didier Deschamp's side.
Giroud's shot into the side netting set the tone for a strong France start, and the hosts would have been ahead in the 16th minute had Mbappe kept his chip on target.
The Paris Saint-Germain striker looked set to atone for that miss on the half-hour, but instead France was dealt a huge injury blow.
Having latched onto Tanguy Ndombele's defence-splitting pass, Mbappe was unable to avoid the onrushing Campana, landing heavily on his right shoulder and, despite attempting to carry on after receiving treatment, the youngster was replaced by Florian Thauvin.
France's pressure finally told early in the second half, though, with Giroud slotting home from 12 yards after Caceres was deemed to have intentionally used his arm to deny Griezmann's on-target effort.
It failed to build on that lead, however, and Jonathan Rodriguez nearly punished their profligacy late on, Hugo Lloris denying the substitute from close range to make sure Les Bleus ended a brilliant 2018 on a winning note