웹 인증 방식 총정리 (Authentication)

한눈에 보기

웹 서비스의 인증은 요청을 보낸 사용자가 누구인지 확인하는 절차다. HTTP는 무상태 프로토콜이므로 로그인 이후 요청마다 사용자를 식별할 수단이 필요하며, 세션, 토큰, API 키, OAuth를 비교해 각 방식의 적합한 상황을 정리한다.

최종 업데이트 2026.09.17

웹 서비스의 인증(Authentication)은 요청을 보낸 사용자가 누구인지 확인하는 절차이고, 인가(Authorization)는 확인된 사용자가 특정 자원에 접근할 권한이 있는지 판단하는 절차다. HTTP는 상태를 저장하지 않는 프로토콜이므로, 로그인 이후의 요청마다 사용자를 다시 식별할 수단이 필요하다. 이 문서는 세션 기반 인증, 토큰 기반 인증, API 키, OAuth를 큰 그림에서 비교하며 각 방식이 어떤 상황에 적합한지 정리한다.

왜 별도의 인증 상태 관리가 필요한가

HTTP의 무상태성(Statelessness)은 각 요청이 독립적으로 처리된다는 뜻이다. 서버는 직전 요청에서 누가 로그인했는지 기억하지 않으므로, 매 요청마다 아이디와 비밀번호를 다시 보내지 않는 한 사용자를 구분할 수 없다. 그러나 비밀번호를 매번 전송하는 것은 유출 위험을 키우고 사용자 경험도 나쁘다. 그래서 실제 서비스는 최초 로그인에서 자격 증명(Credential)을 한 번만 검증하고, 이후에는 그 검증 결과를 대신 증명하는 값을 주고받는다. 이 값을 서버가 보관하면 세션 방식이 되고, 클라이언트가 보관하면 토큰 방식이 된다. 이 저장 위치의 차이가 확장성, 무효화 가능성, 보안 특성의 차이로 이어진다.

세션 기반 인증

세션(Session) 방식은 로그인 성공 시 서버가 세션 저장소에 사용자 정보를 기록하고, 그 항목을 가리키는 무작위 세션 식별자(Session ID)를 쿠키(Cookie)로 클라이언트에 내려준다. 이후 브라우저는 요청마다 쿠키를 자동으로 첨부하고, 서버는 식별자로 저장소를 조회해 사용자를 알아낸다. 인증 상태의 원본이 서버에 있으므로, 관리자가 저장소에서 세션을 삭제하면 즉시 강제 로그아웃이 가능하다는 점이 큰 장점이다. 반면 서버가 상태를 들고 있어야 하므로 서버를 여러 대로 늘리면 세션 공유 문제가 생긴다. 보통 레디스(Redis) 같은 공용 세션 저장소를 두어 해결하지만, 그만큼 조회 비용과 운영 부담이 늘어난다. 전통적인 서버 렌더링 웹 서비스나 단일 도메인 서비스에 잘 맞는다.

토큰 기반 인증

토큰(Token) 방식은 로그인 성공 시 서버가 사용자 정보와 만료 시각을 담아 서명한 토큰을 발급하고, 클라이언트가 이를 보관했다가 요청 헤더의 Authorization 필드에 실어 보낸다. 대표 구현이 JWT(JSON Web Token)다. 서버는 서명만 검증하면 저장소 조회 없이 사용자를 식별할 수 있어 무상태 구조가 유지되고, 서버 확장이 쉬우며 모바일 앱이나 서로 다른 도메인의 API 호출에도 자연스럽다. 대신 이미 발급한 토큰은 만료 전까지 서버가 되돌릴 수 없다는 약점이 있다. 그래서 실무에서는 수명이 짧은 액세스 토큰(Access Token)과 수명이 긴 리프레시 토큰(Refresh Token)을 나누어, 액세스 토큰이 만료되면 리프레시 토큰으로 재발급받는 구조를 쓴다. 토큰의 상세 구조와 검증 원리는 JWT 문서에서 따로 다룬다.

API 키와 OAuth

API 키(API Key)는 서비스가 발급한 긴 무작위 문자열을 요청에 포함시키는 가장 단순한 방식이다. 사람 사용자보다는 서버 간 통신이나 외부 개발자에게 공개하는 API의 호출자 식별, 사용량 측정, 요금 부과에 주로 쓰인다. 키 하나로 모든 권한이 열리는 경우가 많아 유출 시 피해가 크므로, 코드 저장소에 넣지 않고 환경 변수나 비밀 관리 도구로 다루며 주기적으로 교체해야 한다. OAuth(OAuth 2.0)는 인증 그 자체보다는 위임(Delegation)을 위한 표준이다. 사용자가 비밀번호를 제3자 앱에 넘기지 않고도, 구글이나 깃허브(GitHub) 같은 제공자가 발급한 액세스 토큰으로 자기 자원에 대한 접근 권한을 앱에 빌려줄 수 있게 한다. 흔히 말하는 소셜 로그인은 OAuth 위에 신원 정보 전달을 얹은 OIDC(OpenID Connect)로 구현된다. 구체적인 흐름은 OAuth 문서에서 깊게 다룬다.

방식별 비교

구분세션토큰(JWT)API 키OAuth 2.0
상태 저장 위치서버클라이언트서버(키 목록)인가 서버
즉시 무효화쉽다어렵다쉽다제공자 정책에 따른다
수평 확장공유 저장소 필요유리하다보통해당 없음
주 사용처단일 도메인 웹SPA, 모바일, API서버 간 통신제3자 권한 위임
유출 시 위험세션 탈취만료까지 도용 가능전체 권한 노출범위(Scope) 내 접근

어느 방식이 절대적으로 우월한 것은 아니다. 강제 로그아웃과 세밀한 통제가 중요하면 세션이, 다수의 클라이언트 종류와 서버 확장이 중요하면 토큰이 유리하다. 실제 서비스는 세션과 토큰을 섞거나, 사용자 인증은 세션으로 하고 외부 API는 키로 보호하는 식으로 혼합해 쓰는 경우가 많다.

면접에서 이렇게 물어본다

  • HTTP가 무상태 프로토콜인데도 로그인 상태가 유지되는 원리를 설명해 보라.
  • 세션 기반 인증과 토큰 기반 인증의 장단점을 서버 확장성 관점에서 비교해 보라.
  • JWT를 쓰면 왜 강제 로그아웃이 어려운지, 이를 보완하는 방법은 무엇인지 말해 보라.
  • API 키와 OAuth 액세스 토큰은 어떤 상황에서 각각 적합한가.
  • 인증과 인가의 차이를 실제 서비스 사례를 들어 설명해 보라.
웹 문서 전체 보기

이 개념, 내 코드에서는 어떻게 물어볼까요

데브핏(DevFit)에 채용공고 URL을 붙여 넣고 레포지토리를 연결하면, 내가 쓴 커밋에서 예상 질문과 어필 포인트를 만듭니다. 하루 10회까지 무료입니다. 합불 판정이나 지원자 랭킹은 만들지 않고, 최종 판단은 사람이 합니다.

공고 넣고 시작하기