728x90
반응형

ChatGPT나 Claude를 써 본 사람이라면 한 번쯤은 겪어봤을 것이다. 존재하지 않는 책을 그럴듯하게 추천하고, 가짜 논문 제목과 가짜 저자를 만들어내고, 작년에 끝난 회사를 아직 운영 중이라고 답하는 그 현상. 이걸 학술 용어로 환각(Hallucination) 이라고 부른다.

문제는 이게 단순한 버그가 아니라 현재 LLM 아키텍처에 내재된 구조적 특성이라는 점이다. 원리를 모르면 "AI가 똑똑하니까 알아서 잘 하겠지" 하고 그대로 쓰게 되고, 운영 중인 서비스에서 사고가 난다. 이 글에서는 환각이 왜 발생하는지, 어떤 유형이 있는지, 그리고 개발자가 실무에서 환각을 줄이려면 어떤 전략을 써야 하는지를 정리한다.


환각이란 무엇인가

가장 자주 인용되는 학술적 정의는 이렇다. 2025년 10월 arXiv에 공개된 한 종합 서베이 논문에서는 환각을 "LLM이 생성한 내용 중, 유창하고 문법적으로는 정확하지만 사실과 다르거나 외부 근거로 뒷받침되지 않는 출력" 이라고 정의한다.

핵심은 두 가지다.

  • 유창함: 문장은 매끄럽고 문법적으로 자연스럽다
  • 사실 불일치: 그러나 실제 사실, 인용된 출처, 또는 주어진 문맥과 어긋난다

즉 환각은 "틀렸는데 틀린 줄 모르게 잘 쓴 글" 이다. 이게 가장 위험한 이유는, 사용자가 어디가 틀렸는지 알아채기 어렵다는 데 있다. 명백한 오류는 차라리 낫다. 환각은 99%가 맞고 1%만 조용히 틀려 있다.


환각의 유형 — 무엇이 어떻게 틀리는가

연구에 따라 분류 방식은 다양하지만, 실무 관점에서 자주 마주치는 유형은 다음 4가지다.

1. 사실 환각 (Factual Hallucination)

존재하지 않는 사실을 만들어내거나, 실제 사실을 잘못 기술한다.

"아인슈타인은 1921년 노벨 물리학상을 받았으며, 그의 수상 사유는 상대성이론이었다."

수상 연도는 맞지만, 사유는 틀렸다(실제로는 광전 효과). 이런 "미묘하게 틀린 사실" 이 가장 흔하고 잡기 어렵다.

2. 컨텍스트/논리 환각 (Contextual / Logical Hallucination)

주어진 문맥과 모순되거나, 추론 과정에 논리적 오류가 들어간다. RAG로 문서를 제공했는데도 모델이 문서에 없는 내용을 끼워 넣거나, 문서 내용을 자기 멋대로 해석하는 경우가 여기 해당한다.

3. 시간적 혼동 (Temporal Disorientation)

학습 데이터의 시점과 현재 시점을 구분하지 못한다. 이미 끝난 사건을 진행 중이라고 답하거나, 폐업한 회사의 CEO를 현직으로 답하는 식이다. 학습 컷오프 이후 정보는 모델 입장에서는 존재하지 않는 시간대에 있다.

4. 출처 조작 (Reference Fabrication)

가장 악명 높은 유형이다. 존재하지 않는 논문, 책, 판례, URL을 그럴듯한 형식으로 만들어낸다. 저자 이름, 출판 연도, 저널명이 모두 그럴싸하지만 실제로 검색하면 아무것도 안 나온다. 변호사가 ChatGPT가 만든 가짜 판례를 법정에 제출했다가 징계받은 사례가 미국에서 여러 번 보도된 적이 있다.

이 외에도 코드 생성 환각(존재하지 않는 라이브러리 함수 호출), 윤리적 환각, 멀티모달 환각 등 도메인별 변종이 계속 보고되고 있다.


왜 발생하는가 — 환각의 4단계 원인

환각은 한 군데서 발생하는 게 아니라 LLM 개발 라이프사이클의 모든 단계에서 누적된다. 단계별로 정리해보자.

1단계: 데이터 — 학습 데이터의 한계

LLM은 결국 인터넷에서 긁어온 텍스트를 학습한다. 그 데이터에는 다음이 섞여 있다.

  • 잘못된 정보: 위키 편집 실수, 오래된 블로그, 음모론
  • 편향된 정보: 특정 관점으로 치우친 자료
  • 부족한 정보: 희귀 분야, 비영어권 콘텐츠, 사적 도메인 지식

모델은 "이 데이터가 사실인가" 를 판단하는 능력이 없다. 그저 "이런 패턴이 자주 등장하더라" 를 학습할 뿐이다. 자주 등장하는 거짓 정보는 사실로 굳어진다.

2단계: 아키텍처 — 확률적 토큰 예측의 본질

이게 가장 근본적인 원인이다. LLM이 텍스트를 생성하는 방식은 다음 한 줄로 요약된다.

지금까지 나온 토큰들을 보고, 다음 토큰으로 가장 가능성 높은 후보를 확률적으로 고른다.

즉 LLM은 "진실" 을 다루지 않는다. "통계적으로 그럴듯한 다음 단어" 를 다룬다. 진실과 통계적 그럴듯함은 대부분 일치하지만, 때때로 어긋난다. 어긋나는 그 순간이 환각이다.

