이 글에서는 Session, Cookie를 이용한 인증방식과 Token 인증 방식을 비교해 보고 Token 인증방식 중에서도 OAuth2 와 JWT을 추가한 인증방식을 비교해 볼 것이다.
OAuth 2.0은인증을 위한 표준 프로토콜이다. 구글, 페이스북, 네이버 등에서 제공하는 Authorization Server를 통해 회원정보를 인증하고 Access Token을 발급받는다. 그리고 발급받은 Access Token을 이용해 타사의 API 서비스를 이용할 수 있다.
아래 그림은 보통 OAuth2.0 하면 생각하는 구조이다.
서버는 API 호출 요청에 대해서 Token이 유효한지를 확인할 필요가 있다. 이는
서버에서 클라이언트의 상태(토큰의 유효성)를 관리하게끔 하며, 또 API를 호출 할 때마다
그 토큰(AccessToken)이 유효한지 매번 DB등에서 조회하고 새로 갱신시 업데이트 작업을 해주어야 한다.
OAuth Token 은 무의미한 문자열로 구성되어 있기 때문이다.
위 그림은 Oauth2 방식에 JWT 토큰을 사용한 예이다.
JWT는 정보를 JSON 객체 형태로 주고 받기 위해 표준규약에 따라 생성한 암호화된 문자열(Token)이다.
JWT는 Claim 기반이라는 방식을 사용하는데, Claim이란 사용자에 대한 프로퍼티 속성을 이야기 한다.
// Claim을 JSON으로 서술한 예이다. JSON 자체를 토큰으로 사용하는 것이
// Claim 기반의 토큰 방식이다.
{
"id":"test",
"role":"user"
}
여기서 JWT의 Token은 의미있는 토큰(유저의 상태를 포함한)으로
구성되어 있기 때문에 Auth 서버 쪽의 비용을 절감하면서 stateless한 아키텍처를 구성 할수 있다.
중요한 점은 application server가 더이상 로그인한 사용자의 session을 관리 하지 않는다는 것이다. 단지
전달받은 JWT가 유효한 Token인지만 확인한다.
JWT(JSON Web Token)은 유저의 상태(고유번호, 권한, 토큰 만료일자 등을 포함)를 JSON 포맷으로 구성하고, 이 텍스트를 다시 특정 알고리즘(Base 64)에 따라 일련의 문자열로 인코딩한 토큰을 의미한다.
JWT는 아래와 같이 Header / Payload / Signature 3가지로 구성된다.
Payload : JWT에 담아서 전달할 data를 정의한다.
Referrence
https://okky.kr/article/409195
https://medium.com/neillab/what-is-jwt-89889759ae37
https://velog.io/@minholee_93/Spring-Security-JWT-Authentication