JWT란 무엇입니까? 실제 예제로 설명되는 JSON 웹 토큰

  1. 홈
  2. 블로그
  3. 소프트웨어 개발

소프트웨어 개발

JWT란 무엇입니까? 실제 예제를 통해 설명되는 JSON 웹 토큰

JWT를 사용하면 서버가 아무것도 조회하지 않고 요청을 신뢰할 수 있습니다. 처음부터 하나를 만들고 조작해 보고 실패하는 것을 지켜본 다음 토큰이 세션을 이길 때와 안전하게 사용하는 방법을 알아보세요.

읽는 시간 9분
JWT란 무엇입니까? 실제 예제로 설명된 JSON 웹 토큰

핵심 요약

  • JWT는 헤더, 페이로드, 서명의 세 부분으로 구성된 소형 서명 토큰입니다.
  • 서명은 토큰이 변경되지 않았음을 증명하므로 서버는 조회 없이 이를 신뢰할 수 있습니다.
  • 페이로드는 누구나 읽을 수 있으므로 비밀을 입력하지 마세요.
  • 토큰은 취소하기 어렵기 때문에 짧은 기간 동안 보관하고 신뢰할 수 있는 라이브러리를 통해 검증하세요.

로그인한 후 서버는 이후의 각 요청이 실제로 귀하로부터 온 것인지 어떻게 알 수 있습니까? 인기 있는 답변 중 하나는 JSON 웹 토큰, 즉 JWT이며 일반적으로 “jot”로 발음됩니다. 클라이언트가 각 요청과 함께 보내는 작은 서명된 데이터 조각이며 서버는 데이터베이스를 건드리지 않고도 이를 확인할 수 있습니다.

JWT를 이해하는 가장 빠른 방법은 JWT를 구축한 다음 이를 깨뜨리는 것입니다. Python 3.13에서 Python의 표준 라이브러리만 사용하여 이 작업을 수행했으며 아래 출력은 해당 실행에서 나온 것입니다. 학습용 코드입니다. 실제 애플리케이션에서는 검증 내용이 틀리기 쉽기 때문에 잘 관리된 라이브러리를 사용하세요.

JWT란 무엇입니까?

JWT는 두 당사자 간에 클레임을 압축 문자열로 전달하기 위해 RFC 7519에 정의된 개방형 표준입니다. 클레임은 “이 사용자의 ID는 42입니다”와 같은 간단한 설명입니다. 토큰이 서명되었으므로 수신자는 토큰을 발행한 사람이 누구인지, 누구도 변경하지 않았는지 확인할 수 있습니다.

축제용 손목밴드를 생각해 보세요. 게이트 직원이 티켓을 한 번 확인하고 위조가 어려운 밴드를 줍니다. 그 이후에는 각 매표소에서 매표소에 전화할 필요 없이 밴드만 바라볼 수 있다. JWT는 API와 거의 동일한 방식으로 작동합니다.

JWT 로그인 작동 방식

  1. 사용자는 로그인 엔드포인트에 사용자 이름과 비밀번호를 보냅니다.
  2. 서버는 이를 확인하고 서명된 토큰을 생성합니다.
  3. 클라이언트는 토큰을 저장합니다.
  4. 이후의 각 요청에는 일반적으로 헤더 Authorization: Bearer <token>에 포함됩니다.
  5. 서버는 서명과 만료를 확인한 다음 클레임을 읽습니다.

가장 큰 이점은 5단계에 있습니다. 서버는 세션을 조회할 필요가 없으므로 많은 서비스나 서버가 동일한 토큰을 확인해야 할 때 편리합니다. API를 처음 사용하는 경우 API란 무엇입니까부터 시작하세요.

JWT의 세 부분