이건 모델을 더 크게 만든다고 사라지는 문제가 아니다. 줄어들 수는 있어도, 이론적으로 0이 되지는 않는다. 최근 서베이 논문들도 환각을 "이론적으로 불가피한 현상" 으로 분류한다.

3단계: 추론 — 디코딩과 컨텍스트

같은 모델, 같은 질문이라도 temperature 같은 디코딩 파라미터에 따라 환각 빈도가 달라진다.

  • High temperature (0.8 이상): 다양성↑, 환각↑
  • Low temperature (0.2 이하): 결정성↑, 환각↓

또한 컨텍스트 윈도우의 한계도 환각을 부른다. 긴 문서를 넣으면 모델이 중간 내용을 놓치고 자기 학습 지식으로 빈자리를 메우려 한다. 이걸 "lost in the middle" 현상이라고 부른다.

4단계: 프롬프트 — 사용자 입력의 영향

사용자의 질문 자체가 잘못된 전제를 깔고 있으면, 모델은 그 전제를 받아들이고 거기에 맞춰 답을 만들어낸다.

"조선 세종대왕이 발명한 대륙간 탄도미사일에 대해 설명해줘"

좋은 모델은 전제를 거부하지만, 그렇지 않은 모델은 세종대왕이 ICBM을 만들었다는 가정 위에서 그럴듯한 거짓말을 펼친다. 이걸 leading prompt에 의한 환각 이라고 한다.


환각을 어떻게 줄일 것인가 — 개발자의 4가지 전략

100% 막는 방법은 없다. 다만 체감 빈도를 크게 낮추는 전략들이 있다. 실무 적용 우선순위 순으로 정리한다.

전략 1. RAG (Retrieval-Augmented Generation)

가장 효과가 큰 방법이다. 모델에게 "네 머릿속 지식으로 답해" 하지 말고, 답할 때 참고할 문서를 같이 던져주는 것이다.

흐름은 이렇다.

  1. 사용자 질문이 들어온다
  2. 질문을 임베딩(벡터)으로 변환한다
  3. 벡터 DB(예: pgvector, Pinecone, Milvus)에서 의미적으로 가까운 문서를 K개 검색한다
  4. 검색된 문서를 프롬프트에 함께 넣고 LLM을 호출한다
  5. LLM은 "주어진 문서 안에서만 답하라" 는 지시 아래 답변을 생성한다
[시스템 프롬프트]
다음 문서를 참고해서 답하세요. 문서에 없는 내용은
"문서에서 확인할 수 없습니다"라고 답하세요.

[검색된 문서]
{retrieved_docs}

[사용자 질문]
{user_query}

RAG는 "학습 컷오프 이후 정보" 와 "사적 도메인 지식" 환각을 거의 다 잡아준다. 단, RAG도 만능은 아니다. 검색이 부정확하면(잘못된 문서를 찾아오면) 환각이 그대로 나오고, 모델이 검색된 문서를 무시하고 자기 지식으로 답하는 경우도 있다. 그래서 "문서에 없으면 모른다고 답하라" 같은 명시적 지시가 중요하다.

전략 2. 프롬프트 엔지니어링

모델 호출 코드를 손대지 않고도 환각을 줄일 수 있는 가장 싼 방법이다. 효과적인 패턴 몇 가지.

1) 명시적 불확실성 허용

모르는 내용에 대해서는 추측하지 말고 "확실하지 않습니다"라고
답하세요. 잘못된 정보를 자신 있게 답하는 것보다 모른다고
답하는 것이 훨씬 낫습니다.

이 한 문장만 시스템 프롬프트에 넣어도 환각이 눈에 띄게 줄어든다.

2) 출처 명시 요구

답변에 사용한 사실에 대해서는 반드시 출처(문서명·페이지·URL)를
함께 표기하세요. 출처를 댈 수 없는 정보는 답변에서 제외하세요.

출처를 요구하면 모델이 "근거가 있는 정보" 만 골라서 답하려는 경향이 강해진다. 단, 출처 자체를 환각하는 경우도 있으니 후처리에서 검증이 필요하다.

3) Chain-of-Thought + Self-Verification

답을 바로 내지 말고 추론 과정을 먼저 적게 한 다음, 그 추론을 스스로 검증 하게 한다. 두 단계로 호출이 늘어나서 비용은 올라가지만, 사실성이 중요한 도메인(법률, 의료, 금융)에서는 충분히 가치 있다.

전략 3. 검증 워크플로우 — AI 출력은 항상 초안

이건 기술이 아니라 운영 원칙이다. 사용자가 메모리에서 강조하는 것과도 정확히 같은 관점인데, AI의 출력을 그대로 신뢰하지 않고 항상 검증 단계를 둬야 한다. 특히 다음은 무조건 검증한다.

  • 숫자: 통계, 가격, 날짜, 버전, 비율
  • 출처: 논문 제목, 저자, URL, 책 ISBN
  • 법규/기준: 법조문, 표준 번호, 인증 기준
  • 최신 정보: 현직, 진행 중 사건, 최신 릴리즈 버전

검증 워크플로우는 "AI 답변 → 사람 검토 → 게시" 의 단순한 형태일 수도 있고, "AI 답변 → 다른 모델로 cross-check → 검증 통과한 부분만 저장" 같은 자동화 형태일 수도 있다. 도메인 위험도에 맞춰 설계하면 된다.

