Froome attacked within the final 800m of the steep climb to Cumbre del Sol from a group of GC hopefuls, with no-one immediately able to follow.
Esteban Chaves (Orica-Scott) made chase shortly after with Michael Woods (Cannondale-Drapac), and it looked briefly like the they would catch and possibly pass Froome.
But as the road continued to rise, Froome was able to dig again and burst away towards the line, eventually claiming victory and the 10 second bonus with a comfortable gap.
Chaves rolled over the line in second and Woods just behind. Froome now leads the Vuelta by 36 seconds over Chaves, with everyone else over a minute behind at the end of the first week of racing.
How it happened
The stage would ultimately be decided on the final ascent to Cumbre del Sol and it’s 20 per cent ramps, which gave no incentive for the peloton to get the racing going early on the rolling coastal roads of the Costa Blanca.
Nevertheless, the GC contenders were clearly keen on fighting it out for the stage and, unlike recent stages, kept the breakaway within reach for the majority of the stage.
The group of Markel Irizar (Trek-Segafredo), Marc Soler (Movistar), Marco Haller (Katusha-Alpecin), Bert-Jan Lindeman (LottoNL-Jumbo), Tobias Ludvigsson (FDJ), Anthony Turgis (Cofidis), Lluis Mas and Diego Rubio (Caja Rural-Seguros RGA), Conor Dunne (Aqua Blue Sport) and Ricardo Vilela (Manzana Postobon) were the ones to get away, only reaching a maximum gap of around 3-40.
Cannondale-Drapac, on the stage following the announcement that the team may not continue in 2018, did much of the work on the front as they set things up for Michael Woods.
Things remained the same until the first ascent of Cumbre del Sol split them apart with 45km to go, with Ludvigsson and Soler the two remaining out front with 1-55 on the peloton.
The rode well together to hold a gap of 30 seconds on the bunch as they rode a loop around and back to the foot of the climb, but were inevitably unable to hold off the chasing bunch.
Ludvigsson called it quits with 6.1km to go as the peloton loomed, though Soler didn’t last long on his own and was caught with 5.8km to go.
Sky then accelerated the pace to the bottom of the climb, with the GC riders remaining together on the early slopes.
Romain Bardet (Ag2r La Mondiale), over nine minutes down on GC at the start of the day, attacked first and was followed by Enric Mas (Quick-Step Floors) and Richard Carapaz (Movistar) with 3.3km to go.
Carapaz attacked with 2.3km from Mas and Bardet, before being pulled back. Bardet tried again and was caught with 1.3km, eventually leaving it down to the GC riders to fight it out.
No-one moved as they rode under 1km to go, with David de la Cruz (Quick-Step) the first to accelerate as they made a tight left hand turn with around 850m to go.
As he moved over, Froome seized his chance and accelerated with Alberto Contador (Trek-Segafredo) attempting to jump onto his wheel but immediately fading.
It was then a show of dominance from Froome as no-one was able to get past him again. The Brit managed to avoid making the same error that saw him lose the same stage to Tom Dumoulin in 2015, holding off Chaves to take victory.
The Vuelta heads into its first rest day on Monday, before taking on another mountain route over 164.8km from Caravaca Jubilar to Elpozo Alimentacion.
Vuelta a España 2017, stage nine: Orihuela – Cumbre del Sol (174km)
1 Christopher Froome (GBr) Team Sky, in 4-07-13
2 Johan Esteban Chaves Rubio (Col) Orica-Scott, at 4s
3 Michael Woods (Can) Cannondale-Drapac, at 5s
4 Wilco Kelderman (Ned) Team Sunweb, at 8s
5 Ilnur Zakarin (Rus) Katusha-Alpecin, st
6 Alberto Contador Velasco (Spa) Trek-Segafredo, at 12s
7 David de la Cruz (Esp) Quick-Step Floors
8 Sam Oomen (Ned) Team Sunweb, all same time
9 Nicolas Roche (Irl) BMC Racing Team, at 14s
10 Vincenzo Nibali (Ita) Bahrain-Merida, st
General classification after stage nine
1 Christopher Froome (GBr) Team Sky, in 36-33-16
2 Johan Esteban Chaves Rubio (Col) Orica-Scott, at 36s
3 Nicolas Roche (Irl) BMC Racing Team, at 1-05
4 Vincenzo Nibali (Ita) Bahrain-Merida, at 1-17
5 Tejay van Garderen (USA) BMC Racing Team, at 1-27
6 David de la Cruz (Spa) Quick-Step Floors, at 1-30
7 Fabio Aru (Ita) Astana Pro Team, at 1-33
8 Michael Woods (Can) Cannondale-Drapac, at 1-52
9 Adam Yates (GBr) Orica-Scott, at 1-55
10 Ilnur Zakarin (Rus) Katusha-Alpecin, at 2-15