www.notion.so/1-6e6df6111f574afa87c11b359b21b6ed

 

네트워크 복습 1

OSI 7계층

www.notion.so

 

OSI 7계층

  • 물리 계층
  • 데이터 링크 계층
  • 네트워크 계층
  • 전송 계층
  • 세션 계층
  • 프레젠테이션 계층
  • 어플리케이션 계층

어플리케이션 계층

  • 최종 사용자에게 네트워크 서비스를 제공하는 계층

  • 이 서비스들은 클라이언트가 사용하고 있는 데이터로 작업하는 프로토콜이다.

  • 이 프로토콜중 하나는 HTTP 이며 크롬, 파이어폭스 익스플로러와 같은 웹브라우저들과 같이 사용된다.

  • 다른 예들의 어플리케이션도 이 어플리케이션 계층을 사용하는데

  • office , outlook , skype 등이 있다.

  • 사용자와 직접 상호작용하는 계층이며 표현계층과 데이터를 주고 받는다.

프레젠테이션 계층

  • 어플리케이션 계층에서 받은 데이터 포맷을 다른 데이터 포맷으로 세션 계층포맷으로 변경하는 계층.

  • 또는 세션 계층에서 받은 데이터 포맷을 어플리케이션 계층 데이터 포맷으로 변경

  • 다양한 타입의 표현양식을 공통의 형식으로 변환시키는것.

  • 암호화 복호화 압축같은 기능도 제공.

세션 계층

  • 응용 프로그램 간의 연결을 성립하게 하고 연결이 안정되게 유지 , 관리 하며 작업 완료후 연결을 종료시키는 계층

  • 네트워크 중단이 발생한 경우는 인증과 재연결뿐만 아니라 여러 유형의 연결을 지원한다.

  • 세션이 설정 된후 데이터는 전송계층으로 이동 되거나 전송계층에서 전달된다.

전송 계층

  • 네트워크 연결을 통한 데이터 전송을 책임진다.

  • 이 계층은 전송해야 할 데이터 양, 전송 속도, 이동 위치, 이런 종류의 것들을 조정한다.

  • 인터넷 애플리케이션에 대해 가장 널리 알려진 프로토콜 들로 이 서비스는 "전송 제어 프로토콜" 또는 TCP와 "사용자 데이터그램 프로토콜" 또는 UDP에 의해 제공될 수 있다. 다른 프로토콜은 오류 복구, 데이터 흐름 및 재전송을 포함한 추가적인 기능을 제공할 수 있다.

  • 전송 계층이 그것의 기능을 완성하면, 데이터는 네트워크 계층으로 또는 네트워크 계층으로부터 전달된다.

네트워크 계층

  • 이 계층의 대표적인 프로토콜로는 IP 가 있다.

  • 전송 계층에서 만들어진 패킷을 전달 받아 목적지 컴퓨터의 논리적인 주소를 네트워크 계층의 헤더에 추가하는 역할

  • 데이터가 이 계층에 도착한 후, 데이터의 각 프레임을 조사하여 데이터가 최종 목표에 도달했는지 결론을 내린다. 이 계층은 송신 전송 시 데이터를 정확한 목적지로 전송하고 수신 전송도 수신한다.

  • 또한 이 계층은 IP 주소의 논리적 주소와 물리적 주소 간의 매핑을 관리하는데, 이는 주소 결정 프로토콜 또는 ARP를 통해 이루어진다.

