본문 바로가기
부트캠프교육중/HTTP, 네트워크

토큰 Token

by 뭉지야 2023. 3. 9.
728x90

#토큰 인증방식은 최근 웹 애플리케이션에서 많이 사용되는 인증방식 중 하나이다.

 

#등장배경

-기존의 세션 기반 인증이 가지고 있던 한계를 극복하고자 고안되었다.

-세션기반인증은 서버에서 유저의 상태를 관리한다. 그래서 개발자들은 서버의 부담을 줄이기 위해 서버가 사용자의 인증상태를 저장하는 것이 아닌 클라이언트에 이를 저장하는 방법을 고민하게 되었고, 토큰이 등장하였다.

-토큰은 유저의 인증상태를 클라이언트에 저장할수있어서, 세션 인증 방식의 비교해 서버의 부하나 메모리 부족 문제를 줄일수있다. 

 

#토큰

-무언가를 이용할수있는 권한이나 자격을 나타내는 일종의 증표이다.

-웹 보안에서의 토큰은 인증과 권한 정보를 담고 있는 암호화된 문자열을 말한다.

이를 이용해 특정 애플리케이션에 대한 사용자의 접근 권한을부여할수있다.

 

 1. 사용자가 인증 정보를 담아 서버에 로그인 요청을 보낸다.

2. 서버는 데이터베이스에 저장된 사용자의인증정보를 확인한다.

3. 인증에 성공 -> 해당 사용자의 인증 및 권한 정보를 서버의 비밀키와 함께 토큰으로 암호화한다.

4. 생성된 토큰을 클라이언트로 전달한다.

HTTP상에서 인증 토큰을 보내기 위해 사용하는헤더인 Authorization헤더를 사용하거나, 쿠키로 전달하는 등의 방법을 사용한다.

5. 클라이언트는 전달받은 토큰을 저장한다.

저장하는 위치는 Local storage, Session Storage, Cookie 등 다양하다.

6. 클라이언트가 서버로 리소스를 요청할때 토큰을 함께 전달한다.

토큰을 보낼때에도 Authorization 헤더를 사용하거나 쿠키로 전달할수있다.

7. 서버는 전달받은 토큰을 서버의 비밀키를 통해 검증한다. 토큰이 위조된건지 유효기간이 지나지 않았는지 등을 확인.

8. 토큰이 유효하다면 클라이언트의 요청에 대한 응답 데이터를 전송한다.

 

#토큰 인증 방식의 장점    

  • 무상태성
    -서버가 유저의 인증 상태를 관리하지 않는다. 서버는 비밀키를 통해 클라이언트에서 보낸 토큰의 유효성만 검증하면 되기 때문에 무상태적인 아키텍처를 구축할수있다.
  • 확장성
    -다수의 서버가 공통된 세션 데이터를 가질 필요가 없다는 것도 토큰 기반 인증의 장점이다. 이를통해 서버를 확장하기 더 용이하다.
  • 어디서나 토큰 생성 가능
    -토큰의 생성과 검증이 하나의 서버에서 이루어지지 않아도 되기 때문에 토큰 생성만을 담당하는 서버를 구축할수있다. 이를 잘 활용하면 여러 서비스 간의 공통된 인증 서버를 구현할수있다.
  • 권한 부여에 용이
    -토큰은 인증상태, 접근 권한 등 다양한 정보를 담을 수 있기 때문에 사용자 권한 부여에 용이하다. 이를 활용해 어드민 권한 부여 및 정보에 접근할수있는 범위도 설정할수있다.

# JWT (JSON Web Token)

- 토큰 기반 인증 구현시 대표적으로 사용하는 기술.

- JSON 객체에 정보를 담고 이를 토큰으로 암호화하여 전송할수있는 기술이다.

-클라이언트가 서버에 요청을 보낼때, 인증정보를 암호화된 JWT 토큰으로 제공하고, 서버는 이 토큰을 검증하여 인증정보를 확인할수있다.

 

# JWT의 구성

1. Header

- HTTP의 헤더처럼 해당 토큰 자체를 설명하는 데이터가 담겨있다. 

-토큰의 종류, 그리고 시그니처를 만들때 사용할 알고리즘을 JSON 형태로 작성한다.

{
  "alg": "HS256",
  "typ": "JWT"
}

