The hosts, needing a bonus point and a winning margin of 21 points, had only one try and a 13-10 lead at the break.
Damian Penaud's second-half score showed France's danger, but they could never stretch clear of their visitors.
Scotland's Finn Russell was shown a late red but Duhan van der Merwe swooped for a decisive late try.
It was fitting that a Championship that has been packed with tight games and show-stopping finales should finish with another match-deciding score and the clock deep in the red.
As Scotland's players leapt skywards to celebrate Van der Merwe's step and finish, France's slumped to the sodden Stade de France turf.
However, their hopes of swiping the trophy from Wales had long since gone.
It is the sixth title of the Six Nations era for a Wales side that came into the campaign as distinct underdogs after an underwhelming autumn.
It could easily have come earlier, and with the added decoration of a Grand Slam for Wales - only for France to keep Wales' celebrations on ice and their own hopes alive with a last-gasp bonus-point victory over Wayne Pivac's men six days ago.
But the twin tasks of running in four tries and racking up a 21-point winning margin on a tight turnaround proved far too steep.
Fittingly, it was a Welshman who played a key part in denying France. Since arriving at the end of 2019, defence coach Steve Tandy has transformed Scotland into the meanest defence in the Six Nations.
They conceded the fewest points in last year's Championship and have similarly suffocated their opponents in this edition.
The critical period came either side of half-time.
In a drenched, empty Stade de France, Van der Merwe's short-range try had survived the suspicion of a double movement to help Scotland to a 10-6 lead.
France soon wrestled their way into the ascendancy, camping on the Scotland line, but found themselves ushered down blind alleys at every turn.
Chris Harris' canny cover and bravery in contact was especially impressive.
Brice Dulin breached the line before the break but, even with Scotland captain Stuart Hogg in the sin-bin for the first nine minutes of the second half, Scotland did not disintegrate.
Romain Ntamack zipped through a hole, Virimi Vakatawa flipped an offload out of the back of his hand and Penaud chipped, chased and grounded for a fine score.
But France could not replicate those bursts of flair. And Scotland wouldn't let them.
Scotland's last win in Paris was so long ago that the Six Nations were Five, Emile Ntamack, rather than his son Romain, was in the France team and Scotland's coach Gregor Townsend was on the pitch rather than the touchline.
Scotland, though, started this campaign with an away victory over England that ended an even longer barren run, and never lost faith.
Captain Stuart Hogg admitted earlier in the week that France's public confidence had irritated his side and they took great delight in shredding the script.
The route to victory was not the one many might have expected.
Russell, who has been lighting up Racing 92's futuristic home ground across town, produced a performance low on dazzle, but high on IQ.
The fly-half, along with Hogg, turned France's back three with long, raking kicks, penning them deep in their own half during the first quarter.
After Russell's 70th-minute departure for a fending forearm into the throat of Dulin, it seemed Scotland would have to settle for a narrow defeat and pooping a party.
But Scotland's forwards, with Hamish Watson, Jamie Ritchie and Dave Cherry all excellent, took it to a tiring and dispirited French pack.
And when stand-in fly-half Adam Hastings held his nerve to find Van der Merwe with a looping pass worthy of Russell, a famous win was assured.
Replacements: Thomas for Vakatawa (61), Serin for Dupont (64), Gros for Baille (56), Chat for Marchand (56), Atonio for Haouas (60), Taofifenua for Le Roux (50), Cretin for Jelonch (63).
Not Used: Bouthier.
Sin bin: Serin (73).
Scotland: Hogg; D Graham, Harris, Johnson, Van der Merwe; Russell, Price, Sutherland, Turner, Z Fagerson, Skinner, Gilchrist, Ritchie, Watson, Haining.
Replacements: Jones for D Graham (66), Hastings for Johnson (73), Kebble for Sutherland (49), Cherry for Turner (59), Craig for Skinner (75), Wilson for Haining (67).
Not Used: Berghan, Steele.
Sin bin: Hogg (39).
Sent off: Russell (71).