JWT 기반 클라이언트 인증

Jiwon Yoo·2023년 8월 30일
0

프론트엔드

목록 보기
29/38

JWT란?

인증에 필요한 정보들을 암호화시킨 JSON 토큰

JWT 기반 인증은 JWT 토큰(Access Token)을 HTTP 헤더에 실어 서버가 클라이언트를 식별하는 방식이다.

JWT는 JSON 데이터를 Base64 URL-safe Encode 를 통해 인코딩하여 직렬화한 것이며, 토큰 내부에는 위변조 방지를 위해 개인키를 통한 전자서명도 들어있다. 따라서 사용자가 JWT 를 서버로 전송하면 서버는 서명을 검증하는 과정을 거치게 되며 검증이 완료되면 요청한 응답을 돌려준다.

JWT는 . 을 구분자로 나누어지는 Header, Payload, Signature 세 가지 문자열의 조합이다.

Header 에는 JWT 에서 사용할 타입과 해시 알고리즘의 종류와 토큰 유형이 담긴다.

Payload

Payload에는 서버와 클라이언트가 주고받는 시스템에서 실제로 사용될 정보에 대한 내용을 담고 있다.

Signature

Signature의 구조는 Header + Payload와 서버가 갖고 있는 유일한 key 값을 합친 것을 Header에서 정의한 알고리즘으로 암호화를 한다.

Header와 Payload는 단순히 인코딩된 값이기 때문에 제 3자가 복호화 및 조작할 수 있지만, Signature는 서버 측에서 관리하는 비밀키가 유출되지 않는 이상 복호화할 수 없다. 따라서 Signature는 토큰의 위변조 여부를 확인하는데 사용된다.

JWT 기반 클라이언트 인증

  1. 사용자가 ID, PW를 입력하여 서버에 로그인 인증을 요청한다.
  2. 서버에서 클라이언트로부터 인증 요청을 받으면, Header, PayLoad, Signature를 정의, 각각 Base64로 한 번 더 암호화하여 JWT(accessToken, refreshToken)를 생성해 클라이언트에게 발급한다.
  3. 클라이언트는 서버로부터 받은 JWT를 저장한다. (쿠키, 로컬스토리지 등) 그리고 API를 서버에 요청 시, Header에 accessToken을 담아서 보낸다.
  4. 서버는 클라이언트가 Header에 담아서 보낸 JWT가 내 서버에서 발행한 토큰인지 일치 여부를 확인하여 일치한다면 인증을 통과시켜주고 아니라면 통과시키지 않는다. 인증이 통과되면 알맞은 응답을 전달하고, 일치하지 않는다면 에러 메세지 등 그에 맞는 처리를 한다.
  5. accessToken이 만료되면 클라이언트는 refreshToken을 Header에 담아서 서버에 accessToken 재발급 요청을 보낸다.
  6. 서버로는 새로운 accessToken을 발급한다.

JWT의 Access Token / Refresh Token

JWT도 토큰 탈취의 위험성이 있기 때문에 Access Token, Refresh Token 으로 이중으로 나누어 인증을 하는 방식을 많이 사용한다.

Access Token : 클라이언트가 갖고있는 실제로 유저의 정보가 담긴 짧은 수명의 토큰. 클라이언트에서 요청이 오면 서버에서 해당 토큰에 있는 정보를 활용하여 사용자 정보에 맞게 응답을 진행
Refresh Token : 새로운 Access Token을 재발급해주기 위해 사용하는 토큰.

profile
새싹 개발자 🌱

0개의 댓글