전략 4. 모델·파라미터 선택

모든 환각이 같지 않다. 작업 성격에 맞춰 모델과 파라미터를 고르면 환각을 구조적으로 줄일 수 있다.

  • 사실성 중요한 작업: 큰 모델 + temperature 0.1~0.3
  • 창의성 필요한 작업: 작은 모델도 OK + temperature 0.7~1.0
  • 코드 생성: 코드 특화 모델 + 낮은 temperature + 컴파일/테스트로 검증
  • 에이전트(도구 호출) 작업: tool-use 학습이 잘 된 모델 + 함수 시그니처 엄격 정의

실무 체크리스트

지금까지 정리한 내용을 한 페이지로 압축하면 다음과 같다.

  • [ ] 숫자·출처·법규·최신 정보는 무조건 검증한다
  • [ ] 사적 도메인 지식이나 최신 정보가 필요하면 RAG를 도입한다
  • [ ] 시스템 프롬프트에 "모르면 모른다고 답하라" 를 명시한다
  • [ ] 사실성 작업은 temperature를 낮게 둔다
  • [ ] 답변 출처를 요구하되, 출처 자체도 검증한다
  • [ ] 위험도 높은 도메인에서는 사람 검토 또는 cross-check 단계를 둔다
  • [ ] AI 출력은 최종 결과물이 아니라 초안 으로 본다

마무리 — 환각은 없앨 대상이 아니라 관리할 대상

LLM 환각은 잡초 같은 게 아니라 날씨 같은 것이다. 막을 수 없으니, 그 위에서 제대로 일하는 법을 익혀야 한다. 모델이 더 좋아져도 환각은 0이 되지 않고, 새 도메인·새 데이터·새 모델이 나올 때마다 새로운 형태의 환각이 같이 나온다.

가장 위험한 건 환각 자체가 아니라, 환각을 인지하지 못하는 워크플로우다. AI 답변을 검증 없이 그대로 게시하거나, 그대로 코드에 박거나, 그대로 보고서에 인용하는 순간 사고가 난다. 반대로 "AI 출력은 항상 초안" 이라는 원칙만 팀이 공유하고 있으면, 환각이 있어도 시스템은 안전하게 굴러간다.

환각을 두려워하지 말고, 이해하고 다루는 쪽으로 가자. 이 글에서 정리한 4가지 원인과 4가지 대응 전략이 그 출발점이 될 것이다.


참고 자료

  • Aisha Alansari, Hamzah Luqman. Large Language Models Hallucination: A Comprehensive Survey (arXiv:2510.06265, 2025.10)
  • A Comprehensive Taxonomy of Hallucinations in Large Language Models (arXiv:2508.01781, 2025.08)
  • LLM-based Agents Suffer from Hallucinations (arXiv:2509.18970, 2025.09)
  • Lewis et al. Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks

 

728x90
반응형
728x90
반응형

AI 전쟁의 중심이 바뀌고 있다: 모델 경쟁에서 인프라·반도체·규제 경쟁으로

2026년 4월 말 AI 업계의 주요 뉴스를 보면, 이제 AI 경쟁은 단순히 “어떤 모델이 더 똑똑한가”의 문제가 아닌 것으로 보입니다. 모델 성능 경쟁은 여전히 중요하지만, 실제 승부는 가격, 클라우드 인프라, 반도체, 플랫폼 접근권, 교육 시장으로 빠르게 확장되고 있습니다.

이번 글에서는 최근 AI 관련 주요 이슈를 6가지 흐름으로 정리해 보겠습니다.


1. DeepSeek, 새 AI 모델 출시와 가격 인하

중국 AI 기업 DeepSeek가 새로운 AI 모델 DeepSeek-V4-Pro를 공개하고, 개발자 대상 할인과 API 가격 인하를 내세웠습니다.

이번 이슈에서 중요한 점은 단순한 신모델 출시가 아닙니다. DeepSeek는 고성능 모델 경쟁에 참여하면서 동시에 가격 인하 전략을 펼치고 있습니다. 이는 OpenAI, Anthropic, Google 등 기존 강자들에게도 가격 압박으로 작용할 수 있습니다.

AI 모델 시장이 점점 스마트폰 시장처럼 바뀌는 모습입니다. 고성능 프리미엄 모델과 저렴한 실용형 모델이 나뉘고, 기업 고객은 성능뿐 아니라 비용 대비 효율을 따지게 됩니다.


2. OpenAI, GPT-5.5 공개

OpenAI는 GPT-5.5를 공개했습니다. GPT-5.5는 코딩, 리서치, 데이터 분석, 문서 작업 등 실제 업무 수행 능력을 강조한 모델입니다.

이제 AI 모델의 핵심 경쟁력은 단순 대화 능력이 아닙니다. 사용자가 요청한 작업을 얼마나 정확하게 이해하고, 여러 단계를 거쳐 실제 결과물로 완성할 수 있는지가 중요해지고 있습니다.

특히 개발자와 기업 입장에서는 AI가 단순 답변 도구가 아니라 코딩 보조, 분석 도구, 업무 자동화 도구로 자리 잡고 있습니다.


3. Google과 Amazon, Anthropic에 대규모 투자

