JWT

지원·2026년 4월 3일

SpringBoot

목록 보기
17/17
post-thumbnail

토큰 기반 인증

  • JWT 기반 인증은 JWT 토큰을 HTTP 헤더에 실어 서버가 클라이언트를 식별한다.
  • JWT의 구조는 세가지 문자열의 조합이다. Header, Payload, Signature로 이루어져있다.
  • alg: 정보를 암호화할 해싱 알고리즘
  • typ 토큰의 타입을 지정
	"alg": "HS256",
	"typ": "JWT"

Payload

  • 실제로 토큰에 담을 정보. 클라이언트 고유 ID, 유효 기간 등이 포함된다.
  • Key-Value 형식으로 이루어진 한 쌍의 정보를 Claim이라고 한다.
	"sub": "0123456789",
	"name": "김지원",
	"iat": 1516230922

Signature

  • 인코딩된 Header, Payload를 더한 뒤, 비밀키로 해싱하여 생성
  • HeaderPayload는 단순 인코딩된 값이기 때문에 해커가 복호화하고 조작할 수 있지만, Signature는 서버 측에서 관리하는 비밀키가 유출되지 않는 이상 복호화할 수 없다.
  • 따라서 Signature는 토큰의 위변주 여부를 확인하는 데 사용된다.
HMACSHA256(
	base64UrlEncode(header) + "." +
	base64UrlEncode(payload),
	secret_key
)

토큰 인증 과정

  • 사용자 로그인 요청
  • 서버는 검증 후 사용자 고유 ID값(+a)을 Payload에 담는다.
  • JWT 유효기간 설정
  • SECRET KEY를 사용해서 Access Token(JWT)을 발급한다.
  • 사용자는 Access Token을 받아 저장한다. 이후 서버에 요청할 때마다 토큰을 요청 헤더 Authorization에 포함시켜 전달한다.
  • 서버는 토큰의 Signature 을 SECRET KEY로 복호화한 다음, 위변조 여부유효 기간 등을 확인한다.
  • 검증이 완료 되면, Payload를 디코딩 하여 사용자의 ID에 맞는 데이터를 가져온다.

In my project

의존성 추가

  • build.gradle
	implementation 'io.jsonwebtoken:jjwt-api:0.13.0'
	runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.13.0'
	runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.13.0'

application.yaml 추가

  • secret.key 생성
$bytes = New-Object byte[] 64
[System.Security.Cryptography.RandomNumberGenerator]::Create().GetBytes($bytes)
[Convert]::ToBase64String($bytes)
  • application.yaml에 추가. secret키는 환경변수로 빼기
jwt:
  secret: ${JWT_SECRET}
  access-token-expiration: 3600000	//1시간

참고

https://tecoble.techcourse.co.kr/post/2021-05-22-cookie-session-jwt/

profile
개발 공부하는 김지원

0개의 댓글