2021-10-01 TIL에서 분리
인증 (Authentication)
사용자가 누구인지 확인하는 절차로, 대표적으로 회원가입, 로그인 과정이 있다.
일반적으로 웹 서버는 HTTP 즉, stateless 프로토콜을 사용하기 때문에 웹사이트에서 사용자가 로그인한 회원인지에 대한 인증을 관리하는 방안이 필요하다.
인가 (Authorization)
사용자가 요청(Request)하는 동작을 할 수 있는 권한이 있는지 확인하는 절차이다.
예를들어,
글을 수정하거나 삭제하는 작업은 권한이 있는 사용자만이 가능하다.
이때 권한이 있는지 여부를 확인하는 절차를 인가라고 한다.
세션 기반 인증 vs 토큰 기반 인증
인증 방식에는 크게 두 가지가 있다.
두 방식의 차이는 인증 확인 증거를 어디에 저장하냐에 있다. 세션 기반 인증은 DB 서버에, 토큰 기반 인증은 클라이언트 측에 저장한다.
세션 기반 인증
사용자의 정보를 서버측에서 기억하고 있는 인증 방식이다.
사용자가 인증을 완료하면 서버는 인증 정보를 세션이라고 하는 별도의 공간에 저장하는데,
보통 메모리 혹은 DB에 저장한다.
장점
- 정보가 서버에 저장되기 때문에 토큰 기반 인증에 비해 위변조 혹은 손상 우려가 없다.
단점
- 서비스의 규모가 커질수록 무리를 줄 수 있다.
- 서비스의 규모가 커커져서 사용자가 늘어나게 되면 더 많은 트래픽을 처리하기 위한 조치가 필요하다. 보통 서버를 확장하거나, 세션을 분산시키는 등의 조치가 있는데, 세션을 사용할 경우조치가 매우 복잡해진다.
토큰 기반 인증
많은 웹 어플리케이션에서 사용하는 방식으로 JWT (JSON Web Token)을 사용한다.
- 서버는 아이디, 비밀번호 등으로 인증을 완료한 사용자에게 토큰을 발급한다.
- 클라이언트는 토큰을 별도의 공간에 저장한 후, 서버에 요청(Request)할 때 헤더에 토큰을 함께 보낸다.
- 서버는 해당 JWT의 유효성을 검사하고 인가한다.
클라이언트 측에서 JWT를 저장하는 공간은 대표적으로 localStorage, Cookie 등이 있다.
장점
- JWT는 클라이언트 측에서 저장하므로 서버 메모리 혹은 DB에 부담을 주지 않으며, 서버는 완전히 무상태성(Stateless)으로 남게된다.
- 클라이언트와 서버가 독립(?)되어지기 때문에 확장성(Scalability)을 확보할 수 있다.
단점
- JWT가 브라우저에 그대로 노출되어있으므로 위변조, 손상의 위험이 크다. (XSS 공격)
- 한번 발급된 토큰은 임의로 만료시킬 수 없다. 따라서 토큰이 공격자(해커)에게 탈취되었다면, 공격자는 토큰이 만료될 때까지 계속 공격 할 수 있다.
참고
인증(Authentication)과 인가(Authorization)
[Server] 토큰 기반 인증 VS 서버(세션) 기반 인증
토큰기반 인증방식과 세션기반 인증방식