JWT는 임의의 텍스트처럼 보이지만 점으로 구분된 세 개의 Base64URL 인코딩 섹션입니다. 다음은 우리가 생성한 것입니다:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.eyJzdWIiOiI0MiIsInJvbGUiOiJ1c2VyIiwiaWF0IjoxNzkzNTAwMDAwLCJleHAiOjE3OTM1MDA5MDB9
.7YfUDH_T-iDh8bMmUT8mmKYwOstzT8Ty--DTTAmQGWM

읽기 쉽도록 줄 바꿈을 추가했습니다. 처음 두 부분을 디코딩하면 일반 JSON이 제공됩니다.

Header:  {"alg":"HS256","typ":"JWT"}
Payload: {"sub":"42","role":"user","iat":1793500000,"exp":1793500900}
부품 포함 목적
헤더 토큰 유형 및 서명 알고리즘 토큰을 확인하는 방법을 알려줍니다.
페이로드 사용자 또는 세션에 대한 클레임 실제 정보
서명 키를 사용하여 처음 두 부분의 해시 무결성과 원산지 증명

표준 주장

청구 이름 의미
서브 주제 토큰의 대상, 일반적으로 사용자 ID
iss 발급자 토큰을 만든 사람
오드 청중 토큰의 대상은 누구입니까?
특급 만료 토큰이 더 이상 유효하지 않은 경우
앗 발행일 언제 만들어졌나요?
NBF 이전에는 없었습니다 유효해지기 시작하면
jti JWT ID 이 토큰의 고유 ID

role과 같은 사용자 정의 클레임을 추가할 수도 있습니다. 시간은 Unix 타임스탬프(초)입니다. 토큰은 모든 요청과 함께 이동하므로 페이로드를 작게 유지하십시오.

직접 만들어 보세요

토큰을 생성하려면 두 개의 JSON 부분을 인코딩한 다음 HMAC-SHA256을 사용하여 비밀로 서명해야 합니다.

import base64, hashlib, hmac, json

SECRET = b"demo-secret-do-not-use-in-production"

def b64url(data):
    return base64.urlsafe_b64encode(data).rstrip(b"=").decode()

def sign(message):
    return b64url(hmac.new(SECRET, message.encode(), hashlib.sha256).digest())

def create_token(payload):
    header = {"alg": "HS256", "typ": "JWT"}
    parts = [
        b64url(json.dumps(header, separators=(",", ":")).encode()),
        b64url(json.dumps(payload, separators=(",", ":")).encode()),
    ]
    message = ".".join(parts)
    return message + "." + sign(message)

확인은 서명을 다시 계산하고 이를 토큰의 서명과 비교하여 작동합니다. 비밀을 가진 사람만이 일치하는 비밀을 생성할 수 있습니다.

def verify_token(token, now):
    header, payload, signature = token.split(".")
    expected = sign(header + "." + payload)
    if not hmac.compare_digest(signature, expected):
        raise ValueError("bad signature")
    claims = json.loads(b64url_decode(payload))
    if claims["exp"] < now:
        raise ValueError("token expired")
    return claims

유효한 토큰이 예상대로 클레임을 반환했습니다. compare_digest은 일정한 시간으로 실행되기 때문에 사용되며, 이는 타이밍 차이로 인한 정보 유출을 방지합니다.

조작해 보세요

공격자가 페이로드를 디코딩하고 "role":"user"을 "role":"admin"로 변경한 후 다시 인코딩하고 이전 서명을 유지한다고 가정합니다. 우리는 두 가지 다른 공격과 함께 이것을 시도했습니다.

시도 결과
역할을 관리자로 변경했습니다. 잘못된 서명
만료 후 1초 후에 토큰 사용 토큰이 만료되었습니다.
"alg":"none"을 설정하고 서명을 제거했습니다. 잘못된 서명

그 마지막 시도는 실제 역사적 약점을 겨냥한 것입니다. 일부 라이브러리는 한때 토큰 자체 헤더를 신뢰했기 때문에 공격자는 서명이 필요하지 않다고 간단히 선언할 수 있었습니다. 우리 코드는 항상 하나의 고정 알고리즘을 사용하므로 거부되었습니다. 실제 라이브러리에서는 항상 허용하는 알고리즘을 지정하십시오.