데이터 링크 계층

  • 데이터 링크 계층은 네트워크 위의 개체들 간 데이터를 전달하고, 물리 계층에서 발생할 수 있는 오류를 찾아내며 수정하는 데 필요한 기능적·절차적 수단을 제공한다

  • 계층을 두는 목적은 간단히 말해서 잡음이 없는 인접한 노드 간의 물리적인 회선을 망계층(3 Layer)이 사용할 수 있도록 전송에러가 없는 통신 채널로 변화 시키는 것이다.

  • 궁극적으로 데이터 링크 프로토콜들은 인접하여 접속된 기기 사이의 통신을 관리하고, 신뢰하고 낮은 전송로를 신뢰도가 높은 전송로로 전환시키는데 주로 사용된다.

  • 물리적 네트워크를 통해 링크를 설정한다. 이 계층이 물리적 계층으로부터 데이터를 수신하면 전송 오류를 확인한 다음 데이터 프레임으로 비트를 패키징한다.

  • 이때 오류를 발견하면 재전송 기능으로 다시 전송해준다.

  • 여기서부터 이 계층은 MAC 또는 LLC 계층의 물리적 주소 지정 방법을 관리한다. MAC 계층의 예는 이더넷뿐만 아니라 802.11 무선 사양을 포함한다.

물리계층

  • 단말기기와 전송매체 사이의 인터페이스를 정의하고 데이터링크 계층 엔티티 간의 비트 전송을 위한 기계적, 전기적, 기능적, 절차적인 수단을 제공하는 계층을 말한다.
  • 디지털 데이터 비트를 소스 또는 송신 장치로부터 전송한다. 물리 계층, 전기, 기계 또는 라디오가 될 수 있는 네트워크 통신 매체를 통해 수신 또는 대상 장치로 전송한다.
  • 장비로는 허브, 리피터, 케이블 등이 있다.

 

 

참조

 

https://leejoongwon.tistory.com/31

https://winyong.tistory.com/37

https://m.blog.naver.com/PostView.nhn?blogId=yosi3world&logNo=50077248595

https://realpars.com/osi/

'개발 > etc' 카테고리의 다른 글

OAUTH - 1  (0) 2020.08.21
JUnit5 에서 parameter 사용하기  (0) 2020.07.21
Lombok  (0) 2020.07.19
어플리케이션 아키텍처와 객체지향 영상 후기  (0) 2020.06.28
blob  (0) 2020.04.30

좀더 깔끔한 링크

www.notion.so/Spring-Security-2-288be82555e24f5d91fbae4c672f53f2

 

Spring Security - 2

UsernamePasswordAuthenticationFilter와 SecurityContextPersistenceFilter 가

www.notion.so

 

 

UsernamePasswordAuthenticationFilter와 SecurityContextPersistenceFilter 가

인증한 authentication 객체를 SecurityContextHolder에 넣어줌.

UsernamePasswordAuthenticationFilter

  • 폼 인증을 처리하는 필터

  • 처리 한 후 상위 클래스인 abstractauthenticationProcessingFilter에서

    인증한 authentication 객체를 SecurityContextHolder에 넣어줌.

SecurityContextPersistenceFilter

  • 세션에 authentication 객체가 있는지 확인
  • authentication 객체가 존재하면 세션에 저장
  • 세션에 저장한 객체를 요청이 발생하면 세션에서 가져와서 사용

 

 


 

Spring SecurityFilter

FilterChainProxy

  • url 패턴이 체인에 들어있는 패턴과 일치하는 체인의 목록을 가져옴
  • 목록들은 SecurityConfig에서 설정하는거에 따라 filter의 갯수가 달라짐
  • SecurityConfig는 하나의 filterChain으로 여러개의 SecurityConfig의 사용이 가능하며
  • url패턴이 동일할 경우는 각각 order로 순서를 지정해줘야 한다.
  • 웬만하면 url패턴을 다르게 하는것이 좋음.
  • 보통 SpringSeucirtyFilterChain 라는 이름의 빈으로 등록된다.

DelegatingFilterProxy

  • Spring Ioc Container에 들어있는 bean에게 자신이 할일을 위임하는 필터
  • 보통 FilterChainProxy에 위임함.
  • 위임할때 bean의 이름으로 지정해서 위임함

