Randal Kolo Muani's ninth-minute opener put La Roja onto the back foot, before Lamine Yamal produced a spectacular long-range strike to pull his country level in the 21st minute.
The tournament's highest scorers then turned the game in their favour when Dani Olmo netted his third goal of Euro 2024 with the aid of Jules Kounde's deflection.
After showcasing their attacking quality in the first period, Spain demonstrated their defensive strength in the second half to protect their lead and advance to their first major tournament final since 2012.
HIGHLIGHTS
5th min: Yamal creates the game's first chance. The 16-year-old produces an inch-perfect cross to find the head of Fabian Ruiz, but the midfielder is unable to keep his effort on target.
9th min: GOAL! SPAIN 0-1 FRANCE (KOLO MUANI)
France strike first and it is their first goal from open play at Euro 2024. Just moments after Ruiz spurned his header, Kolo Muani rises high at the back post to nod in from Kylian Mbappe's lofted cross. Mbappe is playing without his face mask and it is obviously having the desired effect.
21st min: GOAL! SPAIN 1-1 FRANCE (YAMAL)
Just as France appear to be on top, Yamal conjures up a spectacular equaliser to pull his country level. The teenager sets the ball out of his feet to fire an unstoppable 25-yard strike off the inside of the post.
25th min: GOAL! SPAIN 2-1 FRANCE (OLMO)
Unbelievable drama! Navas's cross is headed as far away as Olmo. The RB Leipzig attacker neatly manoeuvres the ball to create the space to unleash a low shot to find the bottom corner despite Kounde's efforts to block the strike.
HALF TIME: SPAIN 2-1 FRANCE
52nd min: Tchouameni threatens. The Real Madrid midfielder wins the header from Ousmane Dembele's corner, but he can only guide his effort straight at Unai Simon.
76th min: France spurn a glorious opportunity. A loose ball breaks towards Theo Hernandez, who blazed his wayward shot over the bar with his weaker right foot.
81st min: Yamal attempts to recreate his first half-strike. The teenager curls the ball over the crossbar after showcasing his nimble footwork to carve out the room for a shot.
86th min: Was that the final chance? Mbappe drives into the box before cutting inside and firing harmlessly over Simon's crossbar.
FULL TIME: SPAIN 2-1 FRANCE
MAN OF THE MATCH - LAMINE YAMAL
Yamal produced a performance of an established star rather than that of a player who is just days from his 17th birthday.
The Barcelona youngster scored one of the greatest goals in European Championship history, while always posing a threat down Spain's right flank.
Yamal's confidence was exemplified when tried to recreate his first-half strike in the closing stages of the contest.
Although he could not add to his tally, the 16-year-old walked off the pitch as the star man after playing a crucial role in Spain's progression to the final
STANDOUT MOMENT
In the 25th minute, Yamal produced a goal-of-the-tournament contender to become the youngest player to score at the European Championship or World Cup, surpassing a record previously held by Brazilian great Pele.
The 16-year-old showed great skill and intelligence to quickly shift the ball right and then to the left, creating the room to curl a picturesque left-footed strike off the inside of the post.
Not only was it a stunning strike, but Yamal's effort turned the tide in Spain's favour, laying the foundation for Olmo to complete the turnaround just minutes later.
BEST STATS
MATCH STATS
Possession: SPAIN 58-42 FRANCE
Shots: SPAIN 6-9 FRANCE
Shots on target: SPAIN 2-3 FRANCE
Corners: SPAIN 4-6 FRANCE
Fouls: SPAIN 9-14 FRANCE
LINEUPS
SPAIN (4-2-3-1): Simon; Navas (Vivian 57'), Nacho, Laporte, Cucurella; Rodri, Ruiz; Yamal (Torres 90+4), Olmo (Merino 77'), Williams (Zubimendi 90+3'); Morata (Oyarzabal 77')
FRANCE (4-3-3): Maignan; Kounde, Upamecano, Saliba, Hernandez; Kante (Griezmann 62'), Tchouameni, Rabiot (Camavinga 62'); Dembele (Giroud 79'), Mbappe, Kolo Muani (Barcola 62')