암호화되지 않고 서명됨

이것이 JWT에 대해 가장 오해되는 점입니다. 위조된 토큰이 거부되었지만 그 내용은 여전히 완벽하게 읽을 수 있었습니다.

{"sub":"42","role":"admin","iat":1793500000,"exp":1793500900}

Base64URL은 암호화가 아닌 인코딩이며 누구나 키 없이도 되돌릴 수 있습니다. 서명은 사람들이 데이터를 변경하는 것을 막지만 데이터를 읽는 것을 막지는 못합니다. 따라서 JWT 페이로드에 비밀번호, 카드 번호 또는 개인 개인 데이터를 넣지 마십시오. 콘텐츠를 숨겨야 하는 경우 암호화된 토큰(JWE)을 사용하거나 데이터를 서버에 보관하세요.

HS256 대 RS256

측면 HS256 RS256 또는 ES256
유형 대칭 비대칭
열쇠 하나의 공유 비밀 개인 키는 서명하고 공개 키는 확인합니다.
토큰을 만들 수 있는 사람 비밀을 갖고 있는 사람은 누구라도 개인키 보유자만
다음에 가장 적합 하나의 서비스 또는 소규모의 신뢰할 수 있는 그룹 다양한 서비스, 제3자, ID 제공업체

비대칭 서명을 사용하면 다른 서비스에서 자체 토큰을 발행하지 않고도 토큰을 확인할 수 있으므로 토큰이 손상될 경우 피해가 제한됩니다.

JWT 대 세션

JWT는 종종 세션을 현대적으로 대체하는 것으로 제시됩니다. 실제로는 각각 장단점이 있습니다.

측면 서버 세션 JWT
국가가 사는 곳 서버에서 토큰에서
각 요청에 대한 조회 보통 필요하지 않음
로그아웃 또는 취소 간단합니다. 세션을 삭제하세요. 만료되기 전에 어려움
요청당 크기 작은 신분증 더 큰 토큰(우리의 토큰은 161자)
다양한 서비스 전반에 걸쳐 공유 저장공간이 필요함 각자가 직접 확인할 수 있습니다
권한 변경 즉시 적용 기존 토큰은 만료될 때까지 유효합니다.

전통적인 서버 렌더링 웹사이트의 경우 세션 쿠키가 더 간단하고 안전한 경우가 많습니다. JWT는 여러 서비스 또는 모바일 클라이언트에서 사용되는 API에 더 적합한 경향이 있습니다.

팁: 단지 상태 비저장이라는 이유로 JWT를 선택하지 마세요. 많은 실제 시스템에서는 로그아웃을 지원하기 위해 거부 목록이나 데이터베이스 검사를 추가하여 JWT가 피하려고 했던 조회를 다시 가져옵니다.

브라우저에서 토큰을 저장하는 위치

위치 XSS 위험 CSRF 위험 메모
로컬스토리지 높음(스크립트에서 읽을 수 있으므로 높음) 낮음 단순하지만 삽입된 스크립트에 노출됨
HttpOnly 쿠키 스크립트가 읽을 수 없으므로 낮음 보호가 필요함 Secure과 SameSite를 사용하세요.
메모리 내 변수 낮은 낮음 새로 고침 시 손실되므로 새로 고침 흐름이 필요합니다.

많은 보안 가이드에서는 웹 앱용 HttpOnly, Secure, SameSite 쿠키를 선호합니다. 어느 쪽을 선택하든 항상 HTTPS를 사용하세요. JavaScript에서 토큰을 보내려면 JavaScript Fetch API 튜토리얼을 참조하세요.

새로 고침 토큰

