💻CS

[CS] 토큰 기반 인증과 JWT

이줭 2022. 6. 19. 22:18
728x90

토큰 기반 인증은 토큰을 이용하여 인증하고, 세션과 달리 서버가 아닌 클라이언트에 저장되기 때문에 메모리나 스토리지 등을 통해 세션을 관리했던 서버의 부담을 덜 수 있다.

 

기본적인 토큰 기반 인증의 과정은 다음과 같다.

 

1. 사용자가 로그인하면 서버에서 계정 정보를 검증 후 Access TokenRefresh Token을 발급

2. 사용자는 Access Token을 저장 후 서버에 요청할 때 http 헤더에 Access Token을 함께 전송

3. 서버에서는 토큰을 검증하고 요청에 응답한다.

4. Access Token의 유효기간이 만료되면 Refresh Token을 통해 Access Token을 재발급

출처 : https://velog.io/@indndufnskdkje/JWT-Json-Web-Token

요청 중 토큰이 탈취될 경우를 대비하여 Access Token의 유효기간을 짧게 설정하고, Refresh Token을 같이 발급하여 Access Token이 탈취당하더라도 상대적으로 피해를 최소화시킬 수 있다.

 

JWT(JSON Web Token)는 JSON객체를 사용하고 self-contained 방식으로 두 개체에서 정보를 가볍고 안정성 있게 전달해준다. JWT의 핵심적인 특징인 self-contained는 토큰 자체에 사용자의 권한 정보나 서비스를 사용하기 위한 정보가 포함된다는 것으로 토큰에 대한 기본정보, 전달할 정보, 토큰이 검증되었다는 것을 증명해주는 signature을 포함하고 있다.

 

사용자가 로그인하면 서버가 해당 유저의 토큰(JWT)을 유저에게 전달하고 유저가 서버에 요청할 때 토큰을 포함해서 전달, 서버는 해당 토큰이 권한이 있는지 유효하고 인증되었는지 확인하고 작업을 진행한다. JWT의 경우 정보가 sign 되어있기 때문에 정보를 보낸 이 가 바뀌진 않았는지, 정보가 도중에 조작되지는 않았는지 검증할 수 있다.

 

JWT의 구조를 살펴보면 aaaaaa.bbbbbb.cccccc 와 같이 이루어져 있다.

(aaaaaa:  Header, bbbbbb: Payload, cccccc: Signature)

JSON 형태인 각 부분은 Base64로 인코딩 되어 표현되고, 각 부분을 이어 주기 위해 " . " 구분자를 반환한다. Base64는 암호화된 문자열은 아니고, 같은 문자열에 대해 항상 같은 문자열을 반환한다.

Header

Header에는 typ, alg 두 가지 정보를 가지고 있다. typ은 토큰의 타입을 지정하고 ( ex) JWT ) alg는 해싱 알고리즘을 지정한다. ( ex) HMAC SHA256, RSA ) alg에서 지정되는 알고리즘은 토큰을 검증할 때 사용되는 signature 부분에서 사용된다.

 

Payload

Payload 부분에는 토큰에 담을 정보가 들어 있다. 정보의 한 조각을 클레임이라 부르고, key-value 형태의 한쌍으로 이루어져 있다. 토큰에는 여러 개의 클레임을 넣을 수 있다.

 

Signature

Signature는 토큰을 인코딩하거나 유효성을 검증할 때 사용하는 고유한 암호화 코드로써, 위에서 만든 Header와 Payload의 값을 각각 Base64로 인코딩하고, 인코딩한 값을 비밀 키를 이용해 헤더에서 정의한 알고리즘으로 헤싱한 후, 이 값을 다시 Base64로 인코딩하여 생성한다.

 

JWT의 주요한 이점으로는 사용자 인증에 필요한 모든 정보는 토큰 자체에 포함되기 때문에 별도의 인증 저장소가 필요 없으며, 쿠키를 전달하지 않기 때문에 쿠키로 인해 발생하는 취약점이 사라진다.

 

또한 URL 파라미터와 헤더로 사용 가능하고, 트래픽에 대한 부담이 낮으며 REST 서비스로 제공이 가능하다.

 

단점으로는 self-contained 한 특성으로 양날의 검이 될 수 있고, 토큰에 담고자 하는 정보가 많아질수록 토큰의 길이가 늘어나 네트워크에 부하를 줄 수 있다. 또한, Payload 자체는 Base64로 인코딩 된 것이지 암호화된 것이 아니기 때문에 중요 데이터를 넣지 말아야 한다. JWT는 상태를 저장하지 않기 때문에 한번 생성되면 제어가 불가능하다. 따라서 토큰을 임의로 삭제할 수 없고 꼭 만료 시간을 넣어주어야 한다.

 

참고 : https://pronist.dev/143https://velopert.com/2350

https://gorokke.tistory.com/181

728x90

'💻CS' 카테고리의 다른 글

[CS] DB Index  (0) 2022.07.03
[CS] Pub/Sub 모델과 MQTT(Mosquitto)  (0) 2022.06.26
[CS] CORS?  (0) 2022.06.25
[CS] Session vs Cookie  (0) 2022.06.22
[CS] HTTP 상태코드  (0) 2022.06.16