인증의 종류

1. 세션 인증 다시 살펴보기.

기본적으로 브라우저에서 사용자가 **인증(Authentication)**을 수행하면 서버에서는 사용자의 정보를 저장하고, 그 응답으로 JSESSIONID 라는 키를 이용해 클라이언트(사용자) 브라우저의 쿠키에 세션의 정보를 저장하게 됩니다.

이후 클라이언트는 브라우저 쿠키에 저장된 JSESSIONID 로 저장된 세션 정보를 이용해 **인가(Authrization)**된 정보에 접근할 수 있게 됩니다.

2. 토큰 인증 방식 알아보기.

토큰인증 방식은 사용자가 인증을 수행하면 서버에서는 토큰을 생성한 뒤에 저장하지 않고(stateless) 토큰값을 사용자의 브라우저에게 응답합니다.

이 토큰 값을 사용자가 인가된 사용자만 사용할 수 있는 서비스를 요청할 때 함께 보내게 되고, 서버에서 이 토큰을 의미 있는 값(보통은 사용자 정보)으로 해석하게 됩니다. 그리고 이 값으로 사용자를 인증하게 됩니다.

토큰은 username, user_id 등 사용자를 설명할 수 있는 데이터를 포함하게 됩니다. 참고로 이렇게 사용자를 설명할 수 있는 데이터를 클레임(claim) 이라고 합니다.

JWT(Json Web Token) 알아보기

토큰 인증 방식의 대표주자 입니다. JWT 토큰 구조는 HEADER.PAYLOAD.VERIFY_SIGNATURE 로 이루어져 있으며, 다음은 JWT 토큰의 예시 입니다. 각 데이터는 온점(.)으로 구분됩니다.

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9**.**eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ**.**SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

HEADER

HEADER 는 JWT를 검증하는데 필요한 정보를 가진 데이터입니다. VERIFY_SIGNATURE 에 사용한 암호화 알고리즘과 토큰 타입, keyid 등의 정보를 가지고 있습니다. 난해한 문자열처럼 보이지만 암호화된 값은 아닙니다.

HEADER 정보
{
  "typ": "JWT",    # 토큰 타입
  "alg": "HS256"   # 알고리즘
}

PAYLOAD

실질적으로 인증에 필요한 데이터를 저장합니다. 데이터 각각의 필드를 클레임(claim) 이라고 하고, 대부분의 경우 클레임에 username 또는 user_id 를 포함합니다. 인증시에 payload에 있는 username을 가져와서 사용자의 정보를 인증할 때 사용해야 하기 때문입니다.

또한 payload에서 중요하게 살펴보아야 할 정보는 **토큰 발행시간(iat)**와 토큰 만료시간(exp) 입니다. 토큰의 만료 시간이 지나면 새로운 토큰을 발급받아야 합니다.

PAYLOAD 정보
{
  "token_type": "access", # 토큰의 종류. 여기서는 access 토큰입니다.
  "exp": 1656293275, # 토큰의 만료시간입니다. (Numeric Date)
  "iat": 1656293095, # 토큰의 발행시간입니다. (Numeric Date)
  "jti": "2b45ec59cb1e4da591f9f647cbb9f6a3", # json token id 입니다.
  "user_id": 1 # 실제 사용자의 id값이 들어있습니다.
}