만료 시간이 짧으면 도난당한 토큰으로 인한 피해가 제한되지만 누구도 15분마다 로그인하고 싶어하지 않습니다. 일반적인 솔루션은 두 개의 토큰을 사용합니다.

  • 액세스 토큰: 분 단위로 수명이 짧으며 모든 API 요청과 함께 전송됩니다.
  • 새로 고침 토큰: 수명이 더 길고 더 주의 깊게 저장되며 새 액세스 토큰을 얻는 데에만 사용됩니다.

서버는 새로 고침 토큰을 추적하여 이를 취소할 수 있으며 이를 통해 실질적인 로그아웃이 가능합니다. 사용할 때마다 토큰을 교체하면 도난당한 오래된 토큰이 재생되기 때문에 도난을 감지하는 데도 도움이 됩니다.

일반적인 보안 실수

  • 검증 없이 디코딩합니다. 페이로드를 읽는다고 해서 신뢰할 수 있는 것은 아닙니다. 항상 서명을 확인하세요.
  • 모든 알고리즘을 수락합니다. 허용되는 알고리즘의 명시적인 목록을 설정합니다.
  • 약한 비밀을 사용합니다. 짧은 비밀은 오프라인에서 해독될 수 있습니다. 긴 임의의 값을 사용하고 소스 제어에서 제외하십시오.
  • 만료 건너뛰기. exp가 없는 토큰은 도난당해도 영원히 사용할 수 있습니다.
  • iss와 aud을 확인하지 않음. 그렇지 않으면 한 서비스에 대해 발행된 토큰이 다른 서비스에서 승인될 수 있습니다.
  • 부실 소유권 주장을 신뢰합니다. 토큰 내부의 역할은 만료될 때까지 최신 상태가 아닐 수 있습니다.
  • 로깅 토큰. 로그를 읽는 사람은 누구나 이를 재사용할 수 있습니다.
  • 실패 경로를 테스트하지 않습니다. 유효한 토큰뿐만 아니라 만료되고 수정된 토큰에 대한 테스트를 추가합니다. Postman을 사용한 API 테스트 가이드가 도움이 될 수 있습니다.

마무리

JWT는 비밀 컨테이너나 세션에 대한 자동 업그레이드가 아닌 조회 없이 서버가 신뢰할 수 있는 서명된 데이터입니다. 짧은 만료를 사용하고, 유지 관리되는 라이브러리로 모든 것을 확인하고, 개인 데이터를 페이로드에서 제외하세요. 직접 확인하려면 우리와 같은 작은 스크립트를 실행하고 토큰의 한 문자를 변경한 후 확인 실패를 확인하세요.

자주 묻는 질문

JWT는 어떤 용도로 사용되나요?

JWT는 주로 API의 인증 및 승인에 사용됩니다. 로그인 후 클라이언트는 각 요청과 함께 토큰을 보내고 서버는 이를 확인하여 사용자를 식별합니다.

JWT는 암호화되어 있나요?

일반적으로 그렇지 않습니다. 표준 JWT는 서명 및 인코딩되므로 누구나 페이로드를 읽을 수 있습니다. 서명은 변경만 방지합니다. 암호화된 토큰은 JWE라는 관련 형식을 사용합니다.

JWT는 얼마나 오래 지속되어야 합니까?

액세스 토큰은 일반적으로 수명이 짧으며 며칠이 아닌 몇 분 정도 지속되는 경우가 많습니다. 새로 고침 토큰과 함께 사용하면 사용자가 지속적으로 로그인할 필요가 없습니다.

JWT를 취소할 수 있나요?

만료될 때까지 유효하므로 그 자체로는 아닙니다. 취소하려면 거부 목록과 같은 서버 측 추적이 필요하며 이는 상태 비저장 이점 중 일부를 제거합니다.

JWT가 세션보다 낫나요?

어느 쪽도 항상 더 나은 것은 아닙니다. 세션은 취소하기가 더 간단하고 많은 웹사이트에 적합한 반면, JWT는 독립적으로 신원을 확인해야 하는 API 및 서비스에 적합합니다.

계속 학습하세요

Stack Quora와 작업

테스트, WordPress 또는 SEO에 도움이 필요하십니까?

