[TIL] Token(JWT)

김민성·2021년 4월 17일
0

Token

Token을 사용하는 이유!

세션기반 인증방식은 서버나 db에 유저정보를 담아 세션id를 이용하여 인증해주는 방식
민감한 정보를 요청할때마다 확인을 위해 세션 값일치를 매번 확인해야하는 번거로움이 있다!

이런부담을 덜기위해 토큰 기반 인증방식을 사용한다.

토큰을 클라이언트에 저장해도 괜찮을까

클라이언트는 xss, csrf 공격에 취약하다. 하지만 토큰은 유저정보를 암호화한 상태로 담을 수 있고, 암호화 했기 때문에 안전하게 클라이언트에 담을 수 있다.

JWT(json web token)

json포맷으로 사용자에 대한 속성을 저장하는 웹토큰

형태

헤더.페이로드.시그니쳐
aaaaa.bbbbb.ccccc

헤더

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

페이로드

어떤 유저의 정보, 권한을 부여받았는가, 기타 필요한 정보를 담는다

시그니쳐

헤더, 페이로드를 base64인코딩한 값과 salt값의 조합으로 암호화된 값


토큰 순서 다이어그램


(출처: 내 손)
1. userId와 password를 포함하여 요청을 보낸다.
2. userId와 password를 확인하고
3. 토큰을 생성한다.(access, refresh 토큰 2개 생성)
4. 토큰을 로컬스토리지, 쿠키, 리액트의 스테이츠 등에 저장한다.
5. 다음 요청에는 헤더에 authorization : bearer 토큰이름으로 요청을 보낸다.
6. 토큰을 해독하여 확인이 되면 요청을 처리한다.
7. 요청 값을 보낸다.

Access Token, Refresh Token

평소에 토큰을 사용할 때는 Access Token을 사용하여 요청을 처리한다. 하지만 Access Token은 민감한 정보를 가지고있는 리소스서버와 교신을 많이 하기 때문에 기한을 오래 잡으면 위험하다. 그렇기 때문에 Access Token은 기한이 짧아야한다. 그대신 Refresh Token은 Access Token의 기한이 끝나면 새로운 Access Token을 받기 위해 인증서버와 교신한다. 인증 서버는 민감하지않기 때문에 자주자주 갱신하는 것이 안전하다.

토큰 기반 인증의 장점

  1. 무상태성 + 확장성: 서버는 클라이언트에 대한 정보를 저장할 필요가 없다. 토큰을 헤더에 추가함으로서 인증절차가 완료된다.

  2. 안정성: 암호화한 토큰을 사용, 암호화키를 노출할 필요가 없다.

  3. 어디서나 생성가능 : 토큰을 생성하는 서버가 꼭 토큰을 만들지 않아도 됨. 외주를 받아서 토큰을 만들어와도 된다.

  4. 토큰의 페이로드(내용물)안에 어떤 정보에 접근이 가능한지 정의하여 권한을 부여하는데에 용이하다.
    ex)사진과 연락처 사용권한 부여/ 사진권한만 부여/ 연락처 권한만 부여

profile
https://github.com/alstjd8826

0개의 댓글