이 JSON 객체를 base64방식으로 인코딩하면 JWT의 첫번째 부분인 header가 완성된다.

-base64 방식은 원한다면 얼마든지 디코딩할수있는 인코딩 방식이다.

 

2. Payload

- http의 페이로드와 마찬가지로 전달하려는 내용물을 담고있는 부분이다. 

-어떤 정보에 접근 가능한지에 대한 권한, 유저의 이름과 같은 개인정보, 토큰의 발급 시간 및 만료 시간 등의 정보들을 JSON형태로 담는다.

{
  "sub": "someInformation",
  "name": "phillip",
  "iat": 151623391
}

이 JSON 객체를 base64로 인코딩하면 JWT의 두번째 부분인 Payload가 완성된다.

 

3. Signature

- 토큰의 무결성을 확인할수있는 부분이다.

- header와 payload가 완성되었다면, signature는 이를 서버의 비밀키(암호화에 추가할 salt)와 header에서 지정한 알고리즘을 사용하여 해싱한다.

-누군가 권한을 속이기 위해 토큰의 Payload를 변조하는 등의 시도를 하더라도 토큰을 발급할때 사용한 secret을 정확하게 알고 있지 못한다면 유효한 signature를 만들어낼수 없기 때문에 서버는 signiture를 검증하는 단계에서 올바르지 않은 토큰임을 알아낼수있다.


# 토큰 인증 방식의 한계

-signature을 사용해서 위조된 토큰을 알아낼수는 있지만, 토큰 자체가 탈취된다면 토큰 인증 방식의 한계가 드러난다.

-무상태성: 인증상태를 관리하는 주체가 서버가 아니므로, 토큰이 탈취되어도 해당 토큰을 강제로 만료시킬수 없다. 따라서 토큰이 만료될때까지 사용자로 가장해 계속해서 요청을 보낼수있다.

-유효기간: 토큰이 탈취되는 상황을 대비해서 유효 기간을 짧게 설정하면, 사용자는 토큰이 만료될때마다 다시 로그인을 진행해야 하기 때문에 좋지 않은 사용자 경험을 제공한다. 그렇다고 유효 기간을 길게 설정하면 토큰이 탈취될 경우 더 치명적으로 작용할수있다.

-토큰의크기: 토큰에 여러 정보를 담을수 있는 만큼, 많은 데이터를 담으면 그만큼 암호화하는 과정도 길어지고 토큰의 크기도 커지기 때문에 네트워크 비용 문제가 생길수 있다.


*토큰인증의 한계를 극복하기 위한 대표적인 구현방법으로 액세스토큰과 리프레시 토큰을 함께 사용하는 것이다.

 

#액세스 토큰 (Access Token)

- 서버에 접근하기 위한 토큰. 

- 보안을 위해 보통 24시간정도의 짧은 유효기간이 설정되어 있다.

 

#리프레시 토큰 (Refresh Token)

- 서버 접근을 위한 토큰이 아닌 액세스 토큰이 만료되었을때 새로운 액세스 토큰을 발급받기 위해 사용되는 토큰.

- 리프레시 토큰은 액세스 토큰보다 긴 유효기간을 설정한다.

 

*이렇게 두가지의 각기 다른 토큰을 사용하는 경우, access token이 만료되어도 refresh token의 유효기간이 남아있다면 사용자는 다시 로그인을 할 필요없이 지속해서 인증 상태를 유지할수있다.

그러나, refresh token은 긴 유효기간을 가지고 있어 해당 토큰마저 탈취된다면 토큰의 긴 유효기간동안 악의적인 유저가 계속해서 액세스 토큰을 생성하고 사용자의 정보를 해킹할수도 있기 때문이다. 이를 대비하기 위해 refresh token을 세션처럼 서버에 저장하고 이에 대한 상태를 관리하기도 한다.

 

 *결국 개발자로서 내가 구현하려는 서비스에 어떤 인증방식이 가장 적절한지 판단하고 의사결정 할 줄 아는 것이 가장 중요하다.

728x90

'부트캠프교육중 > HTTP, 네트워크' 카테고리의 다른 글

OAuth  (0) 2023.03.09
쿠키/세션/토큰  (0) 2023.03.09
해싱 Hashing  (0) 2023.03.09
Session  (0) 2023.03.09
Cookie  (0) 2023.03.09