Google 모회사 Alphabet은 Anthropic에 최대 400억 달러 투자를 추진하는 것으로 알려졌습니다. Amazon 역시 Anthropic과의 협력을 확대하며 AWS 인프라 사용 계약을 강화했습니다.

Anthropic은 Claude 모델로 잘 알려진 AI 기업입니다. 최근 빅테크 기업들이 Anthropic에 집중하는 이유는 단순합니다. AI 모델 경쟁에서 살아남기 위해서는 막대한 컴퓨팅 자원이 필요하기 때문입니다.

AI 기업은 모델만 잘 만들어서는 부족합니다. 클라우드, 데이터센터, AI 반도체, 전력 인프라까지 확보해야 합니다. 결국 AI 산업의 경쟁은 소프트웨어 경쟁이면서 동시에 인프라 경쟁입니다.


4. SK하이닉스, AI 메모리 수요로 주목

AI 반도체 수요가 커지면서 한국 기업도 직접적인 영향을 받고 있습니다. SK하이닉스는 AI 메모리 수요에 대응하기 위해 국내 신규 공장 투자를 발표했고, AI 수요 기대감으로 주가도 강세를 보였습니다.

특히 HBM과 같은 고대역폭 메모리는 AI 서버와 데이터센터에 필수적인 부품입니다. 생성형 AI 서비스가 확산될수록 더 많은 GPU와 메모리가 필요해집니다.

한국 입장에서는 AI 서비스 기업보다 반도체 공급망에서 더 큰 기회를 얻을 가능성이 있습니다. AI 경쟁이 치열해질수록 SK하이닉스, 삼성전자 같은 메모리 기업의 역할도 커질 수 있습니다.


5. Samsung SDS·LG CNS, ChatGPT Edu 국내 판매권 확보

Samsung SDS와 LG CNS는 OpenAI와의 파트너십을 통해 한국에서 ChatGPT Edu 판매권을 확보했습니다.

ChatGPT Edu는 교육기관을 대상으로 한 AI 서비스입니다. 이 이슈는 국내 대학과 교육기관의 AI 도입이 본격화될 수 있다는 점에서 의미가 있습니다.

앞으로 AI는 개인이 구독해서 쓰는 도구를 넘어, 학교·기업·공공기관 단위로 도입되는 인프라가 될 가능성이 큽니다. 특히 교육 분야에서는 과제 보조, 연구 지원, 행정 자동화, 맞춤형 학습 등에 활용될 수 있습니다.


6. EU, Meta의 WhatsApp AI 정책에 제동

EU는 Meta가 WhatsApp에서 경쟁 AI 서비스의 접근을 제한하거나 수수료를 부과하는 방식에 대해 반독점 문제를 제기했습니다.

이 이슈는 앞으로 AI 경쟁이 플랫폼 접근권 싸움으로 번질 수 있다는 점을 보여줍니다. 메신저, 검색, 운영체제, 앱스토어 같은 플랫폼을 가진 기업이 자사 AI를 우선 노출하면, 경쟁 AI 기업은 사용자에게 접근하기 어려워질 수 있습니다.

즉, AI 경쟁은 모델 성능만으로 결정되지 않습니다. 사용자가 어떤 플랫폼에서 어떤 AI를 만나게 되는지도 중요한 경쟁 요소가 됩니다.


정리: AI 산업은 어디로 가고 있나?

최근 AI 뉴스를 종합하면 다음과 같은 흐름이 보입니다.

첫째, AI 모델 가격 경쟁이 본격화되고 있습니다.
DeepSeek의 가격 인하는 AI 모델 시장의 수익 구조에 영향을 줄 수 있습니다.

둘째, 업무형 AI 모델 경쟁이 심화되고 있습니다.
OpenAI GPT-5.5처럼 코딩, 리서치, 분석, 문서 작업에 특화된 모델이 중요해지고 있습니다.

셋째, AI 인프라 투자가 폭발적으로 증가하고 있습니다.
Google, Amazon, Anthropic의 협력은 AI 산업이 클라우드와 데이터센터 중심으로 움직이고 있음을 보여줍니다.

넷째, 한국은 AI 반도체 공급망에서 중요한 위치를 차지하고 있습니다.
SK하이닉스의 AI 메모리 투자는 한국 기업이 글로벌 AI 경쟁에서 중요한 역할을 할 수 있음을 보여줍니다.

다섯째, AI는 교육과 기업 시장으로 확산되고 있습니다.
ChatGPT Edu 국내 판매권 확보는 한국 교육기관의 AI 도입 확대 가능성을 보여줍니다.

여섯째, AI 규제와 플랫폼 독점 문제가 커지고 있습니다.
EU와 Meta의 갈등은 앞으로 AI 서비스가 공정하게 유통될 수 있는지에 대한 논쟁으로 이어질 수 있습니다.


결론

AI 산업은 이제 단순한 챗봇 경쟁을 넘어섰습니다. 모델 성능, 가격, 클라우드 인프라, 반도체, 교육 시장, 규제까지 모두 연결된 거대한 산업 경쟁으로 바뀌고 있습니다.

앞으로 AI 뉴스를 볼 때는 “어떤 모델이 더 뛰어난가”만 볼 것이 아니라, 그 모델을 운영하는 데 필요한 반도체, 데이터센터, 클라우드, 플랫폼, 규제 환경까지 함께 살펴봐야 합니다.