우리는 팀이 더 나은 소프트웨어를 출시하고 사이트를 성장시킬 수 있도록 돕습니다. 현재 진행 중인 작업을 알려주시면 명확한 다음 단계를 제안해 드리겠습니다.

계속 읽으세요

추가 가이드 테스트, AI 및 최신 개발

이 기사가 마음에 드셨나요? 주제를 선택하고 최신 튜토리얼로 바로 이동하세요.

인공지능

AI 환각 설명: 언어 모델이 사물을 구성하는 이유와 이를 줄이는 방법

AI 환각은 그것이 무엇인지, 언어 모델이 환각을 생성하는 이유, 일반적인 유형, 접지 및 프롬프트를 통해 환각을 줄이는 방법, 그리고 우리가 실행한 간단한 점검에 대해 설명했습니다.

기사 읽기 →
DevOps

환경 변수 설명: .env 파일, 비밀 및 구성이 올바르게 완료되었습니다.

우리가 실행한 Python 예제를 통해 설명된 환경 변수: 읽기 및 설정, 모든 값이 문자열인 이유, .env 파일, 프로세스 상속, 비밀 및 유효성 검사.

기사 읽기 →
소프트웨어 개발

API 속도 제한 설명: 알고리즘, 헤더 및 429 오류 처리

우리가 실행한 시뮬레이션을 통해 설명된 API 속도 제한: 토큰 버킷, 고정 창, 슬라이딩 창, 429 응답, 속도 제한 헤더, 백오프를 사용한 재시도 및 테스트 제한.

기사 읽기 →
테스트 자동화

Python에서 조롱: unittest.mock, 패치 및 테스트를 거짓말로 만드는 실수

Unittest.mock을 사용하여 Python에서 모의, 테스트됨: 모의 및 return_value, 부작용, 이름이 사용되는 패치, 사양 및 자동 사양, 모의 날짜 및 일반적인 실수.

기사 읽기 →
소프트웨어 테스트

코드 커버리지 설명: 회선 커버리지와 분기 커버리지 및 100%의 실제 의미

실제 Coverage.py 실행을 통해 설명되는 코드 적용 범위: 라인, 분기 및 조건 적용 범위, 보고서 읽기, 100% 적용 범위가 여전히 버그를 놓칠 수 있는 이유 및 합리적인 대상.

기사 읽기 →
데이터베이스 및 SQL

SQL의 DELETE vs TRUNCATE vs DROP: 차이점, 롤백 및 사용 시기

테스트된 SQL을 통해 DELETE 대 TRUNCATE 대 DROP에 대해 설명합니다. 각각의 제거, 롤백, 트리거, ID 재설정, 속도 및 PostgreSQL, MySQL, SQL Server 및 SQLite의 차이점.

기사 읽기 →
데이터베이스 및 SQL

SQL 뷰 설명: 예제를 통해 함정 생성, 사용 및 방지

우리가 실행한 쿼리로 설명된 SQL 뷰: 뷰 생성, 실시간 결과, 열 숨기기, 성능, 업데이트 가능하고 구체화된 뷰, 손상된 종속성 및 모범 사례.

기사 읽기 →
소프트웨어 개발

TypeScript 인터페이스와 유형: 실제 차이점, 컴파일러로 테스트

TypeScript 인터페이스 대 유형, 실제 컴파일러로 확인: 둘 다 할 수 있는 것, 하나만 할 수 있는 것, 선언 병합, 확장 대 교차점 및 따라야 할 간단한 규칙.

기사 읽기 →
소프트웨어 개발

Python *args 및 **kwargs 설명: 명확한 예가 포함된 유연한 함수

Python *args 및 **kwargs는 우리가 실행한 코드(패킹 및 언패킹, 매개변수 순서, 키워드 전용 및 위치 전용 인수, 데코레이터 및 일반적인 오류)를 설명했습니다.

기사 읽기 →
소프트웨어 개발

