사용자 인증은 주로 사용자를 식별하고, 서비스를 제공하는 서버에 사용자가 입력한 정보를 저장하고 인증하는 과정을 뜻한다. 이러한 과정은 일반적으로 아이디와 비밀번호를 사용한 로그인 혹은 소셜 미디어를 통한 로그인을 통해 이루어진다. 또한, OAuth라는 표준을 통해 구글, 페이스북, 네이버, 카카오와 같은 서비스는 사용자가 다른 서비스에 과거에 입력한 정보를 바탕으로 회원가입을 허용하기도 한다. 인증의 순서는 아래와 같다.
로그인
사용자는 아이디와 비밀번호, 혹은 다른 인증 수단을 사용하여 로그인을 시도한다. 로그인 정보는 서버로 전송되며, 서버는 이 정보를 검증한다.
인증 검증
서버는 제공된 인증 정보를 확인하고 사용자의 신원을 확인한다. 비밀번호 검증, 소셜 미디어 로그인, 다중 요소 인증 등이 사용될 수 있다.
세션 또는 토큰 생성
유효한 인증 정보로 확인된 사용자에게 세션 ID나 토큰을 발급한다. 이를 통해 사용자는 이후에도 인증된 상태를 유지할 수 있다.
세션 관리: 세션 또는 토큰을 사용하여 인증된 사용자를 식별하고, 해당 사용자가 요청한 리소스에 접근할 권한이 있는지 확인한다.
로그아웃
사용자는 로그아웃하여 세션을 종료하고 인증 상태를 해제할 수 있다.
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가지로 구성되어 있다.
{
"alg": "HS256", // 알고리즘 방식
"typ": "JWT" // 토큰의 타입
}
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret
)
최종적으로 발급된 JWT의 구조는 아래와 같다.
[header].[payload].[signature]
간결함
JSON 형식으로 표현되며, 헤더와 페이로드를 Base64로 인코딩하여 구성되어 있어 간결하고 가볍다.
자가 수용적(Self-contained)
토큰에 필요한 모든 정보가 포함되어 있어 서버의 상태를 유지할 필요가 없다.
확장성
토큰을 사용하면 서버의 부하를 줄이고, 분산 시스템에서도 유연하게 사용할 수 있다.
보안성
서명을 통해 토큰의 무결성을 검증하고, 특정 알고리즘을 사용하여 서명을 생성하여 안전한 통신이 가능하다.
JWT는 주로 웹 애플리케이션의 사용자 인증, 권한 부여, 다른 서비스 간의 통신에서 사용된다. 하지만 토큰이 클라이언트에 저장되기 때문에 보안에 민감한 정보는 토큰에 담기지 않아야 하며, 토큰은 HTTPS와 함께 사용하는 것이 좋다.