An injury-time goal from striker Georgios Samaras gave Celtic a historic first away win in the group stages of the Champions League.
Gary Hooper put the visitors in front on 12 minutes before tap-ins by Emmanuel Emenike either side of half-time put Spartak Moscow 2-1 up.
After Juan Insaurralde was sent off for a professional foul on Hooper, Dmitri Kombarov's own goal drew Celtic level.
Samaras headed home Emilio Izaguirre's cross in the 90th minute.
Neil Lennon's side now lie second in Group G on four points, with the Russians pointless after two matches.
The win, their first group stage victory on the road in 19 attempts, sets Celtic up for a double header against Spanish giants Barcelona, starting at Camp Nou on 23 October.
Spartak set their stall out early on and tried to catch their visitors off guard with a series of crosses and corners.
Emenike's double had given Spartak the lead
But Celtic endured the pressure and took the lead with their first attack of the game, started with Victor Wanyama's forceful play in midfield.
Mikael Lustig was released on the right and Hooper got in front of Nicolas Pareja to convert the Swede's low cross.
Lennon's side soon found themselves defending in numbers again, one drive from former Celtic winger Aiden McGeady diverted out for a corner.
But Spartak were vulnerable to counter attacks, with wide men Kris Commons and the fit-again Samaras able to make ground on the artificial surface.
Hooper had the ball in the net again with a header from a Samaras cross but the goal was ruled out for offside.
A free-kick around 25 yards out gave Spartak a chance to level but Pareja's curling effort was kept out by a diving Fraser Forster.
However, the home side's next attack produced the equaliser, Emenike scoring from close range after Ari cut the ball back from Kim Kallstrom's perfectly weighted ball in behind Kelvin Wilson.
Another close-range finish by Emenike edged the hosts in front just after the break.
Forster should perhaps have done better than parry Ari's low strike into the path of Demy de Zeuww, who turned the ball back across goal for Emenike to touch home.
Spartak went down to 10 men when Insaurralde's pull on Hooper eventually resulted in a red card for the Argentine defender, French referee Tony Chapron overturning his own decision to let play continue after taking advice from one of his assistants.
After Spartak had taken off midfielder de Zeuww and sent on Sergei Bryzgalov to shore up the defence, Charlie Mulgrew's effort from the resulting free-kick was punched away by Sergei Pesiakov.
Lennon also made a change, with James Forrest replacing Wanyama and playing a crucial role in Celtic's second.
Samaras dummied Mulgrew's cross for Hooper, who set up Forrest on the right-hand side of the box.
The winger's shot was blocked by a foot of keeper Sergei Pesiakov but ricocheted into the net off Kombarov.
Celtic continued to press and snatched a deserved victory when Samaras looped a header past Pesiakov.
Free kick awarded for a foul by Georgios Samaras on Dmitri Kombarov. Dmitri Kombarov restarts play with the free kick.
Corner taken left-footed by Kim Kallstrom.
Emilio Izaguirre provided the assist for the goal.
89:50 Goal scored
Goal - Georgios Samaras - Sp Moscow 2 - 3 Celtic Georgios Samaras grabs a headed goal from inside the box. Spartak Moscow 2-3 Celtic.
Assist by Emilio Izaguirre.
89:50 +0:02 Goal scored
Goal - Georgios Samaras - Sp Moscow 2 - 3 Celtic Georgios Samaras scores a headed goal from inside the area. Spartak Moscow 2-3 Celtic.
The ball is crossed by Emilio Izaguirre,
Artem Dzjuba challenges Emilio Izaguirre unfairly and gives away a free kick. Kris Commons restarts play with the free kick.
Gary Hooper takes a shot. Save by Sergei Pesiakov.
Substitution Alexandr Kozlov comes on in place of Ferreira Ari.
Shot by Joe Ledley. Save by Sergei Pesiakov. Outswinging corner taken from the right by-line by Kris Commons, save made by Sergei Pesiakov.
James Forrest sends in a cross, clearance by Yevgeni Makeev.
Ferreira Ari gives away a free kick for an unfair challenge on Emilio Izaguirre. Fraser Forster restarts play with the free kick.
Substitution Charlie Mulgrew leaves the field to be replaced by Joe Ledley.
The ball is crossed by Dmitri Kombarov, save made by Fraser Forster.
Kris Commons is flagged offside by the assistant referee. Free kick taken by Nicolas Pareja.
Free kick awarded for a foul by Emilio Izaguirre on Emmanuel Emenike. Direct free kick taken by Pereira Rafael Carioca.
Outswinging corner taken from the left by-line by Kris Commons.
Substitution Artem Dzjuba on for Aiden McGeady.
Scott Brown produces a right-footed shot from just outside the area that goes harmlessly over the bar.
Corner taken left-footed by Kris Commons, Nicolas Pareja makes a clearance.
The ball is delivered by Gary Hooper, Nicolas Pareja manages to make a clearance.
70:27 Goal scored
Goal - Dmitri Kombarov - Sp Moscow 2 - 2 Celtic An unfortunate own goal is conceded by Dmitri Kombarov. Spartak Moscow 2-2 Celtic.
James Forrest takes a shot. Save made by Fraser Forster.
Corner taken by Kris Commons from the left by-line, save by Sergei Pesiakov.
Substitution (Celtic) makes a substitution, with James Forrest coming on for Victor Wanyama.
The ball is sent over by Emilio Izaguirre, Aiden McGeady gets a block in.
Charlie Mulgrew fires a strike on goal direct from the free kick, Sergei Pesiakov makes a save.
Substitution Sergey Bryzgalov on for Demy De Zeeuw.
Dismissal Juan Insaurralde shown a red card for professional foul.
Free kick awarded for an unfair challenge on Gary Hooper by Juan Insaurralde.
Unfair challenge on Georgios Samaras by Juan Insaurralde results in a free kick. Centre by Charlie Mulgrew, Headed effort from deep inside the penalty area by Efe Ambrose goes harmlessly over the crossbar.
Aiden McGeady produces a cross.
Kelvin Wilson fouled by Ferreira Ari, the ref awards a free kick. Fraser Forster takes the direct free kick.
Juan Insaurralde fouled by Scott Brown, the ref awards a free kick. Sergei Pesiakov takes the direct free kick.
Ferreira Ari has an effort at goal from outside the penalty area which goes wide right of the goal.
Demy De Zeeuw provided the assist for the goal.
47:10 Goal scored
Goal - Emmanuel Emenike - Sp Moscow 2 - 1 Celtic Emmanuel Emenike gets on the score sheet with a goal from close in to the bottom right corner of the goal. Spartak Moscow 2-1 Celtic.
Ferreira Ari takes a shot. Save by Fraser Forster. A cross is delivered by Demy De Zeeuw,
Gary Hooper concedes a free kick for a foul on Juan Insaurralde. Juan Insaurralde takes the direct free kick.
The referee blows his whistle to start the second half.
45:00 +1:22 Half time
Half Time The whistle is blown to end the first half.
Kim Kallstrom challenges Kelvin Wilson unfairly and gives away a free kick.
Kim Kallstrom takes the inswinging corner, clearance by Charlie Mulgrew.
Corner from left by-line taken by Kris Commons.
Georgios Samaras produces a cross, clearance by Nicolas Pareja.
The assist for the goal came from Ferreira Ari.
40:34 Goal scored
Goal - Emmanuel Emenike - Sp Moscow 1 - 1 Celtic Emmanuel Emenike grabs a goal from close in low into the middle of the goal. Spartak Moscow 1-1 Celtic.
Free kick awarded for a foul by Georgios Samaras on Demy De Zeeuw. Demy De Zeeuw restarts play with the free kick.
Corner taken left-footed by Kim Kallstrom from the left by-line, clearance made by Charlie Mulgrew.
Efe Ambrose concedes a free kick for a foul on Emmanuel Emenike. Nicolas Pareja produces a shot on goal direct from the free kick, Fraser Forster makes a save.
Free kick awarded for a foul by Juan Insaurralde on Gary Hooper. Kris Commons produces a cross, Georgios Samaras takes a shot. Save by Sergei Pesiakov.
Effort from outside the penalty area by Charlie Mulgrew goes wide left of the goal.
Demy De Zeeuw gives away a free kick for an unfair challenge on Kris Commons. Free kick taken by Mikael Lustig.
Yevgeni Makeev sends in a cross, Emmanuel Emenike produces a header from inside the area that goes over the crossbar.
Charlie Mulgrew fouled by Nicolas Pareja, the ref awards a free kick. Free kick crossed left-footed by Charlie Mulgrew from left wing, clearance by Kim Kallstrom.
Free kick crossed by Kim Kallstrom.
Booking Victor Wanyama receives a caution.
Unfair challenge on Demy De Zeeuw by Victor Wanyama results in a free kick.
Kris Commons has an effort at goal from outside the box missing to the wide left of the goal.
Free kick awarded for a foul by Nicolas Pareja on Scott Brown. Victor Wanyama takes the free kick.
Dmitri Kombarov crosses the ball, Emmanuel Emenike takes a shot.
The ball is crossed by Mikael Lustig, Pereira Rafael Carioca manages to make a clearance.
Corner taken by Kim Kallstrom from the right by-line to the near post, clearance made by Kris Commons.
The ball is sent over by Aiden McGeady, Emilio Izaguirre gets a block in.
The ball is sent over by Georgios Samaras. The assistant referee flags for offside against Gary Hooper. Free kick taken by Sergei Pesiakov.
Nicolas Pareja takes the free kick.
Booking Charlie Mulgrew is cautioned by the ref for unsporting behaviour.
Charlie Mulgrew gives away a free kick for an unfair challenge on Demy De Zeeuw.
Foul by Scott Brown on Ferreira Ari, free kick awarded. Dmitri Kombarov takes the free kick.
Aiden McGeady takes a shot. Kelvin Wilson gets a block in. Corner taken short by Kim Kallstrom.
Victor Wanyama is adjudged to have handled the ball. Kim Kallstrom takes the free kick.
Victor Wanyama gives away a free kick for an unfair challenge on Emmanuel Emenike. The free kick is delivered left-footed by Kim Kallstrom from right channel, Mikael Lustig manages to make a clearance.
Corner taken left-footed by Kim Kallstrom, Nicolas Pareja has a headed effort at goal from close in which goes wide of the left-hand upright.
Mikael Lustig provided the assist for the goal.
11:51 Goal scored
Goal - Gary Hooper - Sp Moscow 0 - 1 Celtic Gary Hooper finds the back of the net with a goal from inside the six-yard box to the bottom left corner of the goal. Spartak Moscow 0-1 Celtic.
Mikael Lustig sends in a cross,
Dmitri Kombarov sends in a cross, Fraser Forster makes a comfortable save.
Free kick awarded for an unfair challenge on Scott Brown by Kim Kallstrom. Mikael Lustig restarts play with the free kick.
Shot on goal by Kim Kallstrom from inside the box goes harmlessly over the target.
Outswinging corner taken by Kim Kallstrom from the left by-line.
A cross is delivered by Ferreira Ari, clearance by Victor Wanyama.
Inswinging corner taken right-footed by Aiden McGeady, Kelvin Wilson manages to make a clearance.
Dmitri Kombarov sends in a cross, clearance made by Efe Ambrose.
Kim Kallstrom decides to take the corner short.
The referee gets the match started.
Live text and data provided by The Press Association
This page is best viewed in an up-to-date web browser with style sheets (CSS) enabled. While you will be able to view the content of this page in your current browser, you will not be able to get the full visual experience. Please consider upgrading your browser software or enabling style sheets (CSS) if you are able to do so.