Bennett was born in Rochdale, Greater Manchester but moved to the North East when he was 10. He attended Great Ayton primary school and Stokesley Secondary School. He was spotted by Boro scouts while playing for Hungry Jacks of Northallerton as a schoolboy. However, he suffered a setback when being essentially dropped by Boro when in the Under-15s. He had an unsuccessful trial with Newcastle United and after a year back in Sunday league football he was signed on again at the Riverside.
Following some impressive performances in the reserves and the pre-season, Bennett secured a two-year professional deal and named in the senior squad for the first time. His progress continued and after appearing in the summer Algarve tournament he was named on the bench for a number of Premier League fixtures. He made his first team debut away to West Ham United in the final game of the 2008–09 season and he was handed a new three-year contract extension in August 2009.
Now a member of the first team, Bennett made his first appearance for the 2009–10 season in the away loss at Nottingham Forest in the League Cup, coming on as a substitute in extra time and started his first match, at left back, away at Coventry City. During Gordon Strachan's era as manager at Middlesbrough, Bennett admitted to feeling down with his football. He asked to leave the club on loan but his request was turned down. The arrival of Tony Mowbray saw him become a regular in the first 11, as Mowbray sought Bennett to play a Clichy/Cole role at Middlesbrough. Bennett signed a new 4 and a half-year deal in January 2011, extending his stay until June 2015.
On 29 August 2012, after making 84 starts for Middlesbrough in 4 years at the Riverside Stadium, Joe Bennett completed his transfer to Premier League club Aston Villa. The Daily Mail newspaper reported the fee to be £2.75 million. In an interview with the official Aston Villa website Bennett stated this was a dream come true in joining a massive club with a massive fanbase in Aston Villa and was looking forward to playing in front of the Villa Park crowd. He made his debut on 22 September 2012, coming on as a substitute for Eric Lichaj against Southampton. He scored his first goal for the club against Notts County in the League Cup on 25 August 2015.
On 21 August 2014, Bennett joined Brighton & Hove Albion on a season-long loan. He returned to Villa at the end of the season.
Bennett began the 2015–16 season at Aston Villa, making a single appearance in the League Cup against Notts County, scoring his first goal for the club in a 5–3 win. He was loaned to newly promoted Bournemouth but returned in January without making an appearance and then joined Sheffield Wednesday on 19 January 2016 for the rest of the season. He made his debut against Shrewsbury Town on 30 January, where Wednesday were knocked out of the FA Cup and went on to make 4 appearances as Wednesday made the play-offs, losing in the final against Hull City. Bennett enter talks over a permanent move over to Hillsborough, following his return to Aston Villa. The move was later blocked by new Villa owner, Tony Xia, which he insisted was for financial reasons.
On 27 August 2016, Bennett joined fellow Championship side Cardiff City on a free transfer. After suffering a calf injury, Bennett was forced to wait two months before making his debut in a Severnside derby against Bristol City on 14 October. His first goal for Cardiff came on 18 March 2017, in a 3–1 win over Ipswich Town and he concluded the season, with a brace against Huddersfield Town on the final day.
During the summer of 2017, fellow Championship side Fulham met a release clause in Bennett's contract, however, he rejected the move to stay in the Welsh capital.
Bennett was part of the England under-19 squad at the 2009 European Championships in Ukraine in the summer of 2009. During the group stage matches, he started out on the bench but earned a place in the starting eleven after some strong performances and started in the last group stage match, the semifinal and final. He was due to participate in the 2009 FIFA U-20 World Cup but did not because of club commitments. Bennett received his first U-21 call up after a series of impressive first team performances on 2 February 2011. He went into the squad for the game against Italy U21s.As of 16 September 2017.