AccessDecisionManager 인가(Authorize) 시작

  • 이미 인증을 거친 사용자가 특정한 리소스에 접근을 할때 허용 할것인가

  • 유효한 요청인가 를 결정하는 인터페이스

  • 인가(Authorize)를 할때 사용하는 인터페이스

  • AccessDecisionVoter가 목록으로 존재함.

  • 목록들을 거치면서 유효한지 확인. 전략에 맞지 않으면 익셉션 발생.

  • 구현체로 AffirmativeBased를 사용하면 하나라도 허용하면 허용 ( 기본으로 사용되는 전략 )

  • ConsensusBased 다수결로 결정

  • UnaimousBased 만장일치

  • 3개의 구현체가 존재함

  • 보통 AffirmativeBased를 사용

AccessDecisionManager 또는 AccessDecisionVoter 를 Custom

  • ROLE의 계층을 설정하고 싶다면 SecurityConfig에서 ExpressionHandler을 수정하면 된다.
public SecurityExpressionHandler expressionHandler() {
	RoleHierarchyImpl role = new RoleHierarchyImpl();
	role.setHierarchy("ROLE_ADMIN > ROLE_USER");

	DefaultWebSecurityExpressionHandler handler = new DefaultWebSecurityExpressionHandler();
	handler.setRoleHierarchy(role);

	return handler;

}

FilterSecurityInterceptor

  • 인증을 다 거친 후 AccessDecisionManager를 이용하여 Access Control 또는 예외 처리를 하는 필터
  • 대부분의 경우 FilterChainProxy에 제일 마지막 필터로 들어있다.

ExceptionTranslationFilter

  • 필터 체인에서 발생하는 ACcessDeniedException 과 AuthenticationException을 처리하는 필터

  • AuthenticationException 발생 시

    • AUthenticationEntryPoint 발생 ( 인증 재시도)

    • AbstractSecurityInterceptor 하위 클래스 ( FilterSecurityInterceptor 같은 ) 에서 발생하는 예외만 처리

    • UsernamePasswordAuthenticationFilter에서 발생하는 인증 에러는

      UsernamePasswordAuthenticationFilter 내부에서 처리함.

  • AccessDeniedException 발생 시

    • 익명 사용자 라면 AuthenticationEntryPoint 실행 ( 인증 하도록 로그인 페이지를 보여줌 )
    • 익명 사용자가 아니라면 AccessDeniedHandler에게 위임

 

전체 로직

 

DeligatingFIlterProxy가 ioc에 등록된 FilterChainProxy의 bean의 이름을 지정하여

위임하면 FilterChainProxy에서 WebSecurity HttpSecurity에서 설정된 Filter 목록들을 가져와서

실행시킴

Filter 들이 인증 관련으로 사용되는 객체는 AuthenticationManager 이며

구현체로는 ProviderManager가 있으며 ProviderManager는 여러 Provider를 사용하여

인증을 처리한다.

여러 Provider 중에서 DaoAuthenticationProvider가 존재하며

이 provider는 UserDetailsService라는 Dao Interface 를 사용해서 데이터에서 읽어온 유저정보로

사용자가 입력한 정보가 일치하는지 확인한다.

인증이 성공되면 SecurityContextHolder에 인증 정보를 집어 넣는다.

그 후 FilterChainProxy에서 가져온 filter 목록에는 항상 마지막에는 FilterSecurityInterceptor이 있는데 이 interceptor에서 AccessDecisionManager를 통해서 인가를 처리 한다.

AccessDecisionManager에서는 SecurityContextHolder에 저장된 인증정보에서 role을 확인하여

사용자가 접근할 리소스에 접근할수있는 role을 가지고 있는지 확인 한다.

확인하는 방법은 3가지가 있으며 그 중 기본전략으로 AffirmativeBased가 사용된다.

이 전략은 AccessDecisionVoter 중 하나라도 허용되면 허용하는 전략.

AffirmativeBased가 사용하는 Voter중 WebExpressionVoter가 존재 하는데

이 Voter는 SecurityExpressionHandler을 이용해서 Expression을 처리 한다.

이 Expression에서 계층형 권한을 커스텀 할수 있다.

'개발 > SpringSecurity' 카테고리의 다른 글

Spring Security - 1  (0) 2020.07.27

