본문 바로가기

개념정리

12/10[TIL]Authentication(2)

Token

세션 기반의 인증은 서버 혹은 DB에 유저의 정보를 담는 방식으로 이 부담을 클라이언트에게 넘겨줄 수 없을까? 에서 고안되었다.

서버에서는 유저가 민감하거나 중요한 정보를 요청할 때마다 지금을 요청을 보낸 유저에게 정보를 줘도 괜찮은 건지 가지고 있는 세션 값과 일치하는 지를 확인한다. 그렇게 되면 매번 DB 를 살펴보아야 한다는 부담이 생기게 된다. 이와 같은 부담을 없애는 것이 토큰 기반 인증이다. 대표적으로 JWT가 있다.

 

토큰이란?

화폐로 사용하는 토큰을 생각하면 될 것이다.

 

토큰 기반 인증 방식은 클라이언트에서 인증 정보를 보관하는 방법으로 고안되었다.

클라이언트가 토큰을 가지고 있으면 서버에게 토큰을 보여주고 다양한 기능 요청이 가능하다.

하지만 앞서 클라이언트에는 XSS, CSRF 같은 공격이 생길 수 있기 때문에 중요한 정보는 보관하지 않는다고 했었는데 토큰을 클라이언트에 저장하는 것 또한 위험하지 않을까?라고 생각할 수 있다.

이에 대한 답변은 여기서 토큰은 유저 정보를 암호화한 상태를 담을 수 있고, 암호화했기 때문에 클라이언트에 담을 수 있다고 한다.

 

토큰 기반 인증 방식에는 여러 가지가 있는데

대표적인 JWT(json web token) 같은 경우 JSON 포맷을 사용자에 대한 속성을 저장하는 웹 토큰이다.

 

JWT의 구조는 아래로 구분 지을 수 있다.

Header

어떤 종류의 토큰인지 / 어떤 알고리즘으로 암호화하는지

Payload

유저의 정보 / 권한 여부 / 기타 필요한 정보

Signature

header와 payload를 base64 인코딩한 값과 salt값의 조합으로 암호화된 값

 

[토큰 기반 인증절차]

 

출처 : https://urclass.codestates.com/d1543e51-e11d-4091-8f6b-7807e9976997?playlist=426

 

클라이언트에 토큰은 로컬 스토리지나 쿠키 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