JWT

정민준·2022년 6월 6일
0

JWT(JSON Web Token)

JWT(JSON Web Token)는 인증에 필요한 정보들을 암호화시킨 토큰이다.

JWT 기반 인증은 쿠키/세션 방식과 유사하게 JWT 토큰(Access Token)을 HTTP 헤더에 실어 서버가 클라를 식별한다.

JWT의 구조는 위 사진과 같이 세가지 문자열의 조합이다. 실제 디코딩된 JWT는 Header, Payload, Signature로 이루어져 있다.

Header는 alg와 typ을 갖고 있다.
alg는 정보를 암호화할 해싱 알고리즘을, typ는 토큰의 타입을 지정한다.

{
	"alg": "HS256",
	"typ": "JWT"
}

Payload

Payload는 실제로 토큰에 담을 정보를 지니고 있다.
주로 클라이언트 고유 ID, 유효 기간 등이 포함된다.
Key-Value 형식으로 이루어진 한 쌍의 정보를 Claim이라고 한다.

	"sub": "1234567890",
	"name": "John Doe",
	"iat": 1516230922
}

Signature

Signature는 인코딩된 Header와 Payload를 더한 뒤, 비밀키로 해싱하여 생성한다.

Header 및 Payload는 단순 인코딩된 값이기 때문에 해커가 복호화하고 조작할 수 있지만, Signature는 서버 측에서 관리하는 비밀키가 유출되지 않는 이상 복호화할 수 없다.

따라서 Signature는 토큰의 위변조 여부를 확인하는 데 사용된다.

	base64UrlEncode(header) + "." +
	base64UrlEncode(payload),
	secret_key
)

토큰 인증 과정

클라이언트 로그인 요청이 들어오면, 서버는 검증 후 클라이언트 고유 ID등의 정보를 Payload에 담는다.
암호화할 비밀키를 사용해 Access Token(JWT)을 발급한다.
클라이언트는 전달받은 토큰을 저장해두고, 서버에 요청할 때마다 토큰을 요청 헤더 Authorization에 포함시켜 함께 전달한다.
서버는 토큰의 Signature 을 비밀키로 복호화한 다음, 위변조 여부 및 유효 기간 등을 확인한다.
유효한 토큰이라면 요청에 응답한다.

토큰의 장점

  • Header와 Payload를 가지고 Signature를 생성하므로 데이터 위변조를 막을 수 있다.
  • 인증 정보에 대한 별도의 저장소가 필요 없다. (I/O 처리 필요 없음)
  • JWT는 토큰에 대한 기본 정보와 전달할 정보 및 토큰이 검증됐음을 증명하는 서명 등
    필요한 모든 정보를 자체적으로 지니고 있다.
  • 클라이언트의 인증 정보를 저장하는 세션과 다르게, 서버는 무상태(Stateless)가 된다.
    확장성이 우수하다.
  • 토큰 기반으로 다른 로그인 시스템에 접근 및 권한 공유가 가능하다. (토큰 서버 활용)
  • 토큰 기반으로 다른 로그인 시스템에 접근 및 권한 공유가 가능하다.
  • OAuth의 경우 Facebook, Google 등 소셜 계정을 이용해 다른 웹서비스에서도 로그인 할 수 있다.
  • 모바일 어플리케이션 환경에서도 잘 동작한다.

토큰의 단점

  • 쿠키, 세션과 다르게 JWT는 토큰의 길이가 길어, 인증 요청이 많을수록 네트워크 부하가 심해진다.
  • Payload 자체는 암호화되지 않기 때문에 유저의 중요한 정보는 담을 수 없다. (패스워드 등)
  • 토큰을 탈취당하면 대처하기 어렵다. 토큰은 한 번 발급되면 유효기간이 만료될 때까지 계속 사용이 가능하다.
  • 특정 사용자의 접속을 강제로 만료하기 어렵다.
    (쿠키/세션 기반 인증은 서버 단에서 쉽게 삭제할 수 있지만 토큰은 그게 안 됨)
profile
머리 박고 개발공부중,,,

0개의 댓글