1. 클래스 로더 시스템

  • 컴파일 되어있는 클래스 파일 같은것들을 읽어서 메모리에 적절하게 배치시킴
  • 로딩 , 링크 , 초기화 순으로 진행된다.

A. 로딩

  • 3가지 종류가 계층형으로 존재함.

  • (최상위 계층) Bootstrap 클래스로더 , 네이티브로 구현됨

  • 플랫폼 클래스로더

  • 애플리케이션 클래스로더

  • 애플리케이션 클래스로더에서 class 파일을 읽으라는 요청을 받을시 최상위부터 읽을 수 있는지 체크하고

  • 읽을 수 있으면 작동 모두 못읽으면 ClassNotFoundException 에러남.

  • 클래스 로더가 .class 파일을 읽고 그 내용에 따라 적절한 바이너리 데이터를 만들고

  • 메소드 영역에 저장

  • 메소드 영역에 저장하는 데이터는

  • FQCN ( 패키지 경로까지 포함한 클래스 이름)

  • 클래스 , 인터페이스 , ENUM

  • 메소드 , 변수

  • 로딩이 끝나면 해당 클래스 타입의 Class 객체를 생성하여 힙 영역에 저장.

B. 링크

  • 레퍼런스를 연결

  • 링크는 3가지로 나뉨 Verify , Perpare , Resolve (optional)

  • Verfiy 는 .class파일의 형식이 유효한지 체크한다.

  • Perpare 는 클래스 변수 (static 변수) 와 기본값에 필요한 메모리를 준비해두는 과정

  • Resolve 는 심볼릭 메모리 레퍼런스를 메소드 영역에 있는 실제 레퍼런스로 교체한다.

C. 초기화

  • Class의 Static 한 값들을 초기화 시킴
  • B.링크에서 Prepare 단계에서 준비시켜둔 메모리에 Class의 Static 변수 와 블럭을 할당함

2. 메모리

  • 스택 , PC , 네이티브 메소드 스택 , 힙 , 메소드 영역으로 나뉘어져 있음

A. 스택

  • 각 쓰레드 마다 런타임 스택을 만들고 그 안에 메소드 호출을 스택 프레임(메소드 콜)이라 부르는 블럭으로 쌓는다.

  • 에러 메세지에 콜 스택들을 보면 메세지 호출 스택을 볼수 있다.

  • 쓰레드 종료시 런타임 스택도 사라진다.

B. Program Counter Registers

  • 스택에서 각 쓰레드마다 런타임 스택을 만들고 메소드 호출을 스택 프레임에 쌓을때
  • 쓰레드에서 현재 실행할 스택 프레임을 가리키는 포인터가 생성된다.

C. 네이티브 메소드 스택

  • 쓰레드 마다 생성

  • 네이티브 메소드를 호출 할 때 네이티브 메소드의 매개변수 지역변수 등을 저장

  • 네이티브 메소드 라이브러리를 사용하려면 네이티브 메소드 인터페이스를 통해야 함

  • JNI를 사용하는 스택은 네이티브 메소드 스택에 저장됨

  • JNI는 java native interface 로 native 키워드가 붙어있으며

  • java로 구현된게 아닌 C나 C++로 구현된것.

D. 힙

  • 객체(인스턴스들)를 저장하고 공유하는 영역
  • Young Generation , Old Generation , Permanent Generation 이 존재

E. 메소드 영역

  • 클래스 수준의 정보 ( 클래스 의 이름 , 부모 클래스의 이름 , 메소드 , 변수 ) 가 저장되고 공유하는 영역

3. 실행 엔진

  • Byte 코드들을 한줄씩 읽어들여서 머신이 이해할수 있는 native 코드로 바꿔줌.
  • 머신이 이해하면서 실행함.
  • 한줄마다 byte code를 native code로 컴파일

A. 인터프리터

  • 바이트 코드를 한줄씩 읽어들임

