도입부
웹환경에선 사용자와 시스템간ㅇ에 데이터를 교환할땐 HTTP 방식을 사용한다, HTTP통신은 요청과 응답에의해 작동하며, HTTP 특징중 가장 중요한 특징은 Stateless (상태가없음)을 의미한다.
즉 통신은 독립적이기때문에 과거내용을 알지못한다. 그래서 매통신마다 필요한 정보를 담아서 요청을 보내야한다. 이 불편함을 없애고자 Session과 Cookie 또는 Token같은 기술을 사용할수있다.
===============================================================================
Session based Authentiction(세션기반 통신)
Session
사용자가 브라우저를 통해 웹서버에 접속한 시점부터 종료까지 들어오는 일련의 Req를 하나의 상태로 보고 그상태를 유지하여 사용자와 서버가 논리적으로 연결된 상태를 뜻함
서버는 Session 정보 저장하고 사용자에겐 Session을 구분할수있는 아이디를 부여함
사용자 Req를 보낼때 Session ID를 같이보내 사용자 상태 확인함
Cookie
쿠키는 사용자 컴퓨터에 저장되는 파일, 쿠키는 이름,값,만료날짜/시간, 경로정보 등으로 구성, 쿠키는 도메인당 20개 가질수있고 1개당 4키로바이트 못넘김,
서버에서는 HTTP Response Header에 Set-cookie 속성 이용하여 사용자에게 Cookie를 제공 및 저장하게하고 클라이언트는 HTTP Request에 저장된 Cookie를 함께 전달하여 이전에 통신에서 저장된 정보 파악가능
Session과 Cookie를 통한 인증 flow
- 사용자가 로그인을 하기위해 인증정보를 갖고 인증과정 요청
- 인증완료되면 사용자의 Session정보를 서버 메모리에 저장 후 Session ID 발급
- 발급한 Session ID는 브라우저의 Cookie에 저장되고, Req를 서버에 보낼때 함께전달
- 서버는 사용자가 보낸 Session ID와 서버 메모리에서 관리하고있는 Session ID 비교하고 검증한후 권한을 인가
세션 장점
- Session ID 자체엔 유의미한 개인정보를 담고있지않음
- 서버에서 관리하기때문에 데이터 손상우려에 상대적으로 안전
- 서버에서 상태를 유지중이라 로그인여부 확인 쉽고 경우에따라서 강제로 로그아웃 등 제제도 가능
세션 단점
- 서버에서 관리하기때문에 사용자 증가할수록 서버 부하 증가
- 마찬가지로 서버에서 관리하기때문에 Scale out해야할때 관리어려워짐
- 모바일기기와 브라우저에서 공동사용할때 중복로그인 처리가 되지않는 문제등 신경써줘야할 부분이 증가함
Token based Authentication(토큰기반 통신)
Token
제한된 리소스에 대해 일정기간동안 접근할수있는 권한을 캡슐화 한것, 일반적으로 의미를 알수없는 임의의 문자열 형태로 사용자에게 발급, 또한 제한된 리소스에 대한 접근권한을 캡슐화할뿐 아니라 접근할수있는 리소스 범위와 접근 가능한 기간을 통제할수있음
Token을 이용한 인증 Flow
- 사용자가 인증정보를 갖고 인증과정 요청
- 인증 완료되면 서버메모리에 Session을 저장하는 대신 사용자 식별정보 갖고있는 Token 발급
- 발급한 Token을 Res의 Body에 담아 사용자에게 전달
- 사용자는 Token을 local storage에 저장
- 사용자는 Req를 할때마다 저장된 Token을 Header에 포함시켜 서버로 보냄
- 서버는 전달받은 정보를 검증한뒤 해당유저에 권한을 인가
토큰 장점
- Token을 사용자측에서 저장하므로 서버 메모리나 DB 부담이 없음
- 사용자 상태정보를 서버에서관리 안하기때문에 서버 Scale Out에 용이함
- 모바일과 브라우저 멀티 사용 용의
- Token 만료시간을 짧게 하면 안정성을 높일수있음
- CORS 방식을 사용하기 용이함
토큰 단점
- 서버에서 사용자상태를 저장 하고있지않기때문에 로그인여부확인 경우에따른 강제로그아웃등 제제가 어려움
- 사용자 임의로 토큰 수정시 서버에서 확인불가
- Payload 부분에서 사용자식별을 위한 여러정보가 포함되어있어 Session ID보다 길어져서 req 전송데이터 크기 증가
- XSS 공격에 취약 Payload에 민감한 정보를 포함한경우 위험할수있음
Token based Authentication의 이점
Stateless
- 세션 방식처럼 상태정보를 서버측에서 관리안하고, 사용자측에서 관리하기때문에 Stateless상태를 유지하게됨, 서버측에선 사용자로부터 받은 Req만으로 작업 수행가능
Scalability
- 서버의 상태를 Statelss하게 유지한다는 것은 사용자와 서버사이에 관계가 없다는의미도됨, 따라서 서버확장에 유리
Security
- 클라이언트가 서버로 요청보낼때 Cookie를 전달하지않으므로 CSRF 공격을 방지하는데 도움이됨, 하지만 토큰 환경의 취약점이 존재할수있으므로 이에대비해야함
Extensibility
- Token기반의 인증시스템은 토큰을 통해 권한 범위지정 가능, 이를 이용하여 Kakao, Facebook, Google등과 같은 소셜 계정을 이요하여 다른 웹서비스에서도 로그인 할수있음
Mutiple Devicesand Domains
- 서버 기반 인증 시스템 문제점중 하나인 CORS를 해결할수있음, 어플과 서비스의 규모가 커지면 여러기기들을 호환시키고 더많은 종류의 서비스를 제공하게됨, 토큰을 사용한다면, 어떤 기기, 어떤 도메인에서도 토큰의 유효성검사를 진행한 후에 요청을 처리할수있음
Summary
- HTTP를 이용한 통신에서 로그인 상태같은 Stateful 상태를 유지하기 위해서 세션과 쿠키 또는 토큰을 이용한 방법을 사용합니다.
- 세션을 이용할 경우, 인증이 완료되면 사용자의 세션정보를 서버에 저장하고 해당 세션정보를 식별할수있는 세션아이디를 클라이언트에게 전달, 이때 클라이언트와 서버는 쿠키를 이용하여 세션아이디를 주고받음
- 토큰은 제한된 리소스에 대해 일정기간동안 접글할수있는 권한을 갖고있는 일종의 통행권
- 토큰은 세션과 달리 서버에 정보를 저장하지않음
- 토큰을 이용하면 서버를 stateless 하게 유지할수있어 서버확장에 유리
- 토큰을 이용하여 다양한 기기에서 서비스가 호환되도록 운영할수있음,