Jake Seo
제이크서 개발 블로그
Jake Seo
전체 방문자
오늘
어제
  • 분류 전체보기 (719)
    • AI 서비스 개발 일기 (3)
    • LLM 개발 일기 (1)
    • ------레거시 (2025.08.23 이전)--.. (0)
    • 백준 문제풀이 (1)
    • 릿코드 문제풀이 (2)
    • 알고리즘 이론 (10)
      • 기본 이론 (2)
      • 배열과 문자열 (8)
    • 데이터베이스 (15)
      • Planet Scale (1)
      • MSSQL (9)
      • 디비 기본 개념 (1)
      • SQLite 직접 만들어보기 (4)
    • 보안 (7)
    • 설계 (1)
    • 네트워크 (17)
      • HTTP (9)
      • OSI Layers (5)
    • 회고 (31)
      • 연간 회고 (2)
      • 주간 회고 (29)
    • 인프라 (52)
      • 도커 (12)
      • AWS (9)
      • 용어 (21)
      • 웹 성능 (1)
      • 대규모 서비스를 지탱하는 기술 (9)
    • 깃 (7)
    • 빌드 도구 (7)
      • 메이븐 (6)
      • 그레이들 (0)
    • Java (135)
      • 이펙티브 자바 (73)
      • 자바 API (4)
      • 자바 잡지식 (30)
      • 자바 디자인 패턴 (21)
      • 톰캣 (Tomcat) (7)
    • 프레임워크 (64)
      • next.js (14)
      • 스프링 프레임워크 (28)
      • 토비의 스프링 (6)
      • 스프링 부트 (3)
      • JPA (Java Persistence API) (5)
      • Nest.js (8)
    • 프론트엔드 (48)
      • 다크모드 (1)
      • 노드 패키지 관리 매니저 (3)
      • CSS (19)
      • Web API (11)
      • tailwind-css (1)
      • React (5)
      • React 새 공식문서 요약 (1)
      • HTML (Markup Language) (5)
    • 자바스크립트 (108)
      • 모던 자바스크립트 (31)
      • 개념 (31)
      • 정규표현식 (5)
      • 코드 스니펫 (1)
      • 라이브러리 (6)
      • 인터뷰 (24)
      • 웹개발자를 위한 자바스크립트의 모든 것 (6)
      • 팁 (2)
    • Typescript (49)
    • 리눅스와 유닉스 (10)
    • Computer Science (1)
      • Compiler (1)
    • IDE (3)
      • VSCODE (1)
      • IntelliJ (2)
    • 세미나 & 컨퍼런스 (1)
    • 용어 (개발용어) (16)
      • 함수형 프로그래밍 용어들 (1)
    • ORM (2)
      • Prisma (2)
    • NODEJS (2)
    • cypress (1)
    • 리액트 네이티브 (React Native) (31)
    • 러스트 (Rust) (15)
    • 코틀린 (Kotlin) (4)
      • 자바에서 코틀린으로 (4)
    • 정규표현식 (3)
    • 구글 애널리틱스 (GA) (1)
    • SEO (2)
    • UML (2)
    • 맛탐험 (2)
    • 리팩토링 (1)
    • 서평 (2)
    • 소프트웨어 공학 (18)
      • 테스팅 (16)
      • 개발 프로세스 (1)
    • 교육학 (1)
    • 삶의 지혜, 통찰 (1)
    • Chat GPT (2)
    • 쉘스크립트 (1)
    • 컴파일 (2)
    • Dart (12)
    • 코드팩토리의 플러터 프로그래밍 (4)
    • 플러터 (17)
    • 안드로이드 스튜디오 (1)
    • 윈도우즈 (1)
    • 잡다한 백엔드 지식 (1)
    • 디자인 패턴 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 자바스크립트 면접
  • 빈 검증
  • 이펙티브 자바
  • 자바스크립트
  • next js app
  • Pre-rendering
  • 싱글톤
  • serverless computing
  • 참조 해제
  • Java
  • 서버리스 컴퓨팅
  • 알고리즘
  • 느린 쿼리
  • 자바
  • 팩터리 메서드 패턴
  • item9
  • item8
  • 이펙티브 자바 item9
  • 객체복사
  • 자바스크립트 인터뷰
  • 작업기억공간
  • 추상 팩터리 패턴
  • 슬로우 쿼리
  • 플라이웨이트패턴
  • 싱글턴
  • NEXT JS
  • 프로그래머의 뇌
  • Javadoc 자바독 자바주석 주석 Comment
  • 스프링 검증
  • try-with-resources
  • pnpm
  • Next.js
  • MSSQL
  • 외래키 제약조건
  • 도커공식문서
  • 디자인패턴
  • 자바 디자인패턴
  • 싱글톤 패턴
  • 토비의 스프링
  • 자바 검증
  • bean Validation
  • 자료구조
  • 메이븐 라이프사이클
  • rust
  • 이펙티브자바
  • 러스트
  • item7
  • 메이븐 페이즈
  • 메이븐 골
  • prerendering

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Jake Seo

제이크서 개발 블로그

자바스크립트/라이브러리

아이언 세션 (Iron session) 이란 무엇인가? (쉬운 설명과 보안 관련 생각해볼점)

2024. 4. 3. 21:16

iron session 이란?

  • 안전하고 무상태인 쿠키 기반의 세션 라이브러리

더 쉬운 말로 설명하면?

  • 사용자가 입력한 암호를 통해 쿠키값을 암호화하고 복호화해주는 것이다.
    • 쿠키는 원래 클라이언트에게 공개되고 클라이언트가 임의로 변경할 수 있는 값인데 이에 보안을 주기 위해서 암호화/복호화를 하는 것이다.

