[JWT] Bearer는 왜 붙을까? Basic 인증과 Bearer 인증 비교하기

2025. 10. 29. 20:30·Back-End/Spring

JWT 기반 인증 기능을 구현하면서 access token을 요청 헤더에 담아 보내는 코드를 작성하고 있었다.

보통 클라이언트는 로그인 후 발급받은 JWT를 다음과 같은 형태로 서버에 전달한다.

Authorization: Bearer eyJhbGciOiJIUzI1NiJ9...

Spring Boot에서 JWT 인증 필터를 구현할 때도 자주 다음과 같은 코드를 작성한다.

String authorizationHeader = request.getHeader("Authorization");

if (authorizationHeader != null && authorizationHeader.startsWith("Bearer ")) {
    String token = authorizationHeader.substring(7);
}

처음에는 Bearer를 단순히 JWT 앞에 붙이는 접두사 정도로 생각했다.

하지만 문득 한 가지 궁금점이 생겼다.

JWT 자체가 이미 토큰인데, 왜 앞에 Bearer라는 문자열을 붙여서 보내는 걸까?

이 궁금증을 정리하다 보니 Bearer는 JWT의 일부가 아니라, HTTP Authorization 헤더에서 사용하는 인증 방식 중 하나라는 점을 알게 되었다.

Authorization 헤더는 어떻게 구성될까?

Authorization 헤더는 클라이언트가 서버에 인증 정보를 전달할 때 사용하는 HTTP 헤더다.

형태는 다음과 같이 이해할 수 있다.

Authorization: <인증 방식> <인증 정보>

즉, Authorization 헤더는 단순히 토큰만 담는 공간이 아니라, 이 인증 정보를 어떤 방식으로 해석해야 하는지도 함께 전달한다.

예를 들어 Basic 인증은 다음과 같은 형태를 사용한다.

Authorization: Basic <credentials>

Bearer 인증은 다음과 같은 형태를 사용한다.

Authorization: Bearer <token>

따라서 Bearer는 JWT의 일부가 아니라, 뒤에 오는 값을 Bearer 방식의 인증 정보로 해석하라는 의미다.

Basic 인증이란?

Basic 인증은 사용자 ID와 비밀번호를 이용하는 가장 단순한 인증 방식이다.

일반적으로 사용자ID:비밀번호 형태의 문자열을 Base64로 인코딩한 뒤, Basic 인증 방식과 함께 전달한다.

Authorization: Basic base64(username:password)

예를 들어 다음과 같은 사용자 정보가 있다고 가정해보자.

username: user
password: password

이를 user:password 형태로 만든 뒤 Base64 인코딩하면 다음과 같은 값이 된다.

Authorization: Basic dXNlcjpwYXNzd29yZA==

Basic 인증의 장점은 단순하다는 점이다.
별도의 토큰 발급 과정 없이 사용자 ID와 비밀번호만으로 인증을 처리할 수 있다.

하지만 단점도 명확하다.

Base64는 암호화가 아니라 인코딩이다.
즉, 값을 다시 디코딩하면 원래의 사용자 ID와 비밀번호를 확인할 수 있다.

따라서 Basic 인증을 사용할 때는 반드시 HTTPS를 통해 요청이 전송되어야 한다.

Bearer 인증이란?

Bearer 인증 방식은 OAuth 2.0 프레임워크에서 사용하는 토큰 인증 방식이다.

형태는 다음과 같다.

Authorization: Bearer <token>

여기서 Bearer는 “소지자”라는 의미를 가진다.
즉, Bearer 인증은 쉽게 말하면 “이 토큰을 가진 요청을 인증 정보로 사용하겠다”는 방식이다.

JWT 기반 인증에서는 보통 로그인 성공 시 서버가 access token을 발급한다.

이후 클라이언트는 API 요청마다 해당 토큰을 Authorization 헤더에 담아 보낸다.

Authorization: Bearer <JWT>

서버는 전달받은 JWT를 검증한다.

검증 과정에서는 보통 다음과 같은 내용을 확인한다.

- 토큰이 변조되지 않았는지
- 토큰이 만료되지 않았는지
- 토큰에 담긴 사용자 정보가 유효한지
- 요청한 API에 접근할 권한이 있는지

즉, Bearer 인증은 토큰만 있으면 무조건 인증되는 방식이 아니라, 서버가 해당 토큰을 검증한 뒤 인증된 요청으로 처리하는 방식이다.

Basic 인증과 Bearer 인증 비교

두 방식의 차이를 정리하면 다음과 같다.

구분 Basic 인증 Bearer 인증
헤더 형식 Authorization: Basic <credentials> Authorization: Bearer <token>
인증 정보 사용자 ID와 비밀번호를 Base64 인코딩한 값 access token
핵심 방식 사용자 정보를 직접 전달 발급받은 토큰을 전달
장점 구조가 단순하다 토큰 만료 시간, 권한 정보 등을 활용할 수 있다
주의할 점 Base64는 암호화가 아니므로 HTTPS가 필수다 토큰 탈취 시 위험하므로 HTTPS와 만료 시간 관리가 중요하다
주 사용 사례 간단한 API 인증, 서버 간 인증 JWT 인증, OAuth2 기반 인증

Basic 인증은 사용자 정보를 직접 전달하는 방식에 가깝다.
반면 Bearer 인증은 사용자가 로그인 후 발급받은 토큰을 전달하는 방식이다.

따라서 현대적인 로그인 기반 서비스에서는 Bearer 인증을 더 자주 사용한다.

