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
  • 전체
    오늘
    어제
    • 분류 전체보기 N
      • 이론공부
        • 개념
        • 정보처리기사 필기
        • 정보처리기사 실기 기출
        • 네트워크관리사 2급
        • SQLD
      • 시스템설계
      • Java & Spring N
        • TIL
        • 트러블슈팅
        • 고도화
        • 알고리즘
        • 코딩테스트
        • Java N
        • Spring
        • Thymeleaf
      • 프로젝트
        • coin-trading
        • 트러블슈팅
      • Docker
      • 웹
      • git & github
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

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

티스토리툴바