웹 서버와 클라이언트간에 상태를 유지하기 위한 메커니즘이다. 일반적으로 HTTP프로토콜 통신은 요청 한번에 대해서만을 처리 후 연결을 종료한다. 이때 클라이언트와 서버간에 상태를 유지하기 위해 사용된다. 세션의 특징으로는 모든 정보가 서버에서 관리된다는 점이 있다.
JWT는 JSON Web Token의 약자로 전자 서명 된 URL-safe(URL로 이용할 수있는 문자 만 구성된)의 JSON입니다. JWT는 속성 정보 (Claim)를 JSON 데이터 구조로 표현한 토큰으로 RFC7519 표준 입니다. JWT는 형식은 aaaaaaaa.bbbbbbb.cccccccc
이렇게 되어있어 3가지 파트로 나누고 각 파트는 Base64url 형식으로 인코딩 되어있습니다.
첫번째 파트는 헤더(header)라고 불리며 토큰의 타입과 해시 암호화 알고리즘으로 구성되어 있습니다.
{
"typ": "JWT",
"alg": "HS256"
}
두번째 파트는 페이로드라고 불리며 토큰에 담을 정보들을 담을 수 있고 key와 value가 하나의 쌍으로 클레임(claim)으로 불리우며 페이로드에는 여러개의 클레임을 담을 수 있습니다.
여기서 클레임에 종류에는 등록된(registered) 클레임, 공개된(public) 클래임, 비공개(private) 클래임으로 나눌 수 있습니다.
공개 클레임들은 충돌이 방지된 (collision-resistant) 이름을 가지고 있어야 합니다. 충돌을 방지하기 위해서는, 클레임 이름을 URI 형식으로 짓습니다.
{
"https://www.test.com/": true
}
서버와 클라이언트 간에 협의하에 사용되는 클레임 이름들입니다. 공개 클레임과는 달리 이름이 중복되어 충돌이 될 수 있으니 사용할때에 유의해야합니다.
{
"user_name": "q1swqe23dede34"
}
마지막으로 서명(Signature)은 secret key를 포함하여 암호화되어 있습니다. 이 서명은 헤더의 인코딩값과, 정보의 인코딩값을 합친후 주어진 비밀키로 해쉬를 하여 생성합니다.
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret
)
세션 방식과 jwt 방식에 대해서 알아보았습니다. 각각의 장단점을 비교해 보겠습니다.
- 보안성: 서버에서 세션을 관리하므로 상대적으로 안전합니다.
- 유효기간 관리: 서버에서 쉽게 세션을 제어할 수 있습니다.
- 데이터 저장: 서버에 많은 양의 데이터를 저장할 수 있습니다.
- 서버 부하: 사용자가 많아지면 서버 메모리 사용량이 증가합니다.
- 확장성: 다중 서버 환경에서 세션 공유 문제가 발생할 수 있습니다.
- 모바일 앱 지원: 쿠키 기반이라 모바일 앱에서 사용이 어려울 수 있습니다.
- 확장성: 서버 측 세션 저장소가 필요 없어 서버 확장이 용이합니다.
- 성능: 인증 정보가 토큰에 포함되어 있어 빠른 인증이 가능합니다.
- 플랫폼 호환성: 모바일 앱을 포함한 다양한 클라이언트에서 사용하기 좋습니다.
- 토큰 크기: 포함된 정보가 많을수록 토큰 크기가 커집니다.
- 보안: 클라이언트에 저장되므로 탈취 위험이 있습니다.
- 토큰 관리: 한번 발급된 토큰의 제어가 어렵습니다.