- Gianluca Mancini (53')
- Moise Kean (90')
Roma, who became the first Serie A side to be beaten by lowly Cremonese on Tuesday, have now won five home games in a row without conceding a goal.
Juventus had their first attempt on target in the fourth minute when forward Dusan Vlahovic latched on to Angel Di Maria's lofted free kick, but his first-time effort was saved by Roma keeper Rui Patricio.
With little action inside or around either of the boxes, Juventus midfielder Manuel Locatelli tried a brilliant long-range strike in the 42nd minute but failed to surprise Patricio, who made a save.
Two minutes later, Adrien Rabiot's cheeky header was deflected by Patricio with his knee on to the post, maintaining the scoreline goalless at half-time.
In a clash which sprang to life after the break, Mancini sealed the win for Roma in the 53rd minute, sending a powerful low shot into the bottom left corner and leaving Szczesny no chance.
Juventus, who conceded a goal from outside the box in Serie A for the first time since May 2022, could have bounced back just before the hour mark, but Juan Cuadrado's powerful free kick hit the left post.
Di Maria had another chance from a distance in the 78th but Patricio stopped it from going into the top corner. Minutes later, Di Maria's free kick hit Roma's defensive wall.
Juventus, who had multiple chances to level the score, were left with 10 men just before full-time when Kean kicked out at Mancini, after the Roma player had grabbed his shirt in a tussle, and got a straight red card one minute after coming on.
Patricio made a victory-rescuing save eight minutes into stoppage time when he dived to stop a low effort by Juventus defender Danilo.
Juventus, who got six wins with a clean sheet from their previous seven away Serie A games, dropped one place to eighth on 35 points, seven behind sixth-placed Atalanta, who occupy the last European spot.
- Fabio Maresca