B. Jit Compiler

  • Just In Time Compiler

  • 인터프리터가 읽어들이면서 반복 되는 코드를 발견하면

  • jit 컴파일러가 반복되는 코드를 모두 네이티브 코드로 바꿔둔다.

  • 그다음부터는 인터프리터는 네이티브 코드로 컴파일된 코드를 바로 사용한다.

  • 인터프리터 효율이 높아짐.

C. Garbage Collector

  • 더이상 참조되지 않는 객체를 모아서 정리한다.
  • Throughput collector 과 stop the world collect가 있다.
  • 우리는 서버 운영중 수많은 객체를 생성하고 response time이 중요하므로
  • 이런 경우는 stop the world 를 사용.

 

 

 

 

참고

Java 코드를 조작하는 다양한 방법 - 백기선

'개발 > java' 카테고리의 다른 글

공변 불변 반공변  (0) 2021.04.26
TDD 와 리팩토링  (0) 2020.09.07
enum 사용시 주의할점  (0) 2020.05.13
멤버변수의 초기화 시기와 순서  (0) 2020.04.15

Authentication

  • principal 과 grantAuthority를 authentication에 넣어서 관리함

1. principal

  • 인증을 거치고 난 후 인증된 사용자 정보

  • authentication은 securityContext로 한번 감싸고 감싼걸 다시

  • securityContextHolder로 감싼다.

  • form 인증시 authentication의 구현체 usernamepasswordAuthenticationToken이

  • authentication에 담긴다.

  • UserDetailsService를 구현한 클래스에서 UserDetails를

  • return하는 loadUserByUsername이란 메소드에서 return하는 객체의 type이 곧 principle

2. grantAuthority

  • SimpleGrantedAuthority 객체에 권한이 담겨져있음.

SecurityContext

  • authentication을 제공함.

SecurityContextHolder

  • securityContext를 제공하고 기볹벅으로 ThreadLocal을 사용한다.
  • ThreadLocal (한 thread 내에서 공유하는 저장소)
  • thread가 변경되면 제대로 된 authentication 정보를 참조할수 없다.

UserDetailsService

  • 유저정보를 UserDetails 타입으로 가져오는 DAO 인터페이스
  • 인증을 하는건 아님.
  • spring security한테 유저정보를 제공하는 역할
  • 실제로 인증을 하는 역할은 authenticationManager

AuthenticationManager

  • 실제 인증을 담당하는 역할
  • 구현체로 ProviderManager 를 기본으로 사용.

ProviderManager

  • ProviderManager에서 인증을 AuthenticationProvider를 구현한 구현체들한테 위임하는데
  • AuthenticationProvider를 구현한 구현체중 AnonyMousAuthenticationProvider로 검사하고
  • 없으면 parent ProviderManager 를 호출 DAOAuthenticationProvider로 검사한다.
  • 여러 절차를 거치고 retriveUser 메소드에서 loadUserByUsername 메소드를 호출한다.
  • loadUserByUsername은 사용자가 따로 UserDetailServer로 구현한 메소드가 있다면
  • 그걸 return하고 아니면 UserDetail 타입으로 return한다.

'개발 > SpringSecurity' 카테고리의 다른 글

Spring Security - 2  (0) 2020.08.10

노션 주소

www.notion.so/JUnit5-parameter-3c97b3d4318741bfb4eabb0f6c1f4eb7

 

pom.xml에 디펜던시 추가

<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-params --> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-params</artifactId> <version>5.6.2</version> <scope>test</scope> </dependency>

등록 후 메소드 위에 @Test 대신 @ParameterizedTest 등록

Parameter가 1개일 경우

@ValueSource(strings = {"", ""})

@ValueSource(ints= {"", ""})

@ValueSource(boolean= {"", ""})

각자 type에 맞게 적용

Parameter가 2개 이상일 경우

@MethodSource 사용

@MethodSource 사용시 따로 팩토리 메소드를 만들어줘야한다.

private static Stream<Arguments> domainFreeTest() { return Stream.of( Arguments.of(0 , 0 , true), Arguments.of(100 , 0 , false), Arguments.of(0 , 100 , false) ); }

