Born in the Borough of Stockton-on-Tees, Johnson first represented Middlesbrough's Academy at under-9 level. He originally played as a defensive-midfielder but soon converted to the role of right-back and by July 2017, was invited by first team manager Garry Monk to train with the senior side. He was also a part of the Middlesbrough squad which competed in the 2015–16 UEFA Youth League.
On 31 August 2017, Johnson joined Accrington Stanley on a short-term loan, lasting until the end of January. He then made his debut for the club on 9 September 2017 in the EFL Trophy against Middlesbrough's U21 side, playing in a central-midfield role and receiving a yellow card in the 81st minute. He then went on the play the full 90 minutes in their next EFL Trophy tie, again playing in central-midfield, on 2 October 2017 against Blackpool at the Crown Ground.
On 5 January 2018, Johnson signed permanently with Accrington on a two and a half year contract for an undisclosed amount.
In September 2020 Johnson signed for Portsmouth. He scored his first goal for the club in an FA Cup tie against Bristol City on 9 January 2021 and has joined Fleetwood Town on loan for the rest of the 2021/22 season.