이전 개인프로젝트를 진행하면서 JWT를 이용하여 인증하는 방식을 택했는데,
JWT에 대해 제대로 알아보고자 글로 정리하면서 학습해보겠습니다.
서버가 클라이언트 인증을 확인하는 방식 3가지 : Cookie, Session, Token
클라이언트가 사용자 인증을 하면 그 인증을 유지할 수 있도록 쿠키와 세션을 사용해왔다.
but, 쿠키는 탈취 가능성이 있다. 보안에 취약하다
세션은 유저의 인증정보를 서버쪽에서 유지함.-> 서버의 확장성이 떨어진다
서버의 메모리를 차지하여 요청이 많을 경우 서버 과부하의 원인이 된다.
토큰도 탈취 가능성이 있지만 accessToken 유효기간을 짧게 설정하고, refreshToken을 따로 저장해서 보완할 수 있습니다.
-> 이를 보완하고자 토큰 기반 인증 시스템이 도입되었다.
* 세션 : 방문자가 웹서버에 접속해있는 상태를 하나의 단위로 본다. 브라우저를 닫거나 서버에서 세션을 삭제했을때 삭제된다.
Token 인증 방식:
- 클라이언트가 서버에 접속하면 서버에서 해당 클라이언트가 인증되었다는 의미로 'Token'을 부여
- 클라이언트는 서버에 요청을 보낼 때 요청 헤더에 토큰을 포함시켜 전송한다.
- 서버에서는 클라이언트로부터 받은 토큰을 검증하고 요청에 응답한다.
토큰 방식의 단점 :
- 토큰 자체의 데이터 길이가 길어 인증 요청이 많아질수록 네트워크 부하가 심해질 수 있다.
- Payload 자체는 암호화되지 않는다.
- 토큰 탈취 가능
JWT(JSON Web Token) : Json객체에 인증에 필요한 정보를 담은 후 비밀키로 서명한 토큰이다.
인증에 필요한 정보를 암호화시킨 JSON 토큰이다. HTTP헤더에 JWT 토큰을 실어 서버가 클라이언트를 식별하는 방식이다.
JWT는 토큰 기반인증에서 주로 사용하는 토큰 중 하나이다.
JWT 토큰을 이용하면 stateless 특징을 유지하면서 로그인 상태 유지를 할 수 있다.
* 서버의 무상태 구조(Stateless) : 서버가 클라이언트의 상태를 보존하지 않음.
클라이언트와 서버 간 통신에 필요한 모든 상태 정보들을 클라이언트에서 가지고 있다가 서버와 통신할 때 데이터를 실어 보낸다. 이를 통해 서버는 상태유지(Stateful)에 대한 부하가 줄어든다 + 서버1에서 문제가 생겨 서버2가 이어받아도 응답을 동일하게 할 수 있다(서버확장 가능)
.를 구분자로 헤더.내용.서명 으로 구성된다.
Header 는 JWT에서 사용할 타입과 해시 알고리즘의 종류가 담겨있다.
Payload는 서버에서 첨부한 사용자 권한 정보와 데이터가 담겨있다. (Claim들을 담을 수 있다)
Signatur는 (헤더+페이로드)와 서버가 갖고 있는 비밀키를 합친 것을 헤더에서 정의한 알고리즘으로 암호화한다. 토큰의 위변조 여부를 확인하는데 사용된다. (HS256방식 - 비밀키 방식, HMAC과 SHA256사용, 메세지를 해싱해서 무결성확보)
JWT의 장점
- 데이터 위변조를 막을 수 있다.
- 인증 정보에 대한 별도의 저장소가 필요 없다.
- 서버는 무상태(stateless)가 되어 서버 확장성이 우수.
- 토큰 기반으로 다른 로그인시스템에 접근 및 권한 공유가 가능하다(쿠키와 차이)
JWT의 단점
- 토큰 자체에 정보를 담고 있다. 토큰 자체를 탈취당할 수 있다.
- 토큰에 담는 정보가 많아질수록 토큰 길이가 늘어나 네트워크에 부하를 줄 수 있다.
- Payload가 탈취당할 수 있어서 중요 데이터를 넣을 수 없다.
JWT - AccessToken / Refresh Token 활용으로 보안 강화
JWT 토큰의 탈취 위험성으로 인해 AccessToken(유효기간 짧게 설정)과 RefreshToken을 함께 발급하고. AccessToken은 클라이언트에 부여, RefreshToken은 DB에 저장한다.
리프레시 토큰은 액세스 토큰이 만료되었을 때 새로운 액세스 토큰을 발급하는 용도로 사용한다.
Oauth와 JWT의 차이점
Oauth와 달리 JWT는 토큰 자체가 의미를 갖는 Claim 기반의 토큰 방식이다.
Oauth는 사용자 인증 프로토콜이 아닌 인가 프로토콜이다.
인증 : 사용자의 신원을 검증하는 행위
인가 : 사용자에게 특정 리소스나 기능에 액세스할 수 있는 권한을 부여하는 것
Oauth
Oauth : 구글과 트위터가 만든 개방형 인가의 표준이다.
소셜로그인 : 유저가 해당 웹사이트에 가입한 ID와 패스워드 대신 다른 사이트에 있는 유저 정보를 사용해 인증하는 기능.
access token : 리소스 서버에서 리소스 소유자의 보호된 정보를 획득할 때 사용
리소스 소유자(resource owner) : 사용자. 리소스(사용자의 보호된 정보)에 접근하도록 자격을 부여하는 사람
클라이언트 : 리소스를 사용하려고 접근을 요청하는 애플리케이션
리소스 서버(resource server) : 사용자의 보호된 자원을 가지고 있는 서버
인가 서버(authorization sever) : 인증/인가를 수행하는 서버. 클라이언트의 접근 자격을 확인하고 액세스 토큰을 발급하여 권한을 부여한다.
Oauth 프로토콜의 흐름
🌐 JWT 토큰 인증 이란? (쿠키 vs 세션 vs 토큰)
Cookie / Session / Token 인증 방식 종류 보통 서버가 클라이언트 인증을 확인하는 방식은 대표적으로 쿠키, 세션, 토큰 3가지 방식이 있다. JWT를 배우기 앞서 우선 쿠키와 세션의 통신 방식을 복습해
inpa.tistory.com
OAuth를 사용한 구글 로그인 인증하기 1편 - OAuth 소개와 준비하기 - 골든래빗
'[Node.js] 자바스크립트 비동기 개념에 익숙해지기'는 총 3편에 걸쳐서 콜백 함수, 프로미스, async await 구문을 소개할 예정입니다. 1편에서는 자바스크립트 비동기 개념을 이해하고, 콜백 함수 예
goldenrabbit.co.kr