AI 전쟁의 진짜 핵심은 이제 모델 그 자체가 아니라, 모델을 둘러싼 전체 생태계입니다.


출처 참고:
- Reuters: DeepSeek, 새 AI 모델 가격 인하
- OpenAI: GPT-5.5 공개
- Reuters: Google의 Anthropic 투자 추진
- AP: Anthropic의 AWS 사용 계약
- Reuters: SK하이닉스 AI 메모리 투자 및 주가 강세
- Yonhap: Samsung SDS·LG CNS, ChatGPT Edu 국내 판매권 확보
- Reuters: EU의 Meta WhatsApp AI 반독점 조치


728x90
반응형
728x90
반응형

요약 한 줄
쿠키는 브라우저가 들고 다니는 작은 메모, 세션은 서버가 기억하고 쿠키(JSESSIONID)로 찾아오는 저장공간입니다. 로그인/장바구니는 보통 “세션”으로, “아이디 기억하기”는 “쿠키”로!
 

목차

  1. 쿠키 vs 세션 한눈 비교
  2. 쿠키: 브라우저가 저장하는 메모
  3. 세션: 서버가 관리하는 사용자 상태
  4. 로그인 흐름(쿠키·세션 조합) 실전 이해
  5. 보안 옵션(HttpOnly/Secure/SameSite) 핵심
  6. 서블릿/톰캣 기준 코드 예제
  7. 빈출 질문 & 실수 모음
  8. 체크리스트(면접/시험 대비)

1) 쿠키 vs 세션 한눈 비교

구분                                       쿠키(Cookie)                                                                                           세션(Session)

저장 위치클라이언트(브라우저)서버(메모리/세션 저장소)
식별 방식Cookie 헤더로 키-값 전달JSESSIONID 쿠키로 세션을 조회
수명Max-Age/Expires로 지정(영구/단기)유휴 시간(예: 30분) 지나면 만료
용도아이디 기억, 다크모드, A/B 실험 등로그인 상태, 장바구니, 권한 정보
보안탈취 위험 → HttpOnly/Secure/SameSite 필수서버 보안 중심, 세션 고정 공격 주의
용량도메인당 수 KB 수준서버 자원 사용(사용자 수↑ = 메모리↑)
 

포인트: “민감한 정보는 쿠키에 절대 직접 저장하지 말고, 세션에 저장하고 식별용 세션ID만 쿠키로!”


2) 쿠키: 브라우저가 저장하는 메모

  • 구성: name=value; Path=/; Domain=.example.com; Max-Age=2592000; Secure; HttpOnly; SameSite=Lax
  • 수명
    • 세션 쿠키: 브라우저 종료 시 삭제(수명 미지정)
    • 영속 쿠키: Max-Age/Expires 지정
  • 도메인/경로: 전송 범위를 최소화하면 노출면을 줄여 보안↑
  • 보안 옵션
    • HttpOnly: JS로 접근 차단(XSS 완화)
    • Secure: HTTPS에서만 전송
    • SameSite: 크로스사이트 전송 제어(Lax 기본 추천, 제3자 필요 시 None; Secure)

3) 세션: 서버가 관리하는 사용자 상태

  • 생성: 로그인 성공 → HttpSession에 사용자 정보를 저장
  • 식별: 컨테이너가 발급한 랜덤한 세션ID를 쿠키(JSESSIONID)로 클라이언트에 심음
  • 유지: 요청마다 JSESSIONID로 세션을 찾아서 상태를 이어감
  • 만료: 유휴 시간 초과 or 명시적 invalidate()
  • 확장: 서버 다중대응 시 스티키 세션 또는 외부 세션 저장소(예: Redis) 고려

4) 로그인 흐름(쿠키·세션 조합)

  1. 사용자가 로그인 폼 제출 → 서버에서 인증 성공
  2. HttpSession에 loginUser 저장, 세션ID 발급 → Set-Cookie: JSESSIONID=...
  3. 이후 요청에서 브라우저는 JSESSIONID를 자동 전송 → 서버는 해당 세션으로 사용자 식별
  4. “아이디 기억하기”는 별도 쿠키(rememberId)로 저장(민감정보 X)

5) 보안 옵션 핵심 정리

  • 항상 HttpOnly + Secure(HTTPS 전제)
  • SameSite=Lax 기본. 외부 리다이렉트/결제 등 크로스사이트 필요 시 SameSite=None; Secure
  • 세션 고정 방지: 로그인 성공 시 세션 재발급(invalidate 후 새 세션)
  • 쿠키 범위 최소화: Path, Domain 축소
  • 민감정보(토큰·개인정보) 쿠키 값에 직접 저장 금지(서버 세션 or 안전 저장소 사용)

6) 서블릿/톰캣 기준 코드 예제

6-1. 세션 사용 (로그인 성공 시)

// 로그인 검증 이후
HttpSession session = req.getSession();               // 없으면 생성
session.setAttribute("loginUser", user);              // 사용자 객체/ID 등
session.setMaxInactiveInterval(30 * 60);             // 30분 비활성 시 만료

// 필요 시 세션 고정 방지: 새 세션 발급
session.invalidate();
HttpSession newSession = req.getSession(true);
newSession.setAttribute("loginUser", user);

6-2. 로그아웃

HttpSession session = req.getSession(false); // 있으면 가져오고, 없으면 null
if (session != null) {
    session.invalidate();                    // 세션 파기
}
resp.sendRedirect("/");                      // 홈으로

