세션, 토큰에 들어가기 앞서 인증, 인가를 구별하자!
인증이란?
유저가 누구인지 확인하는 절차, 회원가입하고 로그인 하는 것.
인가란?
유저에 대한 권한을 허락하는 것.(어서와이제이션~ Authorization 로그인 어서와~)
(출처 : http://gcs.emro.co.kr:8090/pages/viewpage.action?pageId=9873130)
세션 기반 인증은 전통적으로 Server-Side Rendering 방식으로 처리되는 웹서비스들에서 많이 쓰이는 방법이다.
서버는 주로 메모리에 세션 정보를 저장하고, 클라이언트(웹 브라우저)는 주로 쿠키(Cookie)에 세션 정보가 저장된다. 메모리와 브라우저에 모두 세션 정보를 갖게 한다. 그리고 로그인이 되었는지 확인하기 위해서는 표딱지(세션 정보)가 일치하는지 확인한다.
메모리에 저장된 세션 정보는 휘발성이기에 서버 재부팅시 사라질 수 있으며 많은 정보를 저장하는데 한계가 있다. 그렇다고 하드디스크나 DB에 저장하기에는 작업이 느리고 무겁다는 단점이 있다.
Server-Side Rendering 방식은 여러 개의 Page로 구성하는 웹 서비스를 Single Page만으로 구현하기 힘든 대규모 시스템에서 아직까지 성능과 보안을 위해 쓰이는 경우가 있다.
(출처 : http://gcs.emro.co.kr:8090/pages/viewpage.action?pageId=9873130)
토큰 기반 인증은 SPA에서 많이 쓰이는 방법이다.
사용자가 로그인을 하면 토큰을 준다. (서버는 토큰을 갖고있지 않음)
(XXX.YYY.ZZZZ) => (header.payload.signature)
웹 브라우저의 성능 향상과 사용성 증대를 위해 vue react angular, 모바일 등 다양한 디바이스 클라이언트들을 하나의 백엔드 API로 대응하기 위한 REST 아키텍쳐가 사용되는 상황이다. REST 아키텍쳐는 무상태성(stateless)의 구현을 위해 클라이언트 쪽에 토큰이 저장되는 토큰 기반 인증이 많이 쓰이게 됐다.
=> 만능은 아니지만 JWT의 한계다.. 서비스의 성격을 확인하고 사용하자.
JWT는 기본적으로 header, payload, signature로 구성된다.
1) header
토큰 타입(JWT 고정값), 해싱 알고리즘(토큰 검증시 사용되는 signature에서 사용, HS256..)
2) payload(내용)
토큰명,발급자,만료시간,고유식별자 등등에 대한 정보 (Claim이라고 한다)
Base64
3) signature(서명)
Header와 Payload의 데이터 무결성과 변조 방지를 위한 서명
헤더의 인코딩값 + 정보의 인코딩값 => 비밀키로 해쉬 생성
=> 즉 서버만 알고 있다. (비밀키를 통해 해킹 방지!)
서명 값과 계산값이 일치하고 유효기간이 지나지 않았다면 인가!!