Kim played for FC Seoul (formerly Anyang LG Cheetahs), where he made his professional debut in 2000, and he made 119 league appearances for the K-League club.
On 28 June 2006, he transferred to Zenit Saint Petersburg, following coach Dick Advocaat and Korean teammate Lee Ho. In Zenit, both his performance and reputation grew steadily, making him the key side defender in the starting lineup. He helped Zenit to achieve their first Russian Premier League title and most reputably the UEFA Cup. His outstanding improvement in his club and national team brought his reputation as the best left-back in the current Korean squad. On 26 January 2010 Zenit Saint Petersburg terminated his contract based on results of the medical examinations and fainting spells experienced during practices with the national team.
On 2 February 2010, He moved to K-League side Ulsan Hyundai after another medical check-up that found he was healthy enough to play.
He was a left midfielder of the South Korean 2004 Olympic football team, and helped Korea finish second in Group A by scoring one goal (against Greece) and two assists (both against Mali), consequently advancing to the next round. However, they were stopped by the silver medalist Paraguay.
In 2004, Kim's performance against Germany while under Johannes Bonfrere secured him the leftback or left midfield position (depending on the formation that was usually 4–3–3 or 3–4–3), which originally belonged to Lee Young-Pyo. However, as Advocaat became the new manager of South Korea in November 2005, both Lee and Kim had to compete for the position. Since the two players proved to be highly influential to the national team, both players were rotated for the left back position during 2006 FIFA World Cup.
During the 2008 Olympics, he was summoned to join South Korea U-23 squad as a wild card. Despite his solid performance and a winning goal scored in the last game against Honduras, his team was eliminated in the first round.