Oyarzabal's 22nd-minute penalty – his fifth goal of the tournament – coupled with Tottenham fullback Porro's assured second-half finish secured a 2-0 win for the European champions on Tuesday (Wednesday AEST) and denied Didier Deschamps a third successive final as his 14-year-old reign drew to a heartbreaking close.
"It's absolutely unbelievable when, as a child, you can't even dream about these things," Oyarzabal told reporters.
"There's just one more step to go with that final, so now we're just focused on that. We just want to win, and of course it's such a source of pride having reached so far ... We're making history and we just want to go one more step forward."
Spain, who will face either England or Argentina in New Jersey on Sunday (Monday AEST), extended their unbeaten run to a record-equalling 37 games on a night when Les Bleus' big names simply did not turn up.
"We were below our standards, we committed more technical flaws than before," Deschamps said.
"We know the skills of the Spanish team and to hope for victory, we should have been at our maximum. We gave it all and we were not, unfortunately, therefore we are extremely disappointed tonight."
Bradley Barcola, preferred to Desire Doue in Deschamps' starting line-up, served an early warning of intent down the left wing, while Spanish superstar Lamine Yamal sent in a deft 11th-minute cross which was smuggled away.
With star men Michael Olise, Ousmane Dembele and Kylian Mbappe largely subdued, favourites France were struggling to make an impression.
The four-time European champions went ahead with 22 minutes gone when, after Lucas Digne had brought down the onrushing Yamal inside the area as he tried to clear, Oyarzabal smashed the resulting penalty emphatically past keeper Mike Maignan.
The French were dealt a second blow on the half-hour when central defender William Saliba limped off gingerly with a back problem and was replaced by Maxence Lacroix, although they were briefly encouraged when Barcola cut inside and sent a 36th-minute shot over.
They might have fallen further behind within two minutes when Yamal played a one-two with Dani Olmo before picking out Fabian Ruiz, whose attempt was blocked by Dayot Upamecano.
Unai Simon had to race from his penalty area to intercept Adrien Rabiot's 42nd-minute through-ball for Mbappe, but the Spain keeper otherwise enjoyed an unexpectedly comfortable first half.
Luis de la Fuente's men picked up where they had left off after the break, to their opponents' mounting frustration.
Oyarzabal fired over on the turn and with Yamal starting to torment Digne, the 2010 winners remained on top and prompted Deschamps to replace Barcola with Doue 12 minutes into the second half in a desperate search for inspiration.
But Spain extended their lead within seconds, Porro exchanging passes with Olmo before lifting his shot over the helpless Maignan.
Marc Cucurella had to get a toe to Mbappe's 67th-minute attempt to protect Simon and substitute Ferran Torres headed wide at the other end 12 minutes from time as La Roja eased across the finishing line.
"As the captain, I have to take all the responsibility and I have no problem with that," Frenchman Mbappe said.
"We wanted to go to the final. We didn't go."
With the AP.