사용자 인증과 JSON Web Token

eeensu·2023년 11월 21일
0

용어 정리와 팁

목록 보기
16/26
post-thumbnail

사용자 인증

사용자 인증은 주로 사용자를 식별하고, 서비스를 제공하는 서버에 사용자가 입력한 정보를 저장하고 인증하는 과정을 뜻한다. 이러한 과정은 일반적으로 아이디와 비밀번호를 사용한 로그인 혹은 소셜 미디어를 통한 로그인을 통해 이루어진다. 또한, OAuth라는 표준을 통해 구글, 페이스북, 네이버, 카카오와 같은 서비스는 사용자가 다른 서비스에 과거에 입력한 정보를 바탕으로 회원가입을 허용하기도 한다. 인증의 순서는 아래와 같다.

  • 로그인
    사용자는 아이디와 비밀번호, 혹은 다른 인증 수단을 사용하여 로그인을 시도한다. 로그인 정보는 서버로 전송되며, 서버는 이 정보를 검증한다.

  • 인증 검증
    서버는 제공된 인증 정보를 확인하고 사용자의 신원을 확인한다. 비밀번호 검증, 소셜 미디어 로그인, 다중 요소 인증 등이 사용될 수 있다.

  • 세션 또는 토큰 생성
    유효한 인증 정보로 확인된 사용자에게 세션 ID나 토큰을 발급한다. 이를 통해 사용자는 이후에도 인증된 상태를 유지할 수 있다.

  • 세션 관리: 세션 또는 토큰을 사용하여 인증된 사용자를 식별하고, 해당 사용자가 요청한 리소스에 접근할 권한이 있는지 확인한다.

  • 로그아웃
    사용자는 로그아웃하여 세션을 종료하고 인증 상태를 해제할 수 있다.




JSON Web Token (JWT)

OAuth는 RFDC 5849 국제 표준으로, 사용자 인증 및 서비스 간 정보 교환을 위한 프레임워크이다. 이는 OAuth 1.0과 2.0 버전이 있는데, OAuth 2.0은 보안을 강화하고 사용하기 쉬운 방식을 제공한다.

또한 이 과정에서 JSON Web Token (JWT)이 사용된다. JWT는 토큰 기반의 인증 시스템을 구현하기 위해 간결하게 데이터를 표현하고 효율적으로 전송하는 형식을 갖고 있다. JWT는 일반적으로 헤더, 페이로드, 서명의 세 부분으로 구성된다.

클라이언트가 로그인 후 JWT를 발급받으면, 이 토큰을 저장하고 서버에 전송하여 API 호출 시에 인증 정보로 사용된다. JWT는 HTTP 헤더의 Authorization 항목에 'Bearer ${jwt}'와 같은 방식으로 전송된다. 서버는 헤더에서 JWT를 추출하여 해당 토큰의 값을 확인하고 작업을 decode를 수행한 뒤 작업 결과를 클라이언트에 반환한다.

JWT는 다음의 3가지로 구성되어 있다.


구성 요소

  • Header(헤더)
    JWT의 유형 및 사용되는 알고리즘을 지정하는 부분이다. 이 정보는 JSON 형태로 인코딩되고, 일반적으로 다음과 같은 형식을 가진다.
{
  "alg": "HS256",			// 알고리즘 방식
  "typ": "JWT"				// 토큰의 타입
}

  • Payload(페이로드)
    토큰에 포함되는 클레임(claim) 정보를 담고 있는 부분이다. 클레임은 사용자에 대한 정보, 권한, 토큰의 만료 시간 등을 나타낸다. 등록된 클레임(토큰의 기본 정보), 공개 클레임(사용자 정의 정보), 비공개 클레임(사용자 정의 정보)으로 구성되어 있으며 이 정보는 JSON 형식으로 표현되고, 클라이언트와 서버 간의 안전한 정보 교환을 가능하게 한다.
{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

  • Sigature(서명)
    서명은 헤더, 페이로드, 그리고 비밀 키를 이용하여 생성되는 부분이다. 서명을 통해 토큰이 유효하고 변조되지 않았음을 확인할 수 있다.
HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  secret
)


최종적으로 발급된 JWT의 구조는 아래와 같다.

[header].[payload].[signature]


JWT의 장점

  • 간결함
    JSON 형식으로 표현되며, 헤더와 페이로드를 Base64로 인코딩하여 구성되어 있어 간결하고 가볍다.

  • 자가 수용적(Self-contained)
    토큰에 필요한 모든 정보가 포함되어 있어 서버의 상태를 유지할 필요가 없다.

  • 확장성
    토큰을 사용하면 서버의 부하를 줄이고, 분산 시스템에서도 유연하게 사용할 수 있다.

  • 보안성
    서명을 통해 토큰의 무결성을 검증하고, 특정 알고리즘을 사용하여 서명을 생성하여 안전한 통신이 가능하다.


JWT는 주로 웹 애플리케이션의 사용자 인증, 권한 부여, 다른 서비스 간의 통신에서 사용된다. 하지만 토큰이 클라이언트에 저장되기 때문에 보안에 민감한 정보는 토큰에 담기지 않아야 하며, 토큰은 HTTPS와 함께 사용하는 것이 좋다.

profile
안녕하세요! 26살 프론트엔드 개발자입니다! (2024/03 ~)

0개의 댓글