6-3. “아이디 기억하기” 쿠키

import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import jakarta.servlet.http.Cookie;

// 로그인 폼에서 remember 체크 시
String userId = req.getParameter("userId");
Cookie remember = new Cookie("rememberId",
        URLEncoder.encode(userId, StandardCharsets.UTF_8));
remember.setPath("/");                // 필요한 최소 경로
remember.setMaxAge(60 * 60 * 24 * 30);// 30일
remember.setHttpOnly(true);           // JS 접근 차단
remember.setSecure(true);             // HTTPS에서만
resp.addCookie(remember);

6-4. SameSite 설정(서블릿 표준 속성 미지원 시 헤더로)

// Some containers still need manual header for SameSite
String cookie = "rememberId=" + URLEncoder.encode(userId, StandardCharsets.UTF_8)
        + "; Max-Age=2592000; Path=/; HttpOnly; Secure; SameSite=Lax";
resp.setHeader("Set-Cookie", cookie);

6-5. 쿠키 읽기

Cookie[] cookies = req.getCookies();
if (cookies != null) {
    for (Cookie c : cookies) {
        if ("rememberId".equals(c.getName())) {
            String id = java.net.URLDecoder.decode(c.getValue(), StandardCharsets.UTF_8);
            // 폼 기본값으로 채우기 등 활용
        }
    }
}

7) 빈출 질문 & 실수 모음

  • Q. 세션은 어디 저장되나요?
    A. 기본은 서버 메모리(컨테이너). 규모가 커지면 외부 저장소/세션 클러스터링.
  • Q. 쿠키에 토큰/JWT 넣어도 되나요?
    A. 가능하나 HttpOnly+Secure+SameSite를 지키고, 만료·회수 전략 및 XSS/CSRF 대비 필수.
  • Q. 로드밸런싱에서 세션이 사라져요!
    A. 스티키 세션(같은 서버로 라우팅) 또는 공유 세션 저장소를 사용하세요.
  • 실수1: 쿠키에 개인정보/권한을 평문으로 저장
  • 실수2: HttpOnly/Secure 빠짐
  • 실수3: 로그인 시 세션 재발급 미흡(세션 고정 취약점)
  • 실수4: SameSite 미설정으로 외부 연동 시 쿠키 전송 안 돼서 로그인 깨짐

8) 체크리스트(면접/시험 대비)

  • 쿠키/세션 차이 10초 안에 설명 가능?
  • JSESSIONID 역할 & 세션 재발급 타이밍 이해?
  • HttpOnly/Secure/SameSite 각각의 의미/기본값/언제 쓰는지?
  • 분산 환경에서 세션 유지 전략(스티키 vs 저장소) 장단점?

썸네일/타이틀 이미지

  • 파일: session_cookie_title.png
  • 컨셉: 쿠키 캐릭터가 “세션” 메모를 브라우저에게 전달하는 귀여운 낙서 스타일
  • 티스토리 글 상단에 업로드 후 대표 이미지로 설정하세요.
728x90
반응형
728x90
반응형

📖 본문

1. 크리티컬 렌더링 패스란?

브라우저가 HTML, CSS, JavaScript를 해석하고,
**사용자가 볼 수 있는 화면(Pixel)**으로 만드는 전체 과정을 말합니다.
즉, “코드를 → 화면”으로 바꾸는 여정이죠.


2. 단계별 과정

① HTML 파싱 → DOM 생성

  • 브라우저가 HTML 파일을 위에서부터 한 줄씩 읽음
  • 태그를 구조화하여 DOM(Document Object Model) 트리로 만듦

② CSS 파싱 → CSSOM 생성

  • <link> 또는 <style> 태그의 CSS를 해석
  • CSS 규칙을 트리 구조로 만들어 CSSOM 형성

③ Render Tree 생성

  • DOM + CSSOM 결합 → 렌더 트리(Render Tree) 생성
  • 실제 화면에 보여질 요소와 스타일 정보만 포함

④ 레이아웃(Layout)

  • 각 요소의 크기와 위치 계산
  • 반응형이라면 화면 크기에 맞춰 재계산

⑤ 페인팅(Paint)

  • 색상, 그림자, 이미지 등을 픽셀 단위로 채움

⑥ 합성(Composite)

  • 여러 레이어를 합쳐 최종 화면을 그림

3. 중요한 점 — 렌더링 속도에 영향을 주는 요소

  • CSS와 JS 로드 순서
    • CSS가 늦게 로드되면 렌더링이 지연됨
    • JS는 DOM 파싱을 멈추게 할 수 있음 (defer, async 활용)
  • 이미지 용량
    • 용량이 크면 페인팅에 시간 많이 걸림
  • 리플로우 / 리페인트 최소화
    • DOM 구조나 스타일 변경이 많으면 속도 저하

4. 브라우저 렌더링 흐름 그림

HTML → DOM 생성
CSS → CSSOM 생성
DOM + CSSOM → Render Tree 생성
Render Tree → Layout(크기·위치 계산)
Layout → Paint(색칠)
Paint → Composite(합성)

📌 정리 표

단계                                                                                   설명

DOM 생성 HTML 구조 파싱
CSSOM 생성 CSS 해석
Render Tree DOM+CSSOM 결합
Layout 요소 크기·위치 계산
Paint 픽셀 색칠
Composite 화면 합성
728x90
반응형
728x90
반응형

