갔다가 돌아오면 다른 값이 되는 변환들
ß를 대문자로 바꿨다 되돌리면 ss입니다. 정보를 버리면서 버렸다는 사실을 남기지 않는 변환 여덟 가지.
가계부·일기·할 일 관리처럼 매일의 기록을 이어가는 방법을 씁니다. 직접 만들고 쓰면서 알게 된 것을 정리합니다.
ß를 대문자로 바꿨다 되돌리면 ss입니다. 정보를 버리면서 버렸다는 사실을 남기지 않는 변환 여덟 가지.
XML은 CSV의 3.1배인데 gzip 후에는 1.3배입니다. 형식 선택이 실제로 무엇을 바꾸는지 재 봤습니다.
한글에는 quoted-printable이 최악이고 영문에는 최선입니다. 인코딩별 크기를 언어별로 재 봤습니다.
로그에 찍힌 낯선 값의 정체를 접두사·길이·앞 네 글자로 좁힙니다. 실제로 돌려 만든 판별표입니다.
필드 여섯 개를 순서대로 열어 만료된 토큰을 찾아냅니다. 실제로 돌려 본 조사 흐름입니다.
lorem ipsum은 영문 통계를 잘 닮지만 한글 레이아웃에는 맞지 않습니다. 무엇을 재현하고 무엇을 포기할지 정리했습니다.
기준 시각이 넷입니다. 1970·1601·1582·1900이 어디서 나오고 무엇을 틀리게 하는지 정리했습니다.
A/B 배정과 샤딩 키는 오히려 결정적이어야 합니다. 같은 단어로 묶이는데 요구가 반대인 자리들.
SHA3-256과 Keccak-256은 다른 값을 냅니다. 이름만으로는 특정되지 않는 여덟 가지.
이메일을 SHA-256으로 해싱해도 익명화가 아닙니다. 값별로 무엇이 드러나는지 실측과 함께 정리했습니다.
base64는 33% 늘리고 압축으로도 되돌아오지 않습니다. 파일을 텍스트에 담을 때의 비용을 실측했습니다.
체중은 세제곱으로 느는데 나누는 값은 제곱입니다. 기준이 둘인 이유와 함께 정리했습니다.
MD5 충돌 쌍을 실제로 돌려 봤습니다. MD2·MD4·SHA-1이 무엇이 깨졌고 어디서 아직 필요한지 정리했습니다.
같은 다항식을 쓰는 CRC-16 셋이 서로 다른 값을 냅니다. 초기값·반전·최종 XOR이 무엇을 하는지 정리했습니다.
들여쓰기를 지우면 44% 줄지만 압축 후에는 8%입니다. 크기와 경로 찾기를 실측으로 정리했습니다.
alg를 토큰에서 읽으면 공개키로 서명한 위조 토큰이 통과합니다. 실제로 재현해 봤습니다.
"...."는 H인가 EEEE인가. 부호가 스스로 경계를 갖지 못할 때 무엇이 필요한지 정리했습니다.
시간으로 만든 식별자인데 문자열로 정렬하면 순서가 뒤섞입니다. v1·v6·v7의 차이를 실행 결과로 정리했습니다.
터키어에서 I는 i가 아닙니다. 대소문자 변환이 왕복하지 않고 길이가 변하는 경우를 실행 결과로 정리했습니다.
온도에는 곱셈이 통하지 않고 갤런은 나라마다 다릅니다. 단위 변환에서 어긋나는 자리를 정리했습니다.
2월 29일생의 생일과 1월 31일에 한 달을 더한 날. 개월 수 계산이 구현마다 갈리는 지점을 실행 결과로 정리했습니다.
공백을 정리하는 일이 왜 단순한 치환이 아닌지, CSS·JS·HTML·SQL에서 각각 어디가 걸리는지 정리했습니다.
PT1H30M, 01:30:00, 90m, 5400. 기간 표기가 왜 여러 개이고 어디서 서로 어긋나는지 정리했습니다.
SHA-3 계열에는 출력 길이가 정해지지 않은 함수가 있습니다. SHAKE·cSHAKE·KMAC·TupleHash가 각각 무엇을 푸는지 정리했습니다.
SHA-256이 기본값인데도 다른 해시가 남아 있는 자리가 있습니다. 속도를 재고 실제 용례를 확인했습니다.
기본 인증 비밀번호 파일이 쓰는 네 가지 형식과, 그중 둘을 지금 쓰면 안 되는 이유를 정리했습니다.
표준에서 빠지거나 표준이 된 적 없는 암호 셋. 각각 왜 밀려났고 지금 어디에 남아 있는지 정리했습니다.
공백으로 자르면 일본어가 한 단어가 됩니다. 문자·단어·문장을 세는 일이 언어마다 어떻게 달라지는지 정리했습니다.
시간대 변환에서 하루가 23시간이거나 25시간이 되는 날이 있습니다. 오프셋을 저장하면 왜 깨지는지 실행 결과로 정리했습니다.
포트가 사라지고 경로가 위로 올라가고 +가 공백이 됩니다. URL 파서가 실제로 무엇을 하는지 실행 결과로 정리했습니다.
같은 데이터를 95바이트에서 61바이트로 줄이고 바이트열과 큰 정수를 그대로 담습니다. JSON과 무엇이 다르고 어디에 쓰는지 정리했습니다.
회색 767676은 통과하고 777777은 실패합니다. WCAG 대비비가 어떻게 계산되는지와 HSL 명도로 짐작하면 왜 틀리는지 정리했습니다.
UUID v5는 같은 입력에서 항상 같은 값이 나오고 ULID는 문자열 정렬이 시간순과 일치합니다. 둘이 각각 어떤 문제를 푸는지 정리했습니다.
비밀키를 몰라도 메시지를 늘리고 서명을 다시 만들 수 있습니다. 길이 확장 공격을 실제로 성공시켜 보고 HMAC과 SHA-3가 이를 어떻게 막는지 정리했습니다.
parseInt('0b101')은 0이고 1 << 32는 1입니다. 언어마다 다른 파싱 규칙과 비트 폭의 경계를 정리했습니다.
같은 200자가 오류 정정 레벨에 따라 45×45가 되기도 61×61이 되기도 합니다. 버전·모드·EC 레벨이 크기를 어떻게 결정하는지 정리했습니다.
영문에는 base64보다 작고 한글에는 두 배 큽니다. quoted-printable이 무엇을 하고 언제 쓰이는지 정리했습니다.
한 글자만 바뀌어도 줄 전체가 바뀐 것으로 나오고, 블록을 옮기면 삭제와 추가로 잡힙니다. diff의 동작과 그 결과를 읽는 법을 정리했습니다.
정규화, 언어별 대소문자 규칙, 한글 인코딩 길이까지. 제목을 주소로 바꿀 때 실제로 문제가 되는 지점을 정리했습니다.
309바이트 문서가 3,000자로 부풀고, DTD 한 줄이 서버의 파일을 읽습니다. 파서 기본값을 실제로 확인해 보고 무엇을 꺼야 하는지 정리했습니다.
ECB는 패턴을 남기고 CTR은 nonce를 재사용하면 평문이 드러납니다. 모드별 차이와 GCM을 기본으로 두는 이유를 정리했습니다.
묶는 일과 줄이는 일은 다릅니다. DEFLATE와 gzip의 관계, tar.gz와 zip의 압축률 차이를 실제 수치로 정리했습니다.
같은 바이트를 문자로 바꾸는 방식이 여러 개인 이유가 있습니다. 알파벳 설계 의도와 크기 차이를 정리했습니다.
체크섬은 오류를 찾고 해시는 변조를 막습니다. CRC32, MD5, SHA-256의 용도 구분과 해시를 확인해도 소용없는 경우를 정리했습니다.
한글이 깨지고 전화번호 앞의 0이 사라집니다. 인용 규칙, BOM, 자동 변환을 나눠서 정리했습니다.
꺾쇠만 바꾸면 되는 것이 아닙니다. 본문·속성·스크립트·URL에서 각각 필요한 처리와 자동 이스케이프가 놓치는 자리를 정리했습니다.
비밀번호와 토큰에는 예측 불가능한 난수가 필요합니다. CSPRNG와 일반 난수의 차이, 엔트로피 계산법을 정리했습니다.
이모지 하나가 어디서는 1, 어디서는 2, 어디서는 25로 셉니다. 네 가지 길이의 차이와 안전하게 자르는 방법을 정리했습니다.
서명이 맞지 않는 원인은 대개 원문 처리에 있습니다. HMAC 검증 순서와 타이밍 공격, 재전송 대응을 정리했습니다.
country에 NO를 적으면 false가 됩니다. 같은 파일을 파서마다 다르게 읽는 이유와 따옴표를 붙여야 할 자리를 정리했습니다.
필드 수가 5개인 곳과 6개인 곳, `*/7`이 7분 간격이 아닌 이유, 일과 요일을 함께 쓰면 생기는 일까지 정리했습니다.
64비트 ID를 자바스크립트로 받으면 끝자리가 달라집니다. 오류 없이 값만 틀어지는 이유와 대응 방법을 정리했습니다.
백트래킹이 폭발하면 짧은 정규식도 CPU를 다 씁니다. 위험한 패턴의 모양과 확인하는 방법, 엔진별 차이를 정리했습니다.
공개키로 잠그는 것과 개인키로 서명하는 것은 방향이 반대입니다. 키 두 개의 역할, RSA와 ECDSA의 차이를 정리했습니다.
경로와 쿼리는 규칙이 다르고, `+`는 한쪽에서만 공백입니다. 이중 인코딩과 한글 도메인의 Punycode까지 정리했습니다.
Base64는 키 없이 누구나 되돌릴 수 있는 인코딩입니다. 인코딩·해시·암호화의 차이와 Base64를 실제로 쓰는 자리를 정리했습니다.
JWT는 암호화가 아니라 서명된 데이터입니다. 디코딩과 검증의 차이, 토큰을 붙여넣기 전에 확인할 것을 정리했습니다.
SHA-256은 빠르기 때문에 비밀번호에 맞지 않습니다. 해시의 용도별 구분과 bcrypt·PBKDF2가 하는 일, 솔트의 역할을 정리했습니다.
초와 밀리초 혼동, 타임존을 값에 더해 저장하는 실수, 2038년 문제까지. 타임스탬프를 주고받을 때 확인할 것을 정리했습니다.
v4는 무작위라 인덱스에 부담을 주고, v7은 시간순으로 정렬되는 대신 생성 시각이 드러납니다. 버전별 차이와 선택 기준을 정리했습니다.
신용카드를 쓰면 돈을 쓴 날과 빠져나가는 날이 달라집니다. 결제일과 마감일을 기준으로 가계부를 나누어 기록하는 방법을 정리했습니다.
시험이나 여행처럼 날짜를 세는 용도 외에도 D-Day는 쓸 곳이 많습니다. 카운트다운과 카운트업을 나눠 쓰는 방법과, 개수를 늘리면 안 되는 이유를 정리했습니다.
고정비는 한 번 등록하면 확인하지 않게 되는 돈입니다. 통신비·구독료·보험료를 한 번에 훑어보고 쓰지 않는 항목을 걸러내는 방법입니다.
장을 볼 때가 아니라 버릴 때 돈이 샙니다. 유통기한과 소비기한의 차이, 냉장고 재고를 관리해 버리는 양을 줄이는 방법을 정리했습니다.
매일 일기를 쓰려다 며칠 만에 그만두는 이유는 대개 분량 부담입니다. 기분과 날씨만 남기는 방식으로 시작해 습관을 만드는 방법을 정리했습니다.
음력 날짜는 해마다 양력 기준으로 옮겨집니다. 왜 그런지와 윤달이 낀 해에 어떻게 챙기는지, 실수 없이 관리하는 방법을 정리했습니다.
매달 얼마를 쓰는지 알아도 자산이 늘고 있는지는 모를 수 있습니다. 예금·적금·투자·부동산과 대출을 한 장에 정리해 순자산을 계산하는 방법입니다.
다 읽고 몇 달 지나면 내용이 남지 않는 이유와, 별점·한 줄 감상·인상 깊은 구절만으로 기록을 이어가는 방법을 정리했습니다.
지금의 판단과 감정을 그대로 적어 미래의 특정 날짜에 다시 받아보는 기록 방법입니다. 어떤 내용을 남기면 쓸모가 있는지 정리했습니다.