Overview
인증(Authentication)과 인가(Authorization)에 대한 내용
인증은 로그인이고 인가는 사용자가 요청을 보냈을 때 이 사용자가 로그인 되어있는지, 권한은 있는지 등을 확인하는 것을 말한다.
세션
- 로그인 시 서버에서 세션을 발급한다.
- 서버는 세션의 일부를 클라이언트에 전송한다.
- 세션은 브라우저의 쿠키에 저장된다(session id).
- 이후 요청마다 http header에 session id가 포함된다.
- 서버에서 http request header의 세션일부와 자신이 가지고있는 세션일부를 가지고 짝이 맞는지 확인한다.
문제점: 서버에서 세션을 관리하기 까다롭다.
메모리, 하드, 디비 등에 정보를 가지고 있어야하지만 메모리의 경우 서버가 재시작되는 경우 혹은 에러가 발생한 경우 모든 사용자가 로그인이 튕길 수 있으며 하드 및 데이터베이스에 저장 시 퍼포먼스에 이슈가 있다.
토큰
- JWT(Json Web Token)라 부름
- 로그인 시 서버는 token을 발급하여 클라이언트에 전송하고 클라이언트는 이를 쿠키에 저장해두었다가 http request마다 토큰을 header에 담아 전송하게 된다.
- 토큰의 구조는 아래와 같다.
header, payload, verify signature를 base64로 인코딩한 값이 .으로 구분이 되어있다.
header에는 타입과 알고리즘 종류, payload는 사용자정보 및 토큰의 유효기간, 권한 등이 담겨있으며 verify signature 는 header, payload 그리고 서버내 키값을 header에 있는 알고리즘으로 암호화 한 결과값이다.
서버는 토큰을 받았을 때, header와 payload값을 가지고 verify signature를 생성하여 보내온 토큰과 동일한지를 확인한다.
문제점: 토큰을 탈취당하였을 경우 방법이 없음(XSS공격 등)
reference
https://jwt.io/
https://noirstar.tistory.com/266
https://jins-dev.tistory.com/entry/Session-%EA%B8%B0%EB%B0%98-%EC%9D%B8%EC%A6%9D%EA%B3%BC-Token-%EA%B8%B0%EB%B0%98-%EC%9D%B8%EC%A6%9D
https://www.youtube.com/watch?v=1QiOXWEbqYQ&t=387