2024.10.31.목.TIL JWT

김기남·2024년 10월 31일
post-thumbnail

안녕하세요, 오늘은 JWT 에 대해 정리해 보았습니다.

JWT란 무엇인가?

JWT는 JSON 형식으로 정보를 안전하게 전송하기 위한 방법입니다. 주로 사용자 인증을 위해 사용되며, 클라이언트와 서버 간의 신뢰할 수 있는 정보 교환을 가능하게 합니다. JWT는 세 부분으로 나뉘어져 있으며, 각 부분은 점(.)으로 구분됩니다.

JWT의 구조

JWT는 크게 세 가지 부분으로 구성됩니다: Header, Payload, Signature입니다.

  • Header : JWT의 타입과 사용된 알고리즘을 정의합니다. 일반적으로 HMAC SHA256 또는 RSA 알고리즘이 사용됩니다.
  • Payload : 사용자에 대한 정보와 클레임(Claims)을 포함합니다. 예를 들어, 사용자 ID, 이름, 권한 정보 등이 포함될 수 있습니다.
  • Signature : Header와 Payload를 조합하여 비밀 키로 서명한 부분입니다. 이 서명은 JWT의 무결성을 보장합니다.

아래 이미지는 JWT의 구조를 잘 보여줍니다.

JWT의 사용 사례

JWT는 다양한 상황에서 사용될 수 있습니다. 예를 들어:

  • API 인증 : 클라이언트가 서버에 요청할 때 JWT를 포함하여 인증을 수행합니다.
  • 정보 교환 : JWT는 안전하게 정보를 전송할 수 있는 방법으로 사용됩니다.
  • 단일 로그인(SSO): 여러 애플리케이션에서 동일한 인증 정보를 사용할 수 있도록 도와줍니다.

JWT 생성 및 검증 방법

JWT를 생성하는 과정은 다음과 같습니다:

  • Header 생성 : JWT의 타입과 알고리즘을 정의합니다.
  • Payload 생성 : 사용자 정보를 포함합니다.
  • Signature 생성 : Header와 Payload를 조합하고 비밀 키로 서명합니다.

이 과정을 통해 생성된 JWT는 클라이언트에 전달됩니다. 클라이언트는 이후 요청 시 이 JWT를 서버에 전송하여 인증을 받습니다.

JWT의 장점과 단점

JWT의 장점은 다음과 같습니다

  • 자체 포함 : JWT는 필요한 모든 정보를 포함하고 있어 별도의 데이터베이스 조회가 필요 없습니다.
  • 보안성 : 서명된 JWT는 변조가 불가능합니다.
  • 확장성 : 다양한 플랫폼과 언어에서 쉽게 사용할 수 있습니다.

하지만 단점도 존재합니다

  • 토큰 크기 : JWT는 정보가 많을수록 크기가 커지므로, 네트워크 대역폭에 영향을 줄 수 있습니다.
  • 만료 시간 : JWT는 만료 시간이 설정되어 있어, 만료된 토큰은 사용할 수 없습니다.

오늘의 코드카타

class Solution {

    public int solution(String dartResult) {
        int answer = 0;
        int[] dart = new int[3];

        int n = 0, idx = 0;
        String numstr = "";

        for (int i = 0; i < dartResult.length(); i++) {
            char c = dartResult.charAt(i);

            if (c >= '0' && c <= '9') {
                numstr += String.valueOf(c);

            }
            else if (c == 'S' || c == 'D' || c == 'T') {
                n = Integer.parseInt(numstr);
                if (c == 'S') {
                    dart[idx++] = (int) Math.pow(n, 1);
                } else if (c == 'D') {
                    dart[idx++] = (int) Math.pow(n, 2);
                } else {
                    dart[idx++] = (int) Math.pow(n, 3);
                }
                numstr = "";
            }
            else {
                if (c == '*') {
                    dart[idx - 1] *= 2;
                    if (idx - 2 >= 0) {
                        dart[idx - 2] *= 2;
                    }
                } else {
                    dart[idx - 1] *= (-1);
                }
            }
        }

        answer = dart[0] + dart[1] + dart[2];

        return answer;
    }
}
public class Main {

    public static void main(String[] args) {

        Solution solution = new Solution();

        System.out.println(solution.solution("1S2D*3T"));
        System.out.println(solution.solution("1D2S#10S"));
        System.out.println(solution.solution("1D2S0T"));
        System.out.println(solution.solution("1S*2T*3S"));
        System.out.println(solution.solution("1D#2S*3S"));
        System.out.println(solution.solution("1T2D3D#"));
        System.out.println(solution.solution("1D2S3T*"));
    }
}

[1차] 다트게임

profile
새로운 시작~!

0개의 댓글