Python Lambda 함수: 구문, 실제 사용 및 사용하지 말아야 할 경우

Python 람다 함수는 구문, 키를 사용한 정렬, 맵 및 필터, 클로저, 후기 바인딩 트랩, 일반 def가 더 나은 선택인 경우 등 우리가 실행한 코드로 설명되었습니다.

기사 읽기 →
인공지능

AI 에이전트란 ​​무엇입니까? 작동 방식, 간단한 에이전트 루프를 사용하여 실행할 수 있음

AI 에이전트란 무엇입니까? 우리가 실행한 작은 Python 루프, 실제 위험 및 간단한 챗봇이 더 나은 선택일 때 에이전트 루프, 도구, 메모리 및 가드레일에 대한 일반 가이드입니다.

기사 읽기 →
DevOps

모니터링과 관찰 가능성: 로그, 지표, 추적을 통한 실제 차이점

모니터링과 관찰 가능성 설명: 알려진 오류와 알려지지 않은 오류, 로그, 지표 및 추적, 결제 사건 안내, 골든 신호, OpenTelemetry 및 유용한 경고.

기사 읽기 →
DevOps

Docker 볼륨과 바인딩 마운트: 컨테이너 데이터를 올바른 방식으로 유지

Docker 볼륨과 바인드 마운트 설명: 컨테이너 데이터가 사라지는 이유, 명명된 볼륨, 바인드 마운트, tmpfs, Compose 예제, 백업, 권한 및 각 사용 시기.

기사 읽기 →
테스트 자동화

TDD와 BDD: 주요 차이점, 두 가지 방식으로 구축된 하나의 기능 및 각 사용 시기

TDD와 BDD는 두 가지 방식으로 구축된 하나의 할인 기능, 즉 우리가 실행한 코드를 사용한 적록 리팩토링, 주어진 시점 시나리오, 도구, 장단점 및 각 사용 시기를 설명합니다.

기사 읽기 →
소프트웨어 테스트

UAT(사용자 승인 테스트): 프로세스, 체크리스트 및 실제 사례

사용자 승인 테스트는 누가 실행하는지, QA와 어떻게 다른지, 7단계 프로세스, UAT 테스트 사례 템플릿, 체크리스트, 승인 기준 및 일반적인 실수에 대해 설명했습니다.

기사 읽기 →
데이터베이스 및 SQL

SQL NULL 값 설명: IS NULL, COALESCE, NULLIF 및 피해야 할 함정

우리가 실행한 쿼리를 통해 설명된 SQL NULL 값: 3개 값 논리, IS NULL, COALESCE, NULLIF, 집계, 조인 및 정렬이 NULL을 처리하는 방법 및 조용히 발생하는 버그.

기사 읽기 →
데이터베이스 및 SQL

SQL CASE WHEN 문: 구문, 실제 예 및 일반적인 실수

우리가 실행한 쿼리로 설명된 SQL CASE: 단순 및 검색 양식, 조건 순서, SUM이 있는 피벗, COUNT 트릭, 사용자 정의 정렬, 업데이트 및 피해야 할 NULL 트랩.

기사 읽기 →
소프트웨어 개발

JWT란 무엇입니까? 실제 예제로 설명되는 JSON 웹 토큰

JWT란 무엇입니까? JSON 웹 토큰은 세 부분, 즉 우리가 실행한 코드에서 구축 및 변조된 토큰, JWT 대 세션, 저장소, 새로 고침 토큰 및 보안 실수를 설명했습니다.

기사 읽기 →
소프트웨어 개발

JavaScript 이벤트 루프 설명: 예제가 포함된 호출 스택, 마이크로태스크 및 타이머

호출 스택, 작업 및 마이크로태스크 대기열, setTimeout 0이 즉시 실행되지 않는 이유, 차단, 기아 및 인터뷰 퀴즈 등 우리가 실행한 코드로 JavaScript 이벤트 루프를 설명했습니다.

기사 읽기 →
소프트웨어 개발

