[프로그래밍 기록] Spring - JWT란

김엄지·2024년 3월 25일
0

Spring

목록 보기
19/21

JWT란?

  • JWT(Json Web Token)란 JSON 포맷을 이용하여 사용자에 대한 속성을 저장하는 Claim 기반의 Web Token
  • 일반적으로 쿠키 저장소를 사용하여 JWT 저장

JWT의 구조

  • Header, Payload, Signiture 세 세그먼트가 모여서 하나의 JWT 토큰이 됨

  • Header
    토큰에 대한 메타 데이터를 포함하고 있다. 메타 데이터란 타입, 해싱 알고리즘, SHA256 등을 뜻한다.

  • Payload
    실제적으로 담긴 데이터다. 유저 정보, 만료 기간 등이 담겨 있다. 필요한 데이터만 넣는 것이 중요하나, 보안의 위험 때문에 중요한 데이터 삽입은 지양하는 게 좋다.

  • Signiture
    토큰이 보낸 사람에 의해 시크릿키로 서명되었으며 조작되지 않았음을 확인하는 데 사용된다. 위 사진에서 볼 수 있듯이 base64로 인코딩된 Header와 Payload + 서명 알고리즘 + 시크릿키(혹은 퍼블릭키)가 조합되어 생성된다.

JWT 사용

  • 로그인 정보를 Server 에 저장하지 않고, Client 에 로그인 정보를 JWT 로 암호화하여 저장 → JWT 통해 인증/인가

  • 모든 서버에서 동일한 Secret Key 소유

  • Secret Key 통한 암호화 / 위조 검증 (복호화 시)

JWT 장/단점

  1. 장점
    • 동시 접속자가 많을 때 서버 측 부하 낮춤
    • Client, Sever 가 다른 도메인을 사용할 때
      • 예) 카카오 OAuth2 로그인 시 JWT Token 사용
  2. 단점
    • 구현의 복잡도 증가
    • JWT 에 담는 내용이 커질 수록 네트워크 비용 증가 (클라이언트 → 서버)
    • 기 생성된 JWT 를 일부만 만료시킬 방법이 없음
    • Secret key 유출 시 JWT 조작 가능

JWT 사용 흐름

  • Client 가 username, password 로 로그인 성공 시
    - 서버에서 "로그인 정보" → JWT 로 암호화 (Secret Key 사용)
    • 서버에서 직접 쿠키를 생성해 JWT를 담아 Client 응답에 전달(JWT 전달방법은 개발자가 정함)
    • 브라우저 쿠키 저장소에 자동으로 JWT 저장됨
  • Client 에서 JWT 통해 인증방법
    - 서버에서 API 요청 시마다 쿠키에 포함된 JWT를 찾아서 사용
    • 쿠키에 담긴 정보가 여러 개일 수 있기 때문에 그 중 이름이 JWT가 담긴 쿠키의 이름과 동일한지 확인하여 JWT를 가져옴
    • 쿠키 찾는 코드
// HttpServletRequest 에서 Cookie Value : JWT 가져오기
public String getTokenFromRequest(HttpServletRequest req) {
    Cookie[] cookies = req.getCookies();
    if(cookies != null) {
        for (Cookie cookie : cookies) {
            if (cookie.getName().equals(AUTHORIZATION_HEADER)) {
                try {
                    return URLDecoder.decode(cookie.getValue(), "UTF-8"); // Encode 되어 넘어간 Value 다시 Decode
                } catch (UnsupportedEncodingException e) {
                    return null;
                }
            }
        }
    }
    return null;
}
  • Server
    - Client 가 전달한 JWT 위조 여부 검증 (Secret Key 사용)
    - JWT 유효기간이 지나지 않았는지 검증
    - 3. 검증 성공시, JWT → 에서 사용자 정보를 가져와 확인
    ex) GET /api/products : JWT 보낸 사용자의 관심상품 목록 조회

JWT 다루기

프로젝트 설정

JWT dependency 추가하기

// JWT
compileOnly group: 'io.jsonwebtoken', name: 'jjwt-api', version: '0.11.5'
runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-impl', version: '0.11.5'
runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-jackson', version: '0.11.5'

application.properties

jwt.secret.key=7Iqk7YyM66W07YOA7L2U65Sp7YG065+9U3ByaW5n6rCV7J2Y7Yqc7YSw7LWc7JuQ67mI7J6F64uI64ukLg==

JwtUtil 만들기

  • Util 클래스란 특정 매개 변수(파라미터)에 대한 작업을 수행하는 메서드들이 존재하는 클래스를 뜻함
  • 다른 객체에 의존하지 않고 하나의 모듈로서 동작하는 클래스
  • JWT 관련 기능들을 가진 JwtUtil이라는 클래스를 만들어 JWT 관련 기능을 수행

<JWT 관련 기능>
1. JWT 생성
2. 생성된 JWT를 Cookie에 저장
3. Cookie에 들어있던 JWT 토큰을 Substring
4. JWT 검증
5. JWT에서 사용자 정보 가져오기


참고자료

profile
나만의 무언가를 가진 프로그래머가 되자

0개의 댓글