📖 본문

1. 사용자가 URL 입력

브라우저 주소창에 https://example.com 을 입력하면, 브라우저는 "이 주소의 컴퓨터(IP)를 찾아야겠다!" 라고 생각합니다.


2. DNS 조회

도메인(example.com)은 그냥 이름일 뿐, 실제로는 IP 주소를 알아야 서버를 찾을 수 있습니다.

  • 브라우저 → DNS 서버에 “example.com IP 뭐야?”
  • DNS 서버 → “192.0.2.1 입니다!”

3. TCP 연결 (3-Way Handshake)

브라우저와 서버가 "안전하게 데이터 주고받자" 하고 약속을 맺습니다.

  1. 브라우저 → 서버: “나 연결할래(SYN)”
  2. 서버 → 브라우저: “좋아, 연결하자(SYN+ACK)”
  3. 브라우저 → 서버: “알았어(ACK)”

4. HTTP 요청 보내기

브라우저가 서버로 HTTP Request를 전송합니다.

  • 요청 방식: GET / POST
  • 요청 헤더: 브라우저 정보, 쿠키, 데이터 형식 등
  • 요청 바디(POST일 경우): 폼 데이터, JSON 등

5. 서버 처리

서버는 요청을 받아 다음 작업을 합니다.

  1. URL 분석 → 라우터로 경로 매칭
  2. 필요한 데이터(DB 조회 등) 준비
  3. HTML, JSON, 이미지 등 응답 데이터 생성

6. HTTP 응답 보내기

서버는 브라우저에 HTTP Response를 보냅니다.

  • 응답 상태 코드: 200(성공), 404(없음), 500(오류) 등
  • 응답 헤더: 데이터 타입(Content-Type), 길이, 캐시 정보 등
  • 응답 바디: HTML, CSS, JS, 이미지 등 실제 화면에 필요한 데이터

7. 브라우저 렌더링

브라우저는 받은 HTML을 해석하고,

  • CSS 적용
  • JS 실행
  • 이미지 로드
    를 거쳐 최종 화면을 사용자에게 보여줍니다.

🔍 전체 흐름 그림

[사용자]
   ↓ URL 입력
[브라우저]
   ↓ DNS 조회
[DNS 서버]
   ↓ IP 전달
[브라우저]
   ↓ TCP 연결
[서버]
   ↓ 요청 처리
[브라우저]
   ↓ 렌더링
[사용자]

단계                                                                                                            설명

URL 입력 브라우저가 요청 준비
DNS 조회 도메인을 IP로 변환
TCP 연결 안전한 데이터 통신 준비
HTTP 요청 서버로 데이터 요청
서버 처리 요청 분석, 데이터 생성
HTTP 응답 브라우저로 결과 전송
렌더링 화면 표시
728x90
반응형
728x90
반응형

📡 “404야, 내 마음도 Not Found다...”


✅ HTTP 상태코드란?

서버가 클라이언트의 요청에 대해 어떤 결과를 돌려줬는지 알려주는 숫자 코드입니다.

예를 들어...

  • "응, 잘 받았어!" → 200 OK
  • "어..? 너 누구?" → 401 Unauthorized
  • "뭐라는 거야?" → 400 Bad Request

🎯 상태코드는 크게 5가지로 나뉩니다

범위의미예시
1xx 정보 거의 안 씀
2xx 성공 200, 201, 204
3xx 리다이렉트 301, 302, 304
4xx 클라이언트 에러 400, 401, 403, 404
5xx 서버 에러 500, 502, 503, 504
 

🔵 2xx: 성공했어요!

코드의미설명
200 OK 정상 처리 완료 제일 자주 보는 성공 코드
201 Created 생성됨 POST로 새 리소스 생성 시
204 No Content 응답 본문 없음 처리는 됐지만 줄 말은 없음
 

🟡 3xx: 어이쿠! 이리로 와요~

코드의미설명
301 Moved Permanently 영구 이동 브라우저 캐싱까지 함
302 Found 임시 이동 예전에는 흔히 사용했음
304 Not Modified 변경 없음 캐시 덕에 통신량 절약~
 

🔴 4xx: 너가 잘못했어 (Client Error)

코드의미설명
400 Bad Request 요청이 이상해요 문법 오류, 파라미터 실수 등
401 Unauthorized 인증 필요해요 토큰 없어! 로그인 먼저!
403 Forbidden 권한 없어 있어도 안돼요 ❌
404 Not Found 찾을 수 없어요 페이지 없어… 내 인생도...
 

⚫ 5xx: 서버가 잘못했어요 (Server Error)

코드의미설명
500 Internal Server Error 서버가 터졌어요 💥 대표적인 오류 코드
502 Bad Gateway 게이트웨이 문제 보통 nginx랑 친함
503 Service Unavailable 잠시만요~ 서버 과부하, 점검 중
504 Gateway Timeout 응답 없어요 서버가 너무 느림... zzz
 

😂 코드별 상황극 예시

[404 Not Found]
👉 너 걔 봤어?
👤 누구?
👉 내 미래.
[403 Forbidden]
👉 사장님, 이 폴더 좀 볼게요.
👤 ...너 권한 없어. 꺼져.