Python 생성기 및 수율 설명: 실제 예제로 메모리 절약

Python 생성기와 항복은 우리가 실행한 코드로 설명됩니다. 일시 중지 및 재개 방법, 측정된 메모리 절약, 파이프라인, 무한 시퀀스, 항복, 전송 및 공통 트랩.

기사 읽기 →
인공지능

임베딩이란 무엇입니까? 벡터와 코사인 유사성을 간단하게 설명

임베딩이란 무엇입니까? 벡터, 코사인 유사성 및 의미론적 검색에 대한 일반 언어 가이드로, 우리가 실행한 작은 예, 일반적인 용도, 모델 선택 및 알려진 한계를 제공합니다.

기사 읽기 →
DevOps

블루-그린 배포와 카나리아 배포: 차이점, 장단점 및 선택 방법

블루-그린 배포와 카나리아 배포에 대한 설명: 각각의 작동 방식, 비용, 위험 및 롤백, 테스트한 안정적인 사용자 버킷팅, 데이터베이스 마이그레이션, 롤링 업데이트 및 선택 방법.

기사 읽기 →
테스트 자동화

불안정한 테스트: 원인과 해결 방법

우리가 실행한 데모를 통해 불안정한 테스트에 대해 설명했습니다. 주요 원인, 확인 및 진단 방법, 시기, 공유 상태 및 날짜, 격리 프로세스에 대한 적절한 수정 사항.

기사 읽기 →
소프트웨어 테스트

부하 테스트와 스트레스 테스트 비교: 차이점, 측정항목 및 k6 예

부하 테스트와 스트레스 테스트 비교 설명: 각각의 증명, 스파이크 및 흡수 테스트, 중요한 측정항목, 평균이 잘못된 이유, k6 예 및 테스트 계획 방법.

기사 읽기 →
소프트웨어 테스트

테스트 케이스와 테스트 시나리오: 주요 차이점, 예 및 각각의 사용 시기

테스트 케이스와 테스트 시나리오 설명: 명확한 정의, 병렬 테이블, 시나리오에서 케이스로 가져온 하나의 비밀번호 재설정 기능, 템플릿 및 각 사용 시기.

기사 읽기 →
데이터베이스 및 SQL

SQL 쿼리 최적화: 타이밍에 따라 실행 계획을 읽고 느린 쿼리를 수정합니다.

백만 개의 행에서 테스트된 SQL 쿼리 최적화: 실행 계획 읽기, 올바른 인덱스 추가, 분할할 수 없는 필터 수정, 복합 인덱스 및 키 세트 페이지 매김 사용.

기사 읽기 →
데이터베이스 및 SQL

SQL UNION 대 UNION ALL: 테스트된 차이점, 예 및 성능

SQL UNION과 UNION ALL은 우리가 실행한 쿼리(중복, 둘 다 따르는 규칙, 실제 데이터 버그, 측정된 성능, INTERSECT 및 EXCEPT, 각각의 사용 시기)를 설명합니다.

기사 읽기 →
소프트웨어 개발

JavaScript Fetch API 튜토리얼: GET, POST, 오류 처리 및 시간 초과

로컬 서버에 대해 테스트된 JavaScript Fetch API 튜토리얼: GET 및 POST, 404가 발생하지 않는 이유, 재사용 가능한 도우미, 쿼리 문자열, 시간 초과, CORS 및 일반적인 실수.

기사 읽기 →
소프트웨어 개발

Python 파일 처리: 읽기, 쓰기, CSV, JSON 및 pathlib 예제 포함

우리가 실행한 코드로 설명된 Python 파일 처리: 개방형 모드, 대용량 파일 읽기, CSV, JSON, pathlib, 바이너리 파일, 안전한 쓰기, 오류 처리 및 일반적인 실수.

기사 읽기 →
소프트웨어 개발

Python 클래스 및 객체: 실제 예제가 포함된 OOP 튜토리얼

