Arminia Bielefeld Cha started out at
Korea University before beginning his club career in Germany, starting at
Bayer Leverkusen, which he joined on 28 July 2002. However, he did not get straight into the first team at Bayer Leverkusen instead getting loaned out to
Arminia Bielefeld for the 2002–03 season. On 11 September 2002, he made his Arminia Bielefield debut in his first start, a 1–1 draw against
1. FC Kaiserslautern. Since then, Cha established himself in the first team at Arminia Bielefield. On 25 January 2003, he scored his first goal for the club, as well as setting up a goal, in a 2–2 draw against
Werder Bremen. Later in the 2002–03 season, Cha made 22 appearances and scored once for the club.
Eintracht Frankfurt Despite Arminia Bielefield's interest to keep him on for a second term, Cha opted to join
Eintracht Frankfurt instead on a two-year loan deal. Cha made his Eintracht Frankfurt debut in the opening game of the season, in a 3–1 loss against
Bayern Munich. Since making his debut for Eintracht Frankfurt, Cha began to play as a striker and remained in the first team despite struggling to score. On 22 February 2004, he scored his first Eintracht Frankfurt goal, in a 2–1 win over
Hertha BSC. After finishing the season, which saw the club relegated to
2. Bundesliga, Cha made 33 appearances and scored once in all competitions. Following this, he joined the club on a permanent basis in the summer, signing a two–year contract, keeping him until 2006. After missing a game at the start of the season due to international commitments, Cha's first game after signing for Eintracht Frankfurt on a permanent basis came on 15 August 2004, coming on as a substitute in the second half, in a 2–1 win over
Karlsruher SC. Cha scored his first goal on 22 September 2004, in a 4–2 win over
Greuther Fürth in the second round of the DFB-Pokal. By the end of 2004, Cha scored two more goals against
LR Ahlen on 26 October 2004 and against
Wacker Burghausen on 10 December 2004. Cha later scored six more goals later in the season against
Rot-Weiß Oberhausen,
SpVgg Unterhaching,
Erzgebirge Aue,
Eintracht Trier (twice) and
Rot-Weiß Erfurt. After helping the club achieve promotion back into the top flight, Cha went on to finish the 2004–05 season, making 32 appearances and scoring nine times in all competitions. In the 2005–06 season, Cha continued to be in the first team and scored his first goal of the season, right after he came on as a late substitute for
Christoph Preuß, in a 1–1 draw against
Hamburg on 17 September 2005. After suffering an injury that kept him out for weeks, Cha returned to the first team on 22 October 2005, in a 6–3 win over
1. FC Köln Cha then played in a right–back position on 9 December 2005 for the first time, in a 1–0 win over
Borussia Dortmund and scored against them again in their second meeting of the season, in a 1–1 draw on 6 May 2006. Though he lost his first team place during the season, Cha managed to regain it when he began to play in the right–back position for the rest of the season and was an unused substitute in the
final of DFB-Pokal, in a 1–0 loss against Bayern Munich. Despite this, Cha made 30 appearances and scored three times in all competitions.
Mainz 05 With his contract expiring at the end of the season at Eintracht Frankfurt, Cha joined
Mainz 05 on a free transfer on 14 May 2006, signing a two–year contract. After appearing as an unused substitute in the opening game of the season, Cha made his Mainz debut on 19 August 2006, where he made his first start, in a 1–1 draw against Borussia Dortmund. Before the
2006–07 season kicked off, Cha changed his position from striker to right wingback for Mainz 05 but throughout the season, he was hampered with a foot injury that prevented him from joining the starting line-up or even getting any playing time. Despite this, Cha went on to make thirteen appearances in all competitions at Mainz. After the 2006–07 season, Mainz 05 were relegated to
2. Bundesliga, and subsequently, Cha terminated his contract.
TuS Koblenz During the 2007 off-season, Cha signed on a free transfer with
TuS Koblenz in the
2. Bundesliga for the
2007–08 season. Cha made his debut for the club in the opening game of the season, where he played in midfield in a 4–1 loss against his former club, Mainz 05. He played in the roles of
right winger, supporting
striker, and the
centre forward position, after his failure to adjust to right wingback for
Mainz 05. On 23 November 2007, Cha scored his first Koblenz goal, right after coming on as a substitute, in a 2–0 win over
Wehen Wiesbaden. At the start of the 2008–09 season, Cha started the season well when he set up one of the goals, in a 3–0 win over Oberhausen in the opening game of the season. In a 4–1 win over Rot Weiss Ahlen on 28 November 2008, Cha provided a hat–trick of assists. Later in the 2008–09 season, Cha scored two more goals against
Hansa Rostock, and
MSV Duisburg.
SC Freiburg After two years at the club, Cha left
TuS Koblenz despite their attempts to keep him when his contract expired at the end of the 2008–09 season. and signed a contract for two years with
SC Freiburg. Cha made his Freiburg debut, where he made his first start and played the whole game, in a 1–1 draw against Hamburger SV in the opening game of the season. Cha scored his first goal for the club, which turned out to be the winning goal, in a 1–0 win over
Schalke 04. As the 2009–10 season progressed, Cha continued to remain in the first team until he suffered an injury that kept him out for the season. Cha finished his first season at Freiburg, making 25 appearances and scoring once in all competitions.
Celtic in 2010. Following interest from
Celtic, Cha arrived in Glasgow for a medical on 30 June 2010. In an interview regarding his move to Parkhead, Cha expressed his desire to compete in an
Old Firm derby. In doing so he joined up with his national teammate
Ki Sung-yueng. and on 14 August made his SPL debut against
Inverness Caledonian Thistle in a 1–0 win over the Highland side. Cha then scored his first Celtic goal against
St Johnstone in the SPL on 26 December 2010. However, international commitment and his own injury limited him to 21 appearances and one goal in all competitions in his first season at Celtic. In the 2011–12 season, Cha continued to struggle at the start of the season, due to his international commitment and his own injury concerns. Cha also faced competition with new signing
Adam Matthews at the right–back position. Cha scored an own goal in a
UEFA Europa League match against
Rennes, which resulted a 1–1 draw, after a
Benoît Costil kick was making its way harmlessly through to Fraser Forster but there appeared to be no communication between him and Cha Du-ri, who helped it on and then watched in horror as the ball slipped past the Hoops keeper and in to the net. Despite suffering an injury during international duties, Cha was given a handful of first team appearances following
Emilio Izaguirre's injury at the end of the year. On 25 March 2012, Cha was sent off in the
Old Firm derby, which Celtic lost 3–2. After serving a one match suspension, Cha returned to the first team on 22 April 2012 against
Motherwell and scored in a 3–0 win.
Fortuna Düsseldorf On 8 June 2012, Cha agreed a two-year contract with newly promoted
Bundesliga club
Fortuna Düsseldorf. In his last months at Celtic, Cha criticised the playing style of Scottish football, stating: "at Celtic we were expected to win every game and most of the time we managed it." Despite appearing as an unused substitute in a match against Wacker Burghausen in the first round of DFB–Pokal, which saw Fortuna Düsseldorf win 1–0, Cha was out of the squad for weeks, which was later revealed to be due to personal issues. On 22 September 2012, he made his Fortuna Düsseldorf debut, where he came on as a late substitute in a 0–0 draw against his former club, SC Freiburg. However, Cha who preferred defensive position didn't want to play as a forward for Düsseldorf, and sometimes took special leave due to family trouble. As a result, Cha was released by Fortuna Düsseldorf on 13 February 2013 despite having a year left on his contract.
FC Seoul On 25 March 2013, Cha agreed a two-year contract with
FC Seoul in
K League 1, marking his first time that he played professionally for a club in his home country. Cha made his Seoul debut on 14 April 2013, in a 1–1 draw against
Suwon Samsung Bluewings after missing out on the first two matches. After being suspended in the previous leg, Cha played in the
second leg of the AFC Champions League Final against
Guangzhou Evergrande, with Guangzhou Evergrande winning on away goals. Despite this, Cha finished his first season making 35 appearances in all competition. The 2014 season saw Cha continue to be a first team regular at the club and make an impressive display that would see him almost earn a spot for the World Cup in Brazil. He was eventually cut from the 23-man squad. Despite missing several matches, due to international commitments on two occasions, Cha made 37 appearances in all competitions and, at the end of the 2014 season, was named in the K League 1 Best XI. Cha was also shortlisted for K League 1 Most Valuable Player, but lost out to
Lee Dong-gook. Following this, Cha signed a new contract with the club, signing a one-year contract extension. The 2015 season saw Cha continued to be in the first team regular despite suffering from injuries. In May, Cha was appointed Seoul's new captain, succeeding
Koh Myong-jin, who departed for
Al-Rayyan. Cha scored his first Seoul goal on 11 July 2015, in a 3–1 loss against
Pohang Steelers.{{cite news |script-title=ko:서울 차두리, K리그 70경기 만에 첫 골…울산, 홈에서 광주에 0-1 패배 ==International career==