본문 바로가기
컴퓨터 사이언스 Computer Science/웹 WEB

[WEB] 인증 방식 종류 2_Token 과 JWT

by 이땡칠 2022. 8. 5.

 

1. Token 인증

1) 개념

토큰 기반 인증 시스템은 클라이언트가 서버에 접속을 하면 서버에서 해당 클라이언트에게 인증되었다는 의미로 '토큰'을 부여한다. 이 토큰은 유일하며 토큰을 발급받은 클라이언트는 이후 서버에 요청을 보낼 때 요청 헤더에 토큰을 담아 보낸다. 그러면 서버에서는 클라이언트로부터 받은 토큰을 서버에서 제공한 토큰과 일치하는지 여부를 체크하여 인증 과정을 처리한다. 

 

기존의 세션 인증은 서버가 파일이나 데이터베이스에 세션 정보를 가지고 있어야 하고 이를 조회하는 과정이 필요하기 때문에 많은 오버헤드가 발생한다. 하지만 토큰은 세션과는 달리 서버가 아닌 클라이언트에 저장되기 때문에 메모리나 스토리지 등을 통해 세션을 관리했던 서버의 부담을 덜 수 있다. 토큰 자체에 데이터가 들어있기 때문에 클라이언트에서 받아 위조되었는지 판별만 하면 되기 때문이다. 

 

토큰은 앱과 서버과 통신 및 인증할 때 가장 많이 사용된다. 

왜냐하면 웹에는 쿠키와 세션이 있지만 앱에서는 없기 때문이다. 

 

2) Token 인증 방식

출처: https://inpa.tistory.com/entry/WEB-%F0%9F%93%9A-JWTjson-web-token-%EB%9E%80-%F0%9F%92%AF-%EC%A0%95%EB%A6%AC

 

1. 사용자가 아이디와 비밀번호로 로그인을 한다.

2. 서버 측에서 클라이언트에게 유일한 토큰을 발급한다.

3. 클라이언트는 서버 측에서 전달받은 토큰을 쿠키나 스토리지에 저장해 두고, 서버에 요청을 할 때마다 해당 토큰을 요청 헤더에 포함시켜 전달한다. 

4. 서버는 전달받은 토큰을 검증하고 요청에 응답한다. 토큰에는 요청한 사람의 정보가 담겨있어, 서버가 DB 를 조회하지 않고 누가 요청하는지 알 수 있다.

 

 

3) Token 인증 방식의 단점

1. 쿠키/세션과 다르게 토큰 자체의 데이터 길이가 길어, 인증 요청이 많아질수록 데이터 부하가 심해질 수 있다. 

2. Payload 자체는 암호화되지 않기 때문에 유저의 중요한 정보는 담을 수 없다.

3. 토큰을 탈취당하면 대처하기 어렵다. (따라서 사용하는 기간을 제한하는 식으로 극복한다.)

 

 

 

2. JWT (Json Web Token)

1) 개념

JWT 은 인증에 필요한 정보들을 암호화시킨 JSON 토큰을 의미한다.

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

 

JWT 는 JSON 데이터를 Base64 URL-safe Encode 를 통해 인코딩하여 직렬화한 것이며, 토큰 내부에는 위변조 방지를 위해 개인키를 통한 전자서명도 들어있다.

사용자가 JWT 를 서버로 전송하면 서버는 서명을 검증하는 과정을 거치게 되며 검증이 완료되면 요청한 응답을 돌려준다. 

 

Base64 URL-safe Encode
일반적인 Base64 Encode 에서 URL 에서 오류없이 사용하도록 '+', '/' 를 각각 '-', '_' 로 표현한 것이다.

출처: https://inpa.tistory.com/entry/WEB-📚-JWTjson-web-token-란-💯-정리

 

 

2) JWT 구조

출처 : Dev Scroll 블로그

 2-1) Header

 JWT 를 어떻게 검증(verify) 하는가에 대한 내용을 담고 있다.

 서명 시 사용하는 알고리즘인 'alg', JWT 에서 사용할 타입이 담겨있다. 

 

 2-2) Payload

 서버에서 첨부한 사용자 권한 정보와 데이터가 담겨있다. 

 Payload 에 있는 속성들을 클레임 셋(Claim Set) 이라 부른다. 클레임 셋은 JWT 에 대한 내용 (토큰 생성자(클라이언트)의 정보, 생성 일시) 등)이나 클라이언트와 서버 간 주고받기로 한 값들로 구성된다. 

 

 

 2-3) Signiture 

점(.)을 구분자로 해서 헤더와 페이로드를 합친 문자열을 서명한 값이다.

 Header의 alg에 정의된 알고리즘과 비밀 키를 이용해 서명을 생성한 뒤, Base64 URL-Safe 로 인코딩한다 

 전자서명에는 비대칭 암호화 알고리즘을 사용하므로 암호화를 위한 키와 복호화를 위한 키가 다르다. 

 암호화(전자서명)에는 비밀 키 사용하고, 복호화(검증)에는 공개키를 사욯한다. 

 

 

 

[참고] Header & Payload

JWT의 헤더는 Base64 인코딩 전 항상 UTF-8로 인코딩된 문자열이어야 한다. 이유는 헤더가 꼭 JSON이어야 하고, JSON의 기본 인코딩은 UTF-8이기 때문이다. 정식 명칭은 JOSE(JSON Object Signing and Encryption) Header다. 그렇다면 페이로드는 JSON이 아니어도 괜찮은가라는 의문을 가지게 되는데 페이로드는 일반적으로 JSON을 사용하는 것뿐이지 꼭 JSON이어야 될 이유는 없다. 따라서 페이로드는 헤더와 다르게 Base64 URL-Safe 인코딩만 한다.

 

 

 

 

참고 게시물

JWT를 소개합니다.

[WEB] JWT 토큰 인증이란? - 이해하기 쉽게 정리하기

쿠키, 세션, 토큰의 차이점

댓글