우리가 실행한 코드로 설명된 Python 클래스와 객체: __init__, 메소드, 클래스 대 인스턴스 속성, 상속, 속성, 던더 메소드, 데이터 클래스 및 일반적인 실수.

기사 읽기 →
인공지능

대규모 언어 모델이란 무엇입니까? LLM의 작동 방식, 과대광고 없이 설명

대규모 언어 모델이란 무엇입니까? LLM은 토큰, 임베딩, 주의, 훈련, 온도 및 컨텍스트 창, 작은 다음 단어 데모 및 실제 한계 등 일반 언어로 설명됩니다.

기사 읽기 →
DevOps

초보자를 위한 Linux 명령: 예제가 포함된 필수 터미널 가이드

탐색, 파일, 로그 보기, grep, 파이프, 권한, 프로세스 및 아카이브 등 작업별로 그룹화된 초보자를 위한 Linux 명령과 실용적인 로그 분석 예제가 포함되어 있습니다.

기사 읽기 →
테스트 자동화

셀레늄 대 극작가: 주요 차이점, 코드 비교 및 선택할 항목

Selenium과 Playwright 비교: 아키텍처, 대기, 브라우저 및 언어 지원, 디버깅, 두 도구 모두에서 동일한 테스트, 마이그레이션 조언 및 선택 방법.

기사 읽기 →
소프트웨어 테스트

등가 분할: 실제 예제를 통해 설명되는 테스트 설계 기법

등가 분할 설명: 유효한 파티션과 유효하지 않은 파티션을 찾는 방법, 연령, 비밀번호 및 쿠폰에 대한 작업 예제, 실행한 테스트, 경계와 쌍을 이루는 이유.

기사 읽기 →
소프트웨어 테스트

소프트웨어 테스팅의 심각도와 우선순위: 차이점, 매트릭스 및 실제 사례

소프트웨어 테스팅의 심각도와 우선순위에 대한 설명: 명확한 정의, 예제가 포함된 4방향 매트릭스, 수준 척도, 각 항목을 설정하는 사람 및 버그 분류 실행 방법.

기사 읽기 →
데이터베이스 및 SQL

SQL 하위 쿼리 자습서: 유형, 상관 하위 쿼리 및 EXISTS(예제 포함)

스칼라, IN, FROM 및 SELECT 하위 쿼리, 상관 하위 쿼리, EXISTS, NOT IN NULL 트랩 및 하위 쿼리 대 JOIN 대 CTE 등 우리가 실행한 쿼리가 포함된 SQL 하위 쿼리 자습서입니다.

기사 읽기 →
데이터베이스 및 SQL

SQL 트랜잭션 및 ACID 설명: COMMIT, ROLLBACK 및 격리 수준

COMMIT, ROLLBACK, 저장점, 잠금, 격리 수준, 더티 읽기, 교착 상태 및 모범 사례 등 우리가 실행한 은행 이체를 통해 SQL 트랜잭션 및 ACID를 설명했습니다.

기사 읽기 →
소프트웨어 개발

Git merge vs rebase: 차이점, 예제, 언제 무엇을 쓸까

Git merge vs rebase를 실제 로그 출력, 비교표, rebase의 황금률, 안전한 팀 워크플로로 설명합니다.

기사 읽기 →
소프트웨어 개발

파이썬 리스트 컴프리헨션: 문법, 예제, 피해야 할 때

파이썬 리스트 컴프리헨션 설명: 문법, 필터링, if-else, 중첩 반복문, 실제 측정 시간, 그리고 일반 for 반복문이 더 나은 경우.

기사 읽기 →
데이터베이스 및 SQL

예제로 쉽게 배우는 SQL JOIN (Inner, Left, Right, Full)

샘플 테이블과 쿼리로 SQL JOIN을 단계별로 이해하세요. INNER, LEFT, RIGHT, FULL, CROSS, SELF와 흔한 실수, 성능 팁까지 정리했습니다.

기사 읽기 →