Token
세션 기반의 인증은 서버 혹은 DB에 유저의 정보를 담는 방식으로 이 부담을 클라이언트에게 넘겨줄 수 없을까? 에서 고안되었다.
서버에서는 유저가 민감하거나 중요한 정보를 요청할 때마다 지금을 요청을 보낸 유저에게 정보를 줘도 괜찮은 건지 가지고 있는 세션 값과 일치하는 지를 확인한다. 그렇게 되면 매번 DB 를 살펴보아야 한다는 부담이 생기게 된다. 이와 같은 부담을 없애는 것이 토큰 기반 인증이다. 대표적으로 JWT가 있다.
토큰이란?
화폐로 사용하는 토큰을 생각하면 될 것이다.
토큰 기반 인증 방식은 클라이언트에서 인증 정보를 보관하는 방법으로 고안되었다.
클라이언트가 토큰을 가지고 있으면 서버에게 토큰을 보여주고 다양한 기능 요청이 가능하다.
하지만 앞서 클라이언트에는 XSS, CSRF 같은 공격이 생길 수 있기 때문에 중요한 정보는 보관하지 않는다고 했었는데 토큰을 클라이언트에 저장하는 것 또한 위험하지 않을까?라고 생각할 수 있다.
이에 대한 답변은 여기서 토큰은 유저 정보를 암호화한 상태를 담을 수 있고, 암호화했기 때문에 클라이언트에 담을 수 있다고 한다.
토큰 기반 인증 방식에는 여러 가지가 있는데
대표적인 JWT(json web token) 같은 경우 JSON 포맷을 사용자에 대한 속성을 저장하는 웹 토큰이다.
JWT의 구조는 아래로 구분 지을 수 있다.
Header
어떤 종류의 토큰인지 / 어떤 알고리즘으로 암호화하는지
Payload
유저의 정보 / 권한 여부 / 기타 필요한 정보
Signature
header와 payload를 base64 인코딩한 값과 salt값의 조합으로 암호화된 값
[토큰 기반 인증절차]
클라이언트에 토큰은 로컬 스토리지나 쿠키 react의 state 등 다양한 공간에 저장할 수 있다.
토큰 기반 인증의 장점
1.Stateless & Scalability(무상 태성 & 확장성)
서버는 클라이언트에 대한 정보를 저장할 필요가 없다. 토큰 해독이 되는지만 판단하면 된다.
그렇기에 서버와 DB의 부담을 덜어주게 된다. 클라이언트는 새로운 요청을 보낼 때마다 토큰을 헤더에 포함시키면 된다. 서버를 여러 개 가지고 있는 서비스라면 더욱 효과가 클 것이다. 각각의 서버에서 인증을 다 할 필요 없이 하나의 토큰으로 여러 서버를 인증받을 수 있기 때문이다.
2. 안정성
암호화된 토큰을 사용하고 암호화 키를 노출할 필요가 없다.
3. 어디서나 생성 가능
토큰을 생성하는 서버가 꼭 토큰을 만들지 않아도 된다. 토큰만 만들어 주는 토큰 생성용 서버만 만들거나 다른 외주를 두어 토큰 관련 작업을 맡길 수도 있고 다양하게 활용할 수 있다.
4. 권한 부여에 용이
토큰의 payload 안에 어떤 정보에 접근 가능한지 정의가 가능하다.
ex) 사진 권한만 부여 / 연락처 권한만 부여 / 둘 다 부여
'개념정리' 카테고리의 다른 글
12/15[TIL]Deploy (0) | 2020.12.15 |
---|---|
12/11[TIL]Authentication(3) (0) | 2020.12.11 |
12/9[TIL]Authentication (0) | 2020.12.09 |
12/7[TIL]MVC Pattern (0) | 2020.12.07 |
12/2[TIL]SQL (0) | 2020.12.02 |