abccoco 2022. 7. 27. 21:12

인증의 종류

1. 세션 인증

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

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

 

2. 토큰 인증

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

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

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

 

JWT(Json Web Token)

JWT는 토큰 방식의 인증을한다.

JWT 토큰 구조는 온점( . )으로 순서대로 header, payload, verify_signature 로 이루어져 있다.

하나씩 살펴보자.

# HEADER . PAYLOAD . VERIFY_SIGNATURE
# jwt 예시)
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

 

HEADER

HEADERJWT를 검증하는데 필요한 정보를 가진 데이터입니다.

VERIFY_SIGNATURE 에 사용한 암호화 알고리즘과 토큰 타입, keyid 등의 정보를 가지고 있습니다.

난해한 문자열처럼 보이지만 암호화된 값은 아닙니다.

 

PAYLOAD

실질적으로 인증에 필요한 데이터를 저장합니다. 데이터 각각의 필드를 클레임(claim) 이라고 하고,

대부분의 경우 클레임에 username 또는 user_id 를 포함합니다.

인증시에 payload에 있는 username을 가져와서 사용자의 정보를 인증할 때 사용해야 하기 때문입니다.

또한 payload에서 중요하게 살펴보아야 할 정보는 토큰 발행시간(iat)토큰 만료시간(exp) 입니다.

토큰의 만료 시간이 지나면 새로운 토큰을 발급받아야 합니다.

 

VERIFY SIGNATURE

header 와 payload는 암호화되지 않았기 때문에 두 개의 데이터만으로 토큰의 진위 여부 판단할 수 없습니다.

따라서 토큰의 진위 여부를 판단하기 위한 암호화된 데이터가 필요합니다.

JWT의 구조에서 가장 마지막에 있는 VERIFY SIGNATURE 는 토큰 자체의 진위여부를 판단하는 용도로 사용합니다.

VERIFY SIGNATURE 는 Base64UrlEncoding 된 header 와 payload 의 정보를 합친 뒤 SECRET_KEY 를 이용하여 Hash 를 생성하여 암호화 합니다.