Token

이윤근·2021년 8월 5일
0

token

:인증받은 사용자들에게 토큰을 발급하고 서버가 요청할 떄 헤더에 토큰을 함께 보내도록하여 유효성 검사를 하는 것
서버나 세션에 유지하지않고 클라이언트 측에서 들어오는 요청만으로 작업을 처리함.상태를 유지하지 않으므로 statless한 구조이다.

1)사용하는이유

:세션 기반 인증은 서버에 유저 정보를 담는 인증 방식이다. 유저가 정보를 요청할 때마다 우리가 정보를 줘도 괜찮은지 확인하기 위해
세션 값과 일치하는지 확인을 한다. 요청마다 데이터베이스를 살펴보는 것이 불편하기에 이 부담을 줄이기 위해 토큰기반 인증을 사용한다.

2)JWT(Json Web Token)

:Json 포맷으로 사용자에 대한 속성을 저장하는 웹토큰
:토큰기반 인증 중 대표적인 것

-종류

(1)Access Token
:보호된 정보들에 접근할 수 있는 권한부여에 사용
:보안을 위해 유효기간이 매우 짧음.

(2)Refresh Token
:유효기간이 짧은 Acess Token을 보완하기 위한 것
:Access token 보다 유효기간이 길다

  1. 로그인을 하면 Access Token과 Refresh Token을 모두 발급한다. 사용자가 인증이 필요한 API에 접근하고자 하면, 가장 먼저 토큰을 검사하는 미들웨어를 검사한다.
    이때, 토큰을 검사함과 동시에 각 경우에 대해서 토큰의 유효기간을 확인하여 재발급 여부를 결정한다.
    case1: access token과 refresh token 모두가 만료된 경우 -> 에러 발생
    case2: access token은 만료됐지만, refresh token은 유효한 경우 -> access token 재발급
    case3: access token은 유효하지만, refresh token은 만료된 경우 -> refresh token 재발급
    case4: accesss token과 refresh token 모두가 유효한 경우 -> 다음 미들웨어로
  2. 로그아웃을 하면 Access Token과 Refresh Token을 모두 만료시킨다.

-구조

(1)header
-typ:어떤 타입의 토큰인가?
-alg:어떤 알고리즘으로 암호화하는가?

(2)payload -토큰에 담을 정보가 들어가 있음.
claim: 토큰에 담는 정보의 한 조각. Json(key/value) 형태의 한쌍으로 이루어져 있다.
-종류
등록된 클레임(registered claim) : 서비스에 필요한 정보가아닌 토큰에 대한 정보를 담는 클레임
(iss:토큰 발급자, sub:토큰 제목, aud:토큰 대상자, exp:토큰 만료시간, nbf: 토큰의 활성 날짜,iat:토큰이 발급된 시간,jti:JWT의 고유 식별자)
공개 클레임(public claim):충돌이 방지된 이름을 가지고 있어야하고 클레임 이름이 URI 형식으로 생성한다.
비공개 클레임(private claim): 서버와 클라이언트 간에 협의하여 사용되는 클레임 이름들.

-유저의 정보
-권한을 부여 받았는가?
-기타 필요한 정보

(3)signature

:토큰을 인코딩하거나 유효성 검증할 떄 사용하는 고유한 암호화 코드
-header,payload를 base64인코딩한 값과 salt값의 조합으로 암호화된 값

-절차

1.클라이언트가 서버에 아이디와 비밀번호를 담아 로그인을 요청한다
2.서버는 해당 정보를 검증하고 정확하다면 암호화된 토큰을 생성한다
3.토큰을 클라이언트에 보내주고 클라이언트는 저장한다. ( local storage,react state,cookie등 다양한 곳에 저장가능하다)
4.클라이언트가 서버에 요청을 할 때마다 토큰을 담아서 요청을한다.
5.서버는 token을 해독해서 유효성 검사를하고 그에 따른 응답을 해준다.

3)장점

1.statelessness & scalability(무상태성 확장성)
-서버는 클라이언트에 대한 정보를 저장할 필요x
-토큰을 헤더에 추가함으로 인증절차 완료
2.안정성,보안성
-암호화 한 토큰을 사용
-암호화 키를 노출할 필요x
3.어디서나 생성가능
-토큰을 생상하는 서버가 꼭 토큰을 만들지 않아도됨
4.확장성(권한 부여에 용이)
-토큰 payload안에 어떤 정보에 접근 가능한지 정의

4)단점

1.토큰은 클라이언트에 저장되어 데이터베이스에서 사용자 조작하더라도 토큰에 직접 사용할수 없음.
2.더많은 필드가 추가되면 토큰이 커질 수 있다.
3.비상태 애플리케이션에서 토큰은 거의 모든 요청에 대해 전송되므로 데이터 트래픽 크기에 영향을 미칠 수 있다.

5)유용한상황

(1)회원인증:서버에서 사용자에 대한 세션을 유지할 필요가 없고 사용자가 로그인되었는지 안되었는지 신경쓸필요없으며 토큰만 확인되면 세션관리가 필요없어서 서버 자원과 비용을 절감할 수 있다.
(2)정보교류:정보가 서명이 되어있기 때문에 정보의 신뢰성을 검증할 수 있다.

profile
성실한코딩러

0개의 댓글