29일차 - Spring강의(인증과 인가)

2024. 8. 23. 11:07·Java & Spring/Spring

□ 인증과 인과

  • 인증(Authenication)
    • 해당 유저가 실제 유저인지 인증하는 개념
    • 지문인식, 로그인 등
  • 인가(Authorization)
    • 해당 유저가 특정 리소스에 접근이 가능한지 허가를 확인하는 개념
    • 관리자 페이지, 관리자 권한 등
  • 서버와 클라이언트는 http라는 프로토콜을 이용하여 통신하는데 그 통신은 비연결성(Connectionless) 무상태(Stateless)로
    이루어진다.
  • 비연결성(Connectionless) : 서버와 클라이언트가 연결되어 있지 않다는 것, 이유는 리소스 절약을 위해서
  • 무상태(Stateless) : 서버가 클라이언트의 상태를 저장하지 않는다는 것

□ 인증의 방식

  • 쿠키-세션 방식
    1. 쿠키 : 클라이언트에 저장될 목저으로 생성한 정보를 담은 파일
    2. 세션
      • 서버에서 일정시간동안 클라이언트 상태를 유지하기 위해 사용
      • 서버에서 클라이언트별로 세션ID를 부여한 후 클라이언트 별 필요한 정보를 서버에 저장
      • 서버에서 생성한 세션ID는 클라이언트의 쿠키값으로 저장되어 클라이언트 식별에 사용  
  • JWT 기반 인증
  쿠키 세션
설명 클라이언트에 저장될 목적으로 생성한 작은 정보를 담은 파일 서버에서 일정시간 동안 클라이언트 상태를 유지하기 위해 사용
저장위치 클라이언트(웹 브라우져) 웹 서버
사용 예 사이트 팝업의"오늘 다시보지 않기"정보 저장 로그인 정보 저장
만료 시점 쿠키 저장 시 만료일시 설정 가능 다음 조건 중 하나가 만족될 경우
1. 브라우저 종료
2. 클라이언트 로그아웃
3. 서버에 설정한 유지기간까지 재요청이 없는경우
용량 제한 브라우저별로 다름(크롬 기준)
- 하나의 도메인 당 180개
- 하나의 쿠키 당 4KB
개수 제한 없음
보안 취약 비교적 ㅇ

 

□ 쿠키 다루기

- 쿠키 생성

public static void addCookie(String cookieValue, HttpServletResponse res) {
    try {
        cookieValue = URLEncoder.encode(cookieValue, "utf-8").replaceAll("\\+", "%20"); // Cookie Value 에는 공백이 불가능해서 encoding 진행

        Cookie cookie = new Cookie(AUTHORIZATION_HEADER, cookieValue); // Name-Value
        cookie.setPath("/");
        cookie.setMaxAge(30 * 60);

        // Response 객체에 Cookie 추가
        res.addCookie(cookie);
    } catch (UnsupportedEncodingException e) {
        throw new RuntimeException(e.getMessage());
    }
}

※ 공백이 있으면 쿠키 생성을 할 수가 없으나 URLEncoder를 통해 변환시켜 저장할 수 있다.

  1. URLEncoder.encode()메서드 사용
  2. URLEncoder.encode(value, 인코딩타입).replaceAll("\\+","%20"); 공백을 대체
  3. name-value형태로 cookie생성
  4. cookie.setPath()를 통해 경로 이하의 요청에만 쿠키가 전송
  5. cookie.setMaxAge()를 통해 만료기간 성정
  6. res.addCookie()를 통해 Response객체에 Cookie추가

- 쿠키 읽기

 

□ 세션 다루기

※ Servlet에서는 유일무이한 세션ID를 간편하게 만슬 수 있는 HttpSession을 제공한다.

 

- 세션 생성

@GetMapping("/create-session")
public String createSession(HttpServletRequest req) {
    // 세션이 존재할 경우 세션 반환, 없을 경우 새로운 세션을 생성한 후 반환
    HttpSession session = req.getSession(true);

    // 세션에 저장될 정보 Name - Value 를 추가합니다.
    session.setAttribute(AUTHORIZATION_HEADER, "Robbie Auth");

    return "createSession";
}

 

-세션 읽기

@GetMapping("/get-session")
public String getSession(HttpServletRequest req) {
    // 세션이 존재할 경우 세션 반환, 없을 경우 null 반환
    HttpSession session = req.getSession(false);

    String value = (String) session.getAttribute(AUTHORIZATION_HEADER); // 가져온 세션에 저장된 Value 를 Name 을 사용하여 가져옵니다.
    System.out.println("value = " + value);

    return "getSession : " + value;
}

 

 

 

 

@GetMapping("/get-cookie")
public String getCookie(@CookieValue(AUTHORIZATION_HEADER) String value) {
    System.out.println("value = " + value);

    return "getCookie : " + value;
}

 

 

'Java & Spring > Spring' 카테고리의 다른 글

37일차 - Spring강의(JPA Audting)  (0) 2024.09.04
31일차 - Spring강의(Entity 연관 관계)  (0) 2024.08.27
28일차 - Spring강의(Bean 수동 등록, Type중복 시 Bean 주입)  (0) 2024.08.22
26일차 - Spring강의(Entity, 영속성 컨텍스트)  (0) 2024.08.20
25일차 - Spring강의(IoC와 DI)  (0) 2024.08.19
'Java & Spring/Spring' 카테고리의 다른 글
  • 37일차 - Spring강의(JPA Audting)
  • 31일차 - Spring강의(Entity 연관 관계)
  • 28일차 - Spring강의(Bean 수동 등록, Type중복 시 Bean 주입)
  • 26일차 - Spring강의(Entity, 영속성 컨텍스트)
DJ.Kang
DJ.Kang
백엔드 개발 기록 블로그
  • DJ.Kang
    DJ Hello World
    DJ.Kang
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 이론공부
        • 정보처리기사
      • 시스템설계
      • Java & Spring
        • TIL
        • 트러블슈팅
        • 고도화
        • 알고리즘
        • 코딩테스트
        • Java
        • Spring
        • Thymeleaf
      • 프로젝트
        • coin-trading
        • 트러블슈팅
      • Docker
      • DB
      • AWS
      • CI-CD
      • 웹
      • git & github
      • 구인공고분석
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    java 멤버
    java 유클리드 호제법
    java 메서드
    Java this
    java enhance switch
    java super
    java
    프로그래머스 java 기초 트레이닝
    자료구조
    개발로드맵
    java 세수의합
    java 에라토스테네스의 체
    데이터 크기
    Java 생성자
    java arrays.copyofrnage()
    프로그래머스 java 기초트레이닝
    java two-pointer
    데이터 타입
    java 제어자
    java기초
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
DJ.Kang
29일차 - Spring강의(인증과 인가)
상단으로

티스토리툴바