작동 방식

  • 세션 데이터가 서명되고 암호화된 쿠키에 저장된다.
  • 서버 코드에서 네트워크가 필요 없는 상태 비저장 방식으로 디코딩된다.
    • Ruby on Rails 에서 쓰는 것과 동일한 기술이다.

특징

  • 서버리스 환경에 적합하다.
    • 세션 데이터를 쿠키에 저장하여 별도의 서버측 저장소 필요 없음
  • 사용자 패스워드가 없어도 안전하게 암호화가 가능하다.
  • 미들웨어 하나로 쉽게 세션 기능을 추가할 수 있어서 러닝커브가 작다.

인증 프로세스 예시

  1. 사용자가 아이디/패스워드를 입력해 로그인한다.
  2. 서버에서는 사용자의 아이디/패스워드를 조회하고 일치한다면 사용자의 아이디를 문자열로 반환한다. ex. kakao123
  3. 사용자의 아이디 문자열이 브라우저로 전해진다.
  4. 브라우저는 사용자의 아이디 문자열을 Iron Session 에 개발자가 정한 시크릿키를 넣어 암호화하고 쿠키에 저장한다.
  5. 브라우저에는 암호화된 사용자 아이디 쿠키가 존재한다.
  6. 사용자의 인증정보가 필요할 때마다 브라우저는 암호화된 쿠키를 서버로 보낸다.
  7. 서버는 Iron Session 과 개발자가 정한 시크릿키를 이용하여 쿠키를 복호화한다. ex. kakao123
  8. 사용자의 아이디가 kakao123 이란 것을 알아낸 서버는 DB 에서 사용자 테이블에 kakao123 를 조건으로 입력해 쿼리를 날린다.
  9. 서버는 아이디를 가진 사용자의 이름, 이메일주소 등 필요한 정보를 가져올 수 있다.
  10. 사용자는 서비스 이용을 끝마치고 로그아웃을 누른다.
  11. 암호화된 세션은 브라우저에서 지워지고 로그아웃 처리가 되고 끝난다.

예시 코드 스니펫

// 세션 쿠키 생성
const session = await getIronSession(cookies(), {
  // 세션 쿠키의 이름은 karrot 이 된다.
  cookieName: "karrot",
  // 쿠키의 복호화를 위해 필요한 문자열을 .env 에서 가져온다.
  password: process.env.COOKIE_PASSWORD!,
});

// user.id 에는 실제 계정의 id 값이 들어있다.
// session.id 에 user.id 를 할당하면
// 이는 iron-session 을 통해 암호화된 값으로 karrot 세션 쿠키에 들어갈 것이다.
//@ts-ignore
session.id = user.id;

// 세션 저장
await session.save();

코드 실행 결과 예시

  • 세션용 쿠키가 생성된 것을 볼 수 있다.

picture 0

보안과 관련해 생각해볼만한 점

  • 아이언 세션의 쿠키가 해커에게 노출되면 어떻게 해야 할까?
    • 해커는 쿠키를 저장해두었다가 계속 악용할지도 모르는 일이다.

조치 1: 아이피와 에이전트를 함께 암호화한다.

  • 이용자가 접근한 아이피와 에이전트를 함께 암호화하여 쿠키에 저장해둔다.
  • 해당 쿠키로 인증을 요청하면, 요청한 아이피와 에이전트를 함께 확인하여 해당 사용자가 맞는지 확인한다.
  • 만일, 다른 브라우저로 들어왔거나, 다른 아이피로 해당 쿠키를 이용한다면 새로 인증을 받아야 한다.

조치 2: 키 로테이션을 수행한다.

  • 1시간 마다 시크릿 키를 바꿔준다.
  • 시크릿 키를 사용한지 30분쯤에 새로운 시크릿 키를 발급한다.
  • 30분간 이전 시크릿 키와 새 시크릿 키 두벌을 사용한다.
  • 30분의 시간동안 이전 시크릿 키를 사용하여 접근한 사용자에게 새 시크릿 키를 이용한 암호화 쿠키를 새로 발급해준다.
  • 30분이 지나 새로운 시크릿 키가 발급되면, 이전 시크릿 키를 이용해 만든 암호화 키를 사용하는 사용자는 더이상 해당 시크릿 키를 사용할 수 없게 된다.
저작자표시 비영리 (새창열림)

'자바스크립트 > 라이브러리' 카테고리의 다른 글

자바스크립트의 Socket.io 라이브러리란? (웹소켓 통신 라이브러리)  (0) 2024.02.10
자바스크립트 라이브러리 Axios 란?  (0) 2022.10.19
Socket.io 소켓 IO 란?  (0) 2022.10.15
리덕스 툴킷 (Redux toolkit) 이란?  (0) 2022.10.13
리덕스 핵심 개념 10분만에 배우기  (0) 2022.10.10
    '자바스크립트/라이브러리' 카테고리의 다른 글
    • 자바스크립트의 Socket.io 라이브러리란? (웹소켓 통신 라이브러리)
    • 자바스크립트 라이브러리 Axios 란?
    • Socket.io 소켓 IO 란?
    • 리덕스 툴킷 (Redux toolkit) 이란?
    Jake Seo
    Jake Seo
    ✔ 댓글로 틀린 부분을 지적해주시면 기분 나빠하지 않고 수정합니다. ✔ 많은 퇴고를 거친 글이 좋은 글이 된다고 생각합니다. ✔ 간결하고 명료하게 사람들을 이해 시키는 것을 목표로 합니다.

    티스토리툴바