토큰 기반 인증 방법(JWT)

Jinjin·2023년 8월 22일
0
post-thumbnail

1. 토큰 기반 인증 방법과 쿠키, 세션과 비교

  • 쿠키나 세션을 이용한 인증보다 더 보안성이 강하고 효율적인 인증 방법이다.

  • 쿠키 인증은 쿠키에 아이디나 암호와 같은 사용자 정보를 담아 서버로 보내게 되는데, HTTP 방식의 통신을 사용할 경우 제 3자가 해당 정보를 염탐할 수 있다.

  • 세션의 경우 세션ID를 보내므로 쿠키에 비해 보안성이 높다고 볼 수 있지만 서버에 추가적인 DB 공간이 필요하다는 단점이 있다.

📌 세션 기반 인증
: 서버 측에 클라이언트의 접속 상태를 저장

📌 토큰 기반 인증
: 토큰에 사용자 인증을 위한 정보가 담겨있기 때문에 서버에 사용자 정보를 저장하지 않고, 전달받은 토큰의 서명과 데이터를 검증하는 것 만으로 인증이 가능함

✔ 쿠키 < 세션 < 토큰
🤷‍♀️ 왜 쿠키와 세션이 아닌 토큰을 사용했는지?

2. JWT란?

클라이언트와 서버 혹은 서비스 간의 통신시 정보를 JSON 객체를 통해 안전하게 전송하고 권한(Authorization)을 위해 사용되는 토큰이다.

  • JWT는 편하게 확인하고 인코딩하도록 도와주는 도구라면, Bearer는 많은 수단 중 하나의 문자열일 뿐이다.

  • JWT(Json Web Token)은 정보를 JSON 객체로 안전하게 전송하기 위한 간결한 방법을 제공하는 개방형 표준이다.

3. Access Token은 어떻게 작동하는가?

  • 로그인 : 사용자 이름과 비밀번호를 사용하여 인증한다.
  • 검증 : 서버가 데이터를 인증하고 토큰을 발행한다.
  • 저장 : 토큰은 저장을 위해 브라우저로 전송된다.
  • 통신 : 서버의 새로운 항목에 액세스할 때마다 토큰이 다시 한 번 확인된다.
  • 삭제 : 세션이 종료되면 토큰이 폐기된다.

3. 토큰 기반 인증(설명)

📌 쿠키와 세션의 단점을 해결할 수 있는 방법

  • JWT 토큰 구조

    • 헤더
      : 암호화 방식과 타입 등을 나타낸다.
    • 페이로드
      : 권한 및 만료, 전송할 데이터가 담겨있다.
    • 서명
      : 받는 사람이 토큰의 진위를 확인할 수 있도록 확인 데이터가 포함된다. 이때 서명은 일반적으로 해시되어 해킹 및 복제가 어렵다.
      ➡ 이건 Access Token에 포함되어 있다.
  • 데이터가 인코딩이 되어있기 하지만 누구나 디코딩을 할 수 있어서 데이터 유출에 대한 피해가 있을 수 있지만 서명 필드는 헤더와 페이로드를 통해 만들어지기 때문에 데이터 변조 후 재전송하는 것을 막을 수 있다.

  • 장점

    • 헤더와 페이로드를 가지고 서명 필드를 생성하므로 데이터 변조 후 재전송을 막을 수 있다.
    • stateless 서버를 만들 수 있다.
    • 모바일 어플리케이션에서도 잘 작동한다.
    • 인증정보를 다른 웹서비스에 전송할 수 있다. (OAuth)
  • 단점

    • 누구나 디코딩이 가능하므로 데이터 유출이 발생할 수 있다.
    • 토큰을 탈취당할 경우, 대처하기 어렵다. (유효기간을 기다리거나 token refresh를 해야한다)
    • JWT의 경우, 토큰의 길이가 길기 때문에 요청이 많아질수록 서버 자원의 낭비가 많아진다.

일반적으로 토큰은 헤더의 Authorization 필드에 담아져 보내진다.
Authorization: <type> <credentials>
🔎 bearer는 위 형식에서 type에 해당하고 서버는 다양한 종류의 토큰을 처리하기 위해 전송받은 type에 따라 토큰을 다르게 처리한다.

  • 인증 타입
    • Basic
      : 사용자 아이디와 암호를 Base64로 인코딩한 값을 토큰으로 사용한다.
    • Bearer
      : JWT 혹은 OAuth에 대한 토큰을 사용한다.
    • HOBA
      : 전자 서명 기반 인증

출처 : https://velog.io/@cada/%ED%86%A0%EA%B7%BC-%EA%B8%B0%EB%B0%98-%EC%9D%B8%EC%A6%9D%EC%97%90%EC%84%9C-bearer%EB%8A%94-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C

profile
BE Developer

0개의 댓글