Conti was born and raised in Lecco, Lombardy. In 2002, he had a successful trial at A.C. Milan yet refused to join the team due to his dislike of the club's youth training center in Linate area of the city, as well as its far-from-home location. He also had an offer from the club's cross-city rivals, Inter Milan, yet eventually joined Atalanta's youth academy where he would play together with Mattia Caldara and Roberto Gagliardini for over a decade. In July 2013, Conti was loaned to Lega Pro side Perugia. He made his professional debut on 4 August 2013, starting in a 0–1 Coppa Italia home loss against Savona. His first league appearance occurred later that month, a 2–2 away draw against Nocerina. Conti made 16 league appearances, helping his team achieve promotion to Serie B. On 10 July 2014, Conti moved to a fellow second-tier team Virtus Lanciano, in a season-long loan deal. Conti made 24 league appearances while his team finished 14th out of 22. In the summer of 2015, he returned to Atalanta and was included in the first team squad for the upcoming Serie A season. On 30 September 2015, Conti signed a new contract with Atalanta until July 2019. He made his debut for the club on 2 December, in a 1–3 loss against Udinese in Coppa Italia. Conti made his debut in Serie A on 6 January 2016, in a 1–2 loss against the same opponent. His first goal in the competition occurred on 3 February, in a 2–1 win against Verona. Conti managed to score 8 goals in 33 appearances during the 2016–17 Serie A season, setting a personal record for scoring. His main playing position was a right wing-back in a 3–4–3 formation.
Milan
On 7 July 2017, Conti joined Milan in exchange for a reported fee of €24 million, plus Matteo Pessina. He made his debut for the club on 27 July 2017, replacing Ignazio Abate as a second-half substitute in the 2017–18 UEFA Europa League qualification away game against CS U Craiova. He made his league debut in the 3–0 away win against Crotone on 20 August 2017. On 15 September 2017, during A.C. Milan's training session, Conti suffered an injury to his left anterior cruciate ligament. Having undergone knee surgery, he was in recovery until March 2018. However, shortly after resuming training and playing a few matches with the reserves, Conti suffered a recurring ACL injury that sidelined him for the rest of the year. On December 22, 2018, Conti made his highly anticipated return to the pitch, coming on as a substitute for Ignazio Abate eleven minutes before the final whistle in a 0–1 home Serie A defeat against Fiorentina. Before the end of the season, he appeared in 14 more games and made 3 assists. Despite the two unsuccessful seasons in Milan, Conti declined transfer offers from Parma and Werder during the summer of 2019, opting to stay at the club and work with its new head coach Marco Giampaolo.
Conti can play as a right-back or a right wing-back, although he is more comfortable in the latter position. Gifted with a great pace, he thrives going forward and making overlapping runs. He excels at staying wide and crossing but also has a knack for getting into the box and scoring himself. His great stamina allows him to make attacking runs and rapidly get back into defense when needed.