Cresce nel vivaio del Milan, dove compie la trafila delle formazioni giovanili senza tuttavia arrivare a esordire in prima squadra.[4] Nel 1989 la società rossonera lo cede infatti all'Atalanta, dove milita per le successive quattro stagioni, e con cui nel 1993 fa il suo debutto in nazionale. Considerato in questa fase tra i più promettenti elementi italiani,[4][5] nell'estate dello stesso anno passa alla Juventus che, per assicurarselo, sborsa 11 miliardi di lire:[6] una cifra considerevole per l'epoca, se rapportata al ruolo, e che per il difensore finirà per essere, a posteriori, «zavorra e macigno» nel prosieguo di carriera.[7]
A Torino colleziona infatti 87 presenze e 3 gol in quattro anni, senza tuttavia riuscire ad affermarsi stabilmente nell'undici base – «ha giocato molto ma senza partire mai titolare, senza la sicurezza di chi ce l'ha fatta» –, anche per la concorrenza di più quotati elementi;[7] in maglia bianconera contribuisce comunque alle vittorie di due scudetti nelle stagioni 1994-1995 e 1996-1997, della Coppa Italia 1994-1995 – dov'è protagonista nella doppia finale contro il Parma, segnando ai ducali sia nell'andata al Delle Alpi sia nel ritorno al Tardini[8] –, di due Supercoppe di Lega e, in ambito internazionale, ai trionfi del 1996 in Champions League, Coppa Intercontinentale e Supercoppa UEFA – in quest'ultimo caso, aprendo le marcature nella sfida di andata vinta in goleada 6-1 sul Paris Saint-Germain al Parco dei Principi.[9]
Desideroso di un'esperienza all'estero,[7] nel 1997 lascia l'Italia per la Scozia, accasandosi ai Rangers che lo acquistano per 8 miliardi di lire.[10] Rimane a Glasgow per quattro stagioni, vincendo tutte le competizioni nazionali, per poi tornare nei campionati italiani nel 2001.
Gioca quindi un anno nell'Alessandria e due nel Padova, prima di approdare nel 2004 al Pizzighettone, dove nel giugno 2009 conclude la propria carriera da calciatore.
Nazionale
Durante la sua militanza nell'Atalanta è stato convocato in nazionale dal commissario tecnico Arrigo Sacchi per tre partite di qualificazione al Mondiale 1994, scendendo in campo in due occasioni: dopo aver esordito il 24 marzo 1993 nel 6-1 contro Malta, nel mese successivo ha ottenuto la seconda e ultima presenza nel 2-0 sull'Estonia.
Allenatore
Dall'estate del 2009 ha iniziato la carriera di allenatore. Nella stagione 2009-2010 ha guidato la formazione Juniores Nazionali del Pizzighettone. Nell'agosto 2010 diventa il tecnico della formazione Berretti del Pergocrema, iscritta al campionato Berretti.
A fine stagione, segue il corso indetto dal Settore Tecnico della FIGC conseguendo la qualifica di Allenatore Professionista di Seconda Categoria-UEFA A.[11] Il 2 agosto 2011 ottiene la sua prima panchina in una prima squadra venendo nominato tecnico della Colognese, formazione militante in Serie D.[12] Il 27 novembre dello stesso anno si dimette dalla carica, anche a seguito delle controverse vicende societarie che coinvolgono il club bergamasco; richiamato dalla vecchia proprietà, nel gennaio 2012 torna in panchina per cercare di raggiungere la salvezza: la squadra risale dall'ultimo posto, ma non riesce a evitare i play-out poi persi contro il Seregno.
Il successivo 12 giugno viene ufficializzato il suo ingaggio come allenatore del Ponte San Pietro, ancora nella massima categoria dilettantistica.[13] Il 10 dicembre 2012, intanto, inizia a frequentare a Coverciano il corso di abilitazione per il master di allenatori professionisti Prima Categoria-UEFA Pro.[14] Il 7 giugno 2013 prende la guida la formazione Allievi dell'Atalanta.[15] Il 4 marzo 2015 viene nominato vice di Edoardo Reja nella prima squadra orobica;[16] nella stagione 2015-2016 rimane nello staff di Reja come collaboratore tecnico.
Il 7 ottobre 2016 viene ingaggiato dal Crema come allenatore della prima squadra.[17] A fine stagione, grazie alla vittoria del campionato lombardo di Eccellenza conquista la promozione in Serie D, categoria da cui i nerobianchi mancavano da 22 anni.[18] Il 12 dicembre 2017 rassegna le dimissioni per motivi personali.[19] L'8 dicembre 2018 torna su una panchina di Serie D, subentrando a stagione in corso alla guida del Ciserano;[20] la sua permanenza nel club bergamasco dura tuttavia solo pochi mesi, dimettendosi il 17 marzo 2019.[21]
Pochi mesi dopo torna a lavorare con Reja, il quale lo chiama nel ruolo di suo vice sulla panchina della nazionale albanese.[22] Il 2 marzo 2023 segue il tecnico friulano al Gorica, squadra ultima in classifica nel campionato di massima serie slovena;[23] il successivo 17 aprile la società, ancora sul fondo della graduatoria, interrompe consensualmente il rapporto con l'allenatore e il suo staff.[24]
Nel marzo 2024 entra a far parte dello staff tecnico dell'Ascoli, assumendo il ruolo di vice del neoallenatore Massimo Carrera, con cui aveva giocato insieme ai tempi della Juventus.[25] Il 27 settembre 2024, viene esonerato insieme a Carrera.[26]