새소식

반응형
기타

[JWT] 토큰(Token) 기반 인증(Basic, Bearer)

  • -
반응형
해당 글은 VELOPERT님의 게시글을 참고하여 작성하게 되었습니다.

 

토큰 기반 인증

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

토큰에는 암호화 방식과 타입 등을 알려주는 헤더 정보, 전송할 원본데이터가 담긴 페이로드,

토큰 검증을 위한 서명을 인코딩(해싱)한 값이 포함되어 있다.

 

쿠키 인증은 아이디나 암호와 같은 사용자 정보를 담아 서버로 보내게 되는데, HTTP 방식의 통신을 사용할 경우

제 3자가 해당 정보를 염탐할 수 있습니다.

 

세션의 경우 Session ID 를 통해 사용자를 인증하므로 쿠키에 비해 보안성이 높다고 할 수 있지만

서버쪽의 추가적인 DB 공간이나 메모리에 저장할 경우 접근한 사용자가 많으면 메모리 관리가 쉽지 않습니다.

 

이러한 쿠키인증과 세션인증의 단점을 해결할 수 있는 방법이 토큰 기반 인증입니다.

 

토큰의 사용자 정보인 서명 데이터가 인코딩 되어 있으나 헤더의 암호화 방식을 보고 디코딩을 할 수

있어서 데이터 유출에 대한 피해가 있을 수 있습니다.

하지만 토큰의 서명 데이터는 헤더와 페이로드를 통해 만들어지기 때문에 데이터 변조 후 재전송하는 것을

막을 수 있습니다.

 

일반적으로 토큰은 요청 헤더의 Authorization 필드에 담아져 보내진다.

Authorization: <type> <credentials>

인증정보의 <type> 은 bearer, basic 등 여러가지가 존재한다.

 

장점

  • 헤더와 페이로드를 통해 서명 데이터를 생성하므로 데이터 변조 후 재전송을 막을 수 있다.
  • 사용자의 정보를 저장하지 않는다.(Stateless, 상태유지를 하지 않는다.)

단점

  • 디코딩이 가능하므로 데이터 유출이 발생할 수 있다.
  • 토큰 탈취 시 대처하기 어렵다.
  • JWT의 경우, 토큰의 길이가 길기 떄문에 서버 자원 낭비가 있어 관리가 어렵다.

 

* Stateless

단어의 뜻처럼 무상태라고 한다. 즉, 상태유지를 하지 않는다는 것이다.

세션은 사용자의 정보를 서버측에서 메모리나 DB에 저장한다. 이렇게 되면 사용자가 많을 경우

메모리 관리나 DB의 성능에 무리를 줄 수 있다.

하지만 토큰을 사용할 경우 서버쪽에서 사용자에 대한 접속 상태를 유지할 필요가 없다.

사용자의 정보를 저장하지 않으므로 서버의 확장성도 또한 좋다.

 

 

동작 원리

1. 유저가 웹사이트에 접근하면 서버는 웹사이트를 제공한다.

2. 접속한 웹사이트에서 유저는 로그인 정보를 입력하고 서버에게 로그인 요청을 보낸다.

3. 서버는 입력된 로그인 정보를 확인하여 인증되면 토큰을 생성하여 유저에게 응답한다.

4. 유저는 응답받은 토큰을 저장해두고, 서버에게 필요한 정보를 요청할 때 마다 해당 토큰과 함께

데이터를 요청한다.

5. 서버는 요청을 받을때 마다 토큰을 검증하고 요청에 응답한다.

 

토큰 인증 타입

Basic

사용자 아이디와 암호를 Base64로 인코딩한 값을 토큰으로 사용한다.

 

Bearer

JWT 혹은 OAuth 에 대한 토큰을 사용한다.

 

Digest

서버에서 난수 데이터 문자열을 클라이언트에 보낸다. 클라이언트는 사용자 정보와 난수를

포함하는 해시값을 사용하여 응답한다.

 

 

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.