🔐 상태코드, 실무에선 이렇게 써요!

  • API 응답에 반드시 상태코드 명확히 반환
  • 정상 처리: 200 또는 201
  • 예외 처리: 400, 401, 403, 500 등 구분
  • 프론트와 협업 시 명확한 상태 정의 문서 공유 필요
728x90
반응형
728x90
반응형

RESTful API는 웹 개발자라면 반드시 알아야 할 핵심 기술입니다.


✅ REST란 무엇인가요?

**REST(Representational State Transfer)**는 2000년에 로이 필딩(Roy Fielding)이 논문에서 처음 제안한 아키텍처 스타일입니다.
쉽게 말해, 웹에서 자원을 HTTP 방식으로 다루는 표준화된 방법이라고 생각하시면 됩니다.


📌 REST의 6가지 핵심 제약조건

제약 조건설명
1. 클라이언트-서버 구조 역할을 분리하여 유지보수성과 확장성 향상
2. 무상태(Stateless) 요청 간 서버는 클라이언트 상태를 저장하지 않음
3. 캐시 처리 가능 응답 데이터는 캐싱될 수 있어야 함
4. 계층화 시스템 중간 서버를 통해 확장 구조 구성 가능
5. 인터페이스 일관성 URI, HTTP 메서드 등 통일된 사용법 준수
6. 코드 온 디맨드 (선택사항) 서버가 클라이언트에 스크립트 전송 가능
 

🧭 RESTful API란?

REST 원칙을 따르는 API를 말합니다. 즉, HTTP 메서드와 URL을 이용해 자원을 CRUD 방식으로 처리하는 것이죠.


🚀 RESTful API 예제

가상의 블로그 게시글(Post)에 대한 API를 설계한다고 가정해볼게요.

기능HTTP 메서드URI설명
목록 조회 GET /posts 모든 게시글 조회
단일 조회 GET /posts/{id} 특정 게시글 조회
작성 POST /posts 게시글 작성
수정 PUT /posts/{id} 게시글 전체 수정
삭제 DELETE /posts/{id} 게시글 삭제
 

🔄 RESTful 하지 않은 API 예시

GET /getPosts
POST /createPost
  • ❌ 이런 방식은 RESTful하지 않습니다.
  • ✅ RESTful 방식은 명사 중심 URI와 HTTP 메서드를 적절히 사용하는 것이 핵심입니다.

💡 RESTful API 설계 시 팁

  • URI에는 동사 대신 명사 사용
  • URI는 소문자 사용
  • 언더스코어(_)보단 하이픈(-) 사용 권장
  • 응답 상태 코드 (200, 201, 400, 404 등) 정확히 설정
  • 예외 응답은 JSON 형태로 일관되게 처리

🛠️ RESTful API 구현 프레임워크

  • Spring Boot (Java)
  • Express (Node.js)
  • Flask / Django REST Framework (Python)
  • FastAPI (Python, 최신 트렌드)
  • Laravel (PHP)
728x90
반응형
728x90
반응형

🔷 쿠키(Cookie)란?

  • 정의: 사용자의 브라우저에 저장되는 작은 데이터
  • 주 용도: 로그인 유지, 사용자 설정 저장
  • 특징
    • 클라이언트(브라우저)에 저장됨
    • 서버가 Set-Cookie 헤더로 설정
    • 매 요청마다 자동으로 서버에 함께 전송됨
    • 보안에 취약할 수 있음 (노출 가능성)
Set-Cookie: sessionId=abc123; Path=/; HttpOnly

🔷 세션(Session)이란?

  • 정의: 서버가 사용자 정보를 서버 메모리 또는 DB에 저장하고 식별하는 방식
  • 주 용도: 인증 정보 저장 (로그인 상태)
  • 특징
    • 서버에서 관리됨
    • 사용자는 식별자(sessionId)만 쿠키로 보유
    • 상대적으로 안전하지만 서버에 부담이 있음

🔷 토큰(Token)이란?

  • 정의: 인증 정보를 포함한 문자열(주로 JWT 형식)을 클라이언트가 보관
  • 주 용도: API 인증 (특히 모바일, SPA 등)
  • 특징
    • 주로 JWT 형태로 인코딩된 정보 포함
    • 클라이언트가 보관 (쿠키나 로컬스토리지)
    • Stateless 구조 (서버가 상태 저장 안 함)
    • 보안 주의: XSS, 탈취 방지 필요
    •  
Header.Payload.Signature (JWT 구조 예시)

🔷 쿠키 vs 세션 vs 토큰 비교

항목쿠키세션토큰
저장 위치 브라우저 서버 브라우저
서버 상태 Stateless Stateful Stateless
보안 낮음 높음 중간 (구현에 따라 다름)
인증 방식 X O (세션 ID) O (Access Token)
API 사용 제한적 부적합 매우 적합
 

🔷 실무 예시

  • 쿠키: 자동 로그인, 장바구니, 테마 설정 등
  • 세션: Spring MVC 로그인 처리 시 사용 (HttpSession)
  • 토큰: Spring Security + JWT, OAuth 인증 등에서 사용

✅ 마무리

쿠키, 세션, 토큰은 각각의 목적과 장단점이 있으며,
웹 서비스의 규모, 보안 요건, 확장성에 따라 적절히 선택해야 합니다.
특히, SPA + 모바일 API 환경에서는 토큰 기반 인증(JWT)이 주로 사용됩니다.

728x90
반응형

+ Recent posts