France Under-20 won the battle of the previously unbeaten teams in this season's junior Six Nations championship.
The sides were level 3-3 at the break as Ethan Davies and Baptiste Serin exchanged penalties.
Serin kicked a penalty before lock Jean-Baptiste Singer's 50th-minute try, which Serin converted.
France U20's scrum-half added a penalty while hooker replacement Ethan Lewis went over for the hosts in Colwyn Bay.
The game was held up in the final quarter as Wales U20 replacement scrum-half Luc Jones received treatment before being carried off on a stretcher.
Jones is the son of former Neath, Llanelli and Wales flanker Lyn Jones, who is in charge at Newport Gwent Dragons.
Luc Jones' injury came during a tackle while his father watched at Eirias Park.
Wales Under-20: Steffan Evans (Scarlets); Ashton Hewitt (Dragons), Harri Evans (RGC), Steffan Hughes (Scarlets, capt), Dafydd Howells (Ospreys); Ethan Davies (Dragons), Connor Lloyd (Scarlets); Nicky Smith (Ospreys), Elliot Dee (Dragons), Nicky Thomas (Ospreys), Scott Andrews (Dragons), James Sheekey (Blues), Will Boyde (Carmarthen Quins), James Benjamin (Dragons) Scott Matthews (Dragons).
Replacements: Ethan Lewis (Blues), Luke Garrett (Dragons), Callum Lewis (Blues), Rory Thornton (Ospreys), Ben Roach (Blues) Luc Jones (Dragons), Luke Price (Ospreys), Tyler Morgan (Dragons).
France Under-20: Pierre Justes (US Dax); Kylan Hamdaoui (AS Montferrand), Xavier Mignot (CS Bourgoin-Jallieu), François Fontaine (AS Montferrand), Stephen Perez (FFR); Brandon Fajardo (FC Auscitain Armagnac), Baptiste Serin (Union Bordeaux Bègles); Oleg Ischenko (Montpellier HRC), Romain Ruffenach (Biarritz Olympique), Tommy Raynaud (RC Narbonne Méditerranée), Arthur Iturria (AS Montferrand), Jean-Baptiste Singer (AS Montferrand), Jean-Blaise Lespinasse (Union Bordeaux Bègles), François Cros (Stade Toulousain), Yacouba Camara (Stade Toulousain).
Replacements: Florian Ardiaca (AS Béziers Hérault), Youssef Amrouni (AS Montferrand), Hadrien Vaslin (La Rochelle), Felix Lambey (Lyon OU), Jean Thomas (US Colomiers), Anthony Meric (Stade Toulousain), François Bouvier (Stade Toulousain), Paulin Riva (FC Auscitain Armagnac).
Referee: Sean Gallagher (IRFU)