Token 기반 인증 21.05.28


토큰 기반 인증을 사용하는 이유 : 세션 기반 인증은 서버 혹은 DB에 유저 정보를 담는 방식으로 서버 혹은 DB에 부담을 줄 수 있다. 이 부담을 클라이언트에게 넘겨 주는 것이 토큰 기반 인증이다.

클라이언트에 민감한 정보를 담고 있으면 보안에 취약하지만 토큰은 정보를 암호화 한 상태로 담을 수 있고 암호화하기 때문에 클라이언트에 담을 수 있다.

JWT(JSON Web Token)

JWT는 JSON 포맷으로 사용자에 대한 속성을 저장하는 웹토큰으로 대표적인 토큰 기반 인증이다.

JWT의 종류

  • Access Token : 보호된 정보들(유저의 이메일, 연락처, 사진 등)에 접근할 수 있는 권한부여에 사용. 라이언트가 처음 인증을 받게 될 때(로그인시), access, refresh token 두가지를 다 받지만, 실제로 권한을 얻는데 사용하는 토큰은 Access token.

권한을 부여 받는데엔 access token만 가지고 있으면 되지만 access token을 만약 악의적인 유저가 얻어내는 경우 이 악의적인 유저는 자신이 00유저인것 마냥 서버에 여러가지 요청을 보낼 수 있다.

그렇기 때문에 access token에는 비교적 짧은 유효기간을 주어 탈취 되더라도 오랫동안 사용할 수 없도록 하는것이 좋다.

  • Refresh Token : Access token의 유효기간이 만료된다면 refresh token을 사용하여 새로운 access token을 발급 가능하다. 이때, 유저는 다시 로그인 할 필요가 없다.

refresh token도 탈취 당하는 경우 큰 문제가 되기 때문에 유저의 편의보다 정보를 지키는 것이 더 중요한 웹사이트들은 refresh token을 사용하지 않는 곳이 많다.

JWT 구조

<!-- syntax -->
Header.Payload.Signature

<!-- ex code -->
 암호화 알고리즘,   토큰 종류  .                                정보.                     .        (Header base64 인코딩          .      Payload base64 인코딩    , salt )
{"alg:"HS256, "typ":"JWT}.{"sub":"someInformation", "name":"creamer", "iat":151621}.HMACSHA256(base64UrlEncode(header)+"."+basebase64UrlEncode(payload), secret)

Header : 어떤 종류의 토큰인지, 어떤 알고리즘으로 암호화하는지. Payload : 유저의 정보, 권한, 기타 필요한 정보 Signature : Header, Payload를 base64 인코딩한 값과 salt값의 조합으로 암호화된 값

토큰 기반 인증 절차

1.클라이언트가 서버에 로그인 요청 2.서버는 데이터베이스를 검색하여 아이디 비밀번호 일치 확인 후 3.서버는 일치하면 암호화된 토큰(JWT) 생성 4.서버는 클라이언트에 JWT 토큰 보내줌 5.클라이언트는 JWT 토큰을 로컬 스토리지, 쿠키, 리액트 스테이트 등 다양한 공간에 저장 가능. 6.클라이언트는 JWT 토큰을 Headers에 담아서 서버에 요청 7.서버는 JWT 토큰을 해독하고 서버가 발급한 토큰이 맞으면 요청을 클라이언트에 응답

JWT 사용 예시

JWT는 권한 부여에 굉장히 유용. 새로 다운받은 A라는 앱이 Gmail과 연동되어 이메일을 읽어와야 하는 경우.

1.유저는 Gmail 인증서버에 로그인정보(아이디, 비밀번호)를 제공. 2.성공적으로 인증시 JWT 를 발급. 3.A앱은 JWT를 사용해 해당 유저의 Gmail 이메일을 읽거나 사용 가능

토큰 기반 인증 장점

  • 무상태성 & 확장성 : 서버는 클라이언트에 대한 정보를 저장할 필요가 없으므로 부담이 줄어듬. 토큰을 헤더에 추갛마으로 인증 절차 완료.

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

  • 어디서나 생성 가능 : 토큰을 사용하는 서버가 꼭 토큰을 생성하지 않아도 됨

  • 권한 부여에 용이 : 토큰의 payload(내용물)안에 어떤 정보가 접근 가능한지 정의.






© 2020.11. by creamer

Powered by CREAMer