팩토리 메소드와 테스트 메소드의 메소드 이름이 같을경우에

@MethodSource에 따로 팩토리 메소드 이름을 안적어줘도 된다.

하지만 다를 경우엔 @MethodSource에 팩토리 메소드 이름을 적어줘야한다.

Parameter로 Enum을 사용할 경우

  • Enum 전체 사용시

@ParameterizedTest @EnumSource(Month.class) // passing all 12 months void getValueForAMonth_IsAlwaysBetweenOneAndTwelve(Month month) { int monthNumber = month.getValue(); assertTrue(monthNumber >= 1 && monthNumber <= 12); }

  • 특정 enum의 값만 사용시

@ParameterizedTest @EnumSource( value = Month.class, names = {"APRIL", "JUNE", "SEPTEMBER", "NOVEMBER", "FEBRUARY"}, mode = EnumSource.Mode.EXCLUDE) void exceptFourMonths_OthersAre31DaysLong(Month month) { final boolean isALeapYear = false; assertEquals(31, month.length(isALeapYear)); }

  • enum에 조건을 줄 경우

@ParameterizedTest @EnumSource(value = Month.class, names = ".+BER", mode = EnumSource.Mode.MATCH_ANY) void fourMonths_AreEndingWithBer(Month month) { EnumSet<Month> months = EnumSet.of(Month.SEPTEMBER, Month.OCTOBER, Month.NOVEMBER, Month.DECEMBER); assertTrue(months.contains(month)); }

Paramter 에 주입할 소스를 csvfile로 사용할 경우

@ParameterizedTest @CsvFileSource(resources = "/data.csv", numLinesToSkip = 1) void toUpperCase_ShouldGenerateTheExpectedUppercaseValueCSVFile( String input, String expected) { String actualValue = input.toUpperCase(); assertEquals(expected, actualValue); }

  • csv파일 내용

input,expected test,TEST tEst,TEST Java,JAVA

  • 더 다양한 경우는 하단의 첨부한 출처에서 확인

Enum 부터 출처

'개발 > etc' 카테고리의 다른 글

OAUTH - 1  (0) 2020.08.21
네트워크 복습 1  (0) 2020.08.14
Lombok  (0) 2020.07.19
어플리케이션 아키텍처와 객체지향 영상 후기  (0) 2020.06.28
blob  (0) 2020.04.30

@EqualsAndHashCode 의 of를 사용하는 이유

상호 참조된 class가 필드로 등록되어 있을경우 중복으로 hashcode가 생성되어

stackoverflowerror가 발생하게 된다.

(무한 재귀로 hashcode가 생성됨)

lombok annotation을 custom 한 annotation을 만들어 줄이지 못하는 이유

lombok annotation은 meta annotation으로 작동하지 않기때문에 줄일수 없다.

spring이 제공하는 annotation들은 meta annotation으로 작동하기 때문에 가능함.

@Builder 사용시 @AllArgsConstructor이 필요한 이유

builder 사용시 객체를 생성할때 기본생성자가 모든 필드를 참조해야 만들수있는 생성자로 되어있는데 생성자의 접근제어가 default로 되어있어 외부에서 만들수가 없다. ( builder로 생성안할경우만)

그렇기때문에 AllargsConstructor와 noArgsConstructor을 추가해준다.

기본생성자와 모든 필드를 참조하는 생성자를 만들수 있게된다.

@Data 를 사용하지 않는 이유

@Data 사용시 equalsAndhashCode란 annotation이 포함되어 있는데 of를 사용하는 이유와 마찬가지로 상호참조로 인한 무한생성으로 stackoverflow error가 발생하고

마찬가지로 toString annotation에서도 위와 같은 이유로 stackoverflow error가 발생하게 된다.

'개발 > etc' 카테고리의 다른 글

OAUTH - 1  (0) 2020.08.21
네트워크 복습 1  (0) 2020.08.14
JUnit5 에서 parameter 사용하기  (0) 2020.07.21
어플리케이션 아키텍처와 객체지향 영상 후기  (0) 2020.06.28
blob  (0) 2020.04.30