특히 JWT를 사용하면 토큰 안에 사용자 식별자, 만료 시간, 권한 정보 등을 담을 수 있기 때문에 서버는 요청마다 토큰을 검증해 사용자를 식별할 수 있다.

Spring Boot에서는 어떻게 처리할까?

Spring Boot에서 JWT 인증 필터를 구현할 때는 보통 Authorization 헤더를 읽고, Bearer 형식인지 확인한 뒤 실제 토큰만 추출한다.

private String resolveToken(HttpServletRequest request) {
    String authorizationHeader = request.getHeader("Authorization");

    if (authorizationHeader != null && authorizationHeader.startsWith("Bearer ")) {
        return authorizationHeader.substring(7);
    }

    return null;
}

여기서 substring(7)을 사용하는 이유는 "Bearer "의 길이가 7이기 때문이다.

Bearer eyJhbGciOiJIUzI1NiJ9...
       ↑
       여기부터 실제 JWT

즉, 서버는 Bearer 부분을 제거하고 실제 JWT만 꺼내 검증한다.

처음에는 단순한 문자열 처리처럼 보였지만, 실제로는 HTTP 인증 헤더의 구조를 따르는 코드였다.

주의할 점

Bearer 방식을 사용한다고 해서 토큰이 자동으로 안전해지는 것은 아니다.

Bearer 토큰은 “토큰을 가진 요청”이 인증 정보로 사용되기 때문에, 토큰이 탈취되면 다른 사용자가 해당 토큰으로 요청을 보낼 수 있다.

따라서 JWT 기반 Bearer 인증을 사용할 때는 다음과 같은 점을 함께 고려해야 한다.

- HTTPS를 사용한다.
- access token의 만료 시간을 짧게 가져간다.
- refresh token은 더 신중하게 관리한다.
- Authorization 헤더가 로그에 그대로 남지 않도록 주의한다.
- JWT payload에 비밀번호 같은 민감 정보를 넣지 않는다.

특히 JWT의 payload는 암호화된 값이 아니라 Base64URL로 인코딩된 값이다.
따라서 토큰을 디코딩하면 payload 내용을 확인할 수 있으므로, 민감한 정보를 담지 않는 것이 중요하다.

정리

JWT 인증을 구현하면서 Authorization: Bearer <JWT> 형태를 자연스럽게 사용하고 있었다.

하지만 Bearer는 단순히 JWT 앞에 붙이는 문자열이 아니었다.

Authorization 헤더는 인증 방식과 인증 정보를 함께 전달하는 구조이고, Bearer는 그중 토큰 기반 인증 방식을 나타내는 값이었다.

  1. Authorization 헤더는 인증 정보를 전달하기 위한 HTTP 헤더다.
  2. Basic 인증은 사용자 ID와 비밀번호를 Base64 인코딩해 전달하는 방식이다.
  3. Bearer 인증은 access token을 전달하고, 서버가 해당 토큰을 검증하는 방식이다.
  4. JWT는 토큰의 형식이고, Bearer는 그 토큰을 전달하는 인증 방식이다.

이번 내용을 정리하고 나니 JWT 필터에서 작성하던 startsWith("Bearer ")와 substring(7) 코드도 단순한 문자열 처리가 아니라, HTTP 인증 구조를 따르는 코드라는 점을 이해할 수 있었다.

한 줄 정리

Authorization 헤더는 인증 방식 + 인증 정보 형태로 구성된다.

Bearer는 “이 토큰을 가진 사람에게 접근 권한을 부여하는 인증 방식”이다.
Basic은 사용자 정보를 인코딩해 전달하는 방식이고, Bearer는 토큰을 전달해 서버가 검증하도록 하는 인증 방식이다.

'Back-End > Spring' 카테고리의 다른 글

ID값을 UUID v4에서 UUID v7로 변경한 이유  (0) 2025.11.21
UUID만으로 구분하기 어려운 데이터를 @PrePersist로 개선해보기  (0) 2025.11.11
[SpringBoot] 스프링부트는 어떻게 응답(Response)할까요?  (0) 2025.10.20
[SpringBoot] ApplicationContext란?  (0) 2025.09.29
[SpringBoot] 디스패처 서블릿(DispatcherServlet)이란?  (0) 2025.09.23
'Back-End/Spring' 카테고리의 다른 글
  • ID값을 UUID v4에서 UUID v7로 변경한 이유
  • UUID만으로 구분하기 어려운 데이터를 @PrePersist로 개선해보기
  • [SpringBoot] 스프링부트는 어떻게 응답(Response)할까요?
  • [SpringBoot] ApplicationContext란?
devoks
devoks
느려도 꾸준히
  • devoks
    ok's 개발일지
    devoks
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Front-End
      • Back-End
        • Spring
        • Infra
        • AI
      • Computer Science
        • Cs
      • 언어
        • Java
        • SQL
      • 코테
        • Java
        • MySQL
      • Etc.
  • 블로그 메뉴

    • 홈
  • 링크

    • My GitHub
  • 공지사항

  • 인기 글

  • 태그

    codingtest
    springboot
    역직렬화
    replace
    StringTokenizer
    BufferedReader
    Regex
    programmers
    정규표현식
    CI/CD
    CS
    유클리드호제법
    switch
    BFS
    IaaS
    json
    Container
    compare
    dfs
    stack
    최대공약수
    persist
    PrePersist
    PaaS
    effectivejava
    docker
    최대공배수
    java
    BufferedWriter
    replaceAll
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
devoks
[JWT] Bearer는 왜 붙을까? Basic 인증과 Bearer 인증 비교하기
상단으로

티스토리툴바