REST API 란 ?

  • REpressentational State Transfer
  • 네트워크 상에서 클라이언트와 서버의 통신방식중 하나
  • 인터넷상의 시스템간의 상호 운용성을 제공하는 방법중 하나
  • Http Method 를 통해 Resource를 처리하기 위한 아키텍쳐
  • Resource의 Representation에 의한 상태 전달

REST API 의 특징

1. uniform interface

identification of resources

manipulation of resource through represenations

  • 표현을 통한 리소스 처리
  • 요청시 리소스 자체를 응답하는것이 아닌 리소스의 표현 ( JSON, XML , HTML ) 방식 으로 응답하는것.
  • 클라이언트는 요청시 리소스의 표현방식을 요청할수 있다.

self-descrive messages

  • 스스로 메세지에 대한 설명이 가능해야 함.

  • 메세지가 변하더라도 클라이언트는 바뀐 메세지를 보고 해석이 가능해야함.

  • 헤더에 profile이란 타입으로 문서의 링크만을 걸어도 self descrive 해짐

  • 하지만 헤더는 여러 브라우저에서 지원을 안함

  • 그래서 hal (Hypertext Application Language) 이란 방식으로 응답 본문에 profile 을 넣어줌.

  • content-type 의 head는 iana에 등록되어 있다.

  • iana에 등록되어 있는 스펙에 따라 해석이 가능해짐.

hateoas

  • 링크정보를 동적으로 바꿀 수 있다.

  • 서버가 링크정보를 바꾸더라도 클라이언트가 그 링크의 의미를 파악을 해서

    이동을 한다면 실제 URI가 변하더라도 상관이 없음.
  • 클라이언트는 그 링크 정보만을 보고 다음상태로 전이할수 있어야함.

  • 다음 상태로 전이 할수 있는 링크가 존재하면 됨.


2. Client - Server

  • client - server 구조로 이루어여 한다.

  • server와 client의 역할이 명확하게 구분되어져 있으므로 개발하기 편하고

    서로간의 의존성도 줄어듬

3. Stateless

  • 무상태성

  • 작업을위한 상태정보를 별도로 저장하거나 관리하지 않는다.

  • 세션정보나 쿠키를 저장하지 않기때문에 서버의 역할이 줄어들고 구현이 더욱 단순해짐.


4. Cacheable

  • 캐시 가능

  • 다른 상황에 영향을 받지 않고 독립적이므로 캐싱이 가능해진다.

  • 네트워크를 사용하는 비용이 줄어든다.


5. Layered System

  • 계층 구조 시스템
  • 클라이언트 입장에서는 호출만 하기 때문에 서버가 계층으로 되어있는지 알수가 없다.
  • 서버는 사용자 인증, 암호화 , 로드밸런싱 등 의 계층을 추가할수 있고
  • msa의 api gateway 또는 proxy를 이용한 구현이 가능해짐.

6. Code on Demand (Optional)

  • 서버에서 코드를 클라이언트로 보내서 실행할수 있어야한다.
  • 대표적으로 html에서의 javascript
  • 하지만 서버에서 제공되는 코드를 실행하기 때문에 보안문제를 야기시킨다.

 

 

api gateway 설명

https://bcho.tistory.com/1005

동일한 객체의 httpclient를 사용할때

inputstream 을 close 안시키고 새로운 inputstream을 생성하려고하면 나는 에러.

 

list에 inputstream을 담아서 sequenceinputstream으로 list에서 뽑아서 사용하려고 했으나 이런 에러가남

 

 

해결방법

 

그냥 intpustream을 byte array로 변경시켜서 list에 담고

FileOutputStream output = FileUtils.openOutputStream(new FIle(xxxxxxxxx)); 로 outputstream 생성후

list foreach로 돌면서 write로 직접 byte array를 집어넣어줌.

output.close()로 stream 닫아주고

IOUtils.closeQuietly(output); closeable로 형변환해서 닫아준다.

 

 

 

 

+ Recent posts