<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>helloworld</title>
    <link>https://java-woo.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sun, 6 Sep 2026 12:41:47 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>hellojava</managingEditor>
    <item>
      <title>에러 해결하기 ..</title>
      <link>https://java-woo.tistory.com/42</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;ExceptionHandlerExceptionResolver&amp;nbsp;:&amp;nbsp;Resolved&amp;nbsp;[org.springframework.dao.InvalidDataAccessApiUsageException:&amp;nbsp;org.hibernate.TransientPropertyValueException:&amp;nbsp;object&amp;nbsp;references&amp;nbsp;an&amp;nbsp;unsaved&amp;nbsp;transient&amp;nbsp;instance&amp;nbsp;-&amp;nbsp;save&amp;nbsp;the&amp;nbsp;transient&amp;nbsp;instance&amp;nbsp;before&amp;nbsp;flushing&amp;nbsp;:&amp;nbsp;co&lt;a href=&quot;http://m.toy.project.file.domain.FileEntity.product&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;http://m.toy.project.file.domain.FileEntity.product&lt;/a&gt;&amp;nbsp;-&amp;gt;&amp;nbsp;co&lt;a href=&quot;http://m.toy.project.product.domain.Product;&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;http://m.toy.project.product.domain.Product;&lt;/a&gt;&amp;nbsp;nested&amp;nbsp;exception&amp;nbsp;is&amp;nbsp;java.lang.IllegalStateException:&amp;nbsp;org.hibernate.TransientPropertyValueException:&amp;nbsp;object&amp;nbsp;references&amp;nbsp;an&amp;nbsp;unsaved&amp;nbsp;transient&amp;nbsp;instance&amp;nbsp;-&amp;nbsp;save&amp;nbsp;the&amp;nbsp;transient&amp;nbsp;instance&amp;nbsp;before&amp;nbsp;flushing&amp;nbsp;:&amp;nbsp;co&lt;a href=&quot;http://m.toy.project.file.domain.FileEntity.product&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;http://m.toy.project.file.domain.FileEntity.product&lt;/a&gt;&amp;nbsp;-&amp;gt;&amp;nbsp;co&lt;a href=&quot;http://m.toy.project.product.domain.Product]&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;http://m.toy.project.product.domain.Product]&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;file 테이블과 product 테이블을 만드는 과정에서 생긴 에러다. 아마도 fk맺다가 생긴 에러인 것 같은데 굉장히 많은 삽질이 필요 할 것 같다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Entity&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Getter&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@NoArgsConstructor&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@AllArgsConstructor&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Builder&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Table&lt;/span&gt;(name = &lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;file&quot;&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public class &lt;/span&gt;FileEntity {&lt;br /&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Id&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt; @GeneratedValue&lt;/span&gt;(strategy = GenerationType.&lt;span style=&quot;color: #9876aa;&quot;&gt;IDENTITY&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;private long &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@ManyToOne&lt;/span&gt;(fetch = FetchType.&lt;span style=&quot;color: #9876aa;&quot;&gt;LAZY&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@JoinColumn&lt;/span&gt;(name = &lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;prod_id&quot;&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;private &lt;/span&gt;Product &lt;span style=&quot;color: #9876aa;&quot;&gt;product&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Column&lt;/span&gt;(name = &lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;originalName&quot;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;nullable = &lt;span style=&quot;color: #cc7832;&quot;&gt;false&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;private &lt;/span&gt;String &lt;span style=&quot;color: #9876aa;&quot;&gt;originalName&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Column&lt;/span&gt;(name = &lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;size&quot;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;nullable = &lt;span style=&quot;color: #cc7832;&quot;&gt;false&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;private long &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;size&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Column&lt;/span&gt;(name = &lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;createDate&quot;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;nullable = &lt;span style=&quot;color: #cc7832;&quot;&gt;false&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;private &lt;/span&gt;Date &lt;span style=&quot;color: #9876aa;&quot;&gt;createDate&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Column&lt;/span&gt;(name = &lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;nullable = &lt;span style=&quot;color: #cc7832;&quot;&gt;false&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@ColumnDefault&lt;/span&gt;(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;1&quot;&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;private int &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;status&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;}&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Getter&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@NoArgsConstructor&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@AllArgsConstructor&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Entity&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Builder&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public class &lt;/span&gt;Product {&lt;br /&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Id&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt; @GeneratedValue&lt;/span&gt;(strategy = GenerationType.&lt;span style=&quot;color: #9876aa;&quot;&gt;IDENTITY&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;private long &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;prod_id&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;//PK&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@ManyToOne&lt;/span&gt;(fetch = FetchType.&lt;span style=&quot;color: #9876aa;&quot;&gt;LAZY&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@JoinColumn&lt;/span&gt;(name = &lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;member_num&quot;&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;private &lt;/span&gt;Member &lt;span style=&quot;color: #9876aa;&quot;&gt;member&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;//fk&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Column&lt;/span&gt;(name = &lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;prod_name&quot;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;nullable = &lt;span style=&quot;color: #cc7832;&quot;&gt;false&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;private &lt;/span&gt;String &lt;span style=&quot;color: #9876aa;&quot;&gt;prod_name&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;상품명&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Column&lt;/span&gt;(name = &lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;kind_num&quot;&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;private int &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;kind_num&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;카테고리 번호&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Column&lt;/span&gt;(name = &lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;grade&quot;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;nullable = &lt;span style=&quot;color: #cc7832;&quot;&gt;false&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@ColumnDefault&lt;/span&gt;(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;0.0&quot;&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;private double &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;grade&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;평점&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Column&lt;/span&gt;(name = &lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;views&quot;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;nullable = &lt;span style=&quot;color: #cc7832;&quot;&gt;false&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@ColumnDefault&lt;/span&gt;(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;0&quot;&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;private long &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;views&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;조회수&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Column&lt;/span&gt;(name = &lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;cost&quot;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;nullable = &lt;span style=&quot;color: #cc7832;&quot;&gt;false&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;private int &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;cost&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;원가&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Column&lt;/span&gt;(name = &lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;price&quot;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;nullable = &lt;span style=&quot;color: #cc7832;&quot;&gt;false&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;private int &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;price&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;판매가&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Column&lt;/span&gt;(name = &lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;profit&quot;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;nullable = &lt;span style=&quot;color: #cc7832;&quot;&gt;false&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;private int &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;profit&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;순수익&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Column&lt;/span&gt;(name = &lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;description&quot;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;nullable = &lt;span style=&quot;color: #cc7832;&quot;&gt;false&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;private &lt;/span&gt;String &lt;span style=&quot;color: #9876aa;&quot;&gt;description&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;판매내용&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Temporal&lt;/span&gt;(TemporalType.&lt;span style=&quot;color: #9876aa;&quot;&gt;TIMESTAMP&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Column&lt;/span&gt;(name = &lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;reg_date&quot;&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;private &lt;/span&gt;Date &lt;span style=&quot;color: #9876aa;&quot;&gt;reg_date &lt;/span&gt;= &lt;span style=&quot;color: #cc7832;&quot;&gt;new &lt;/span&gt;Date()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Column&lt;/span&gt;(name = &lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;nullable = &lt;span style=&quot;color: #cc7832;&quot;&gt;false&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@ColumnDefault&lt;/span&gt;(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;1&quot;&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;private int &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;status &lt;/span&gt;= &lt;span style=&quot;color: #6897bb;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;품절&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; or &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;상품 내릴시&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; 0&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@OneToMany&lt;/span&gt;(mappedBy = &lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;product&quot;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;,&lt;/span&gt;cascade = CascadeType.&lt;span style=&quot;color: #9876aa;&quot;&gt;ALL&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;private &lt;/span&gt;List&amp;lt;FileEntity&amp;gt; &lt;span style=&quot;color: #9876aa;&quot;&gt;files&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;}&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;one to many에서 실수 한거 같아보이진 않는데&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 product는 게시글이고 (지금보니 이름을 바꿔야 할 것 같긴하다.. 애완동물용품웹을 만들고있는데 상품을 올린다고 생각하여 product라 지었는데 이렇게 쓰다보니 괜찮은 것 같기도..)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;file은 게시글을 쓸 때 같이 올라갈 사진인데&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게시글 : 사진 --&amp;gt; 1 : n&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 맞지않나.. 1개의 게시글이 있으면 여러개 혹은 한개의 사진이 있고 게시글이 없으면 사진도 존재하지 않는다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;열심히 삽질 해보자 ,,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생각보다 빨리 해결됐다. 무한 구글링 중에 영속성을 각각 따로 설정해주라는 말과 함께 대부분 cacade가 되어있을텐데 그걸 없애면 될 것이라고 한다.. 해봤더니 성공! 로컬pc에 사진 올리는 테스트 중이었는데&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yLiAa/btszGK2iSPc/zI0E3XqMkzuc4IstWdtK0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yLiAa/btszGK2iSPc/zI0E3XqMkzuc4IstWdtK0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yLiAa/btszGK2iSPc/zI0E3XqMkzuc4IstWdtK0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyLiAa%2FbtszGK2iSPc%2FzI0E3XqMkzuc4IstWdtK0K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;771&quot; height=&quot;434&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;50개나 저장 되어버린 사진 ㅠ 아무튼 되서 다행이긴한데&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/laQm5/btszGMTlIQP/gn3z3yhjYpIwv0tptY1pJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/laQm5/btszGMTlIQP/gn3z3yhjYpIwv0tptY1pJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/laQm5/btszGMTlIQP/gn3z3yhjYpIwv0tptY1pJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlaQm5%2FbtszGMTlIQP%2Fgn3z3yhjYpIwv0tptY1pJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1080&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버를 실행하면 이런 게 엄청 많이 나온다,,&amp;nbsp; 예상에는&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;jpa&lt;/span&gt;:&lt;br /&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;show-sql&lt;/span&gt;: &lt;span style=&quot;color: #cc7832;&quot;&gt;true&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; defer-datasource-initialization&lt;/span&gt;: &lt;span style=&quot;color: #cc7832;&quot;&gt;true&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; hibernate&lt;/span&gt;:&lt;br /&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;ddl-auto&lt;/span&gt;: &lt;span style=&quot;color: #ffc66d;&quot;&gt;create&lt;/span&gt;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;create라 db 삭제했다 다시 만들텐데 fk가 안지워지는 느낌인 것 같긴한데 ,, 저것도 해결 해야겠지&lt;/p&gt;</description>
      <category>toyproject</category>
      <author>hellojava</author>
      <guid isPermaLink="true">https://java-woo.tistory.com/42</guid>
      <comments>https://java-woo.tistory.com/42#entry42comment</comments>
      <pubDate>Thu, 2 Nov 2023 14:12:52 +0900</pubDate>
    </item>
    <item>
      <title>jwt토큰 만들어서 응답해주기</title>
      <link>https://java-woo.tistory.com/41</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트를 생성 할 때 jwt라이브러리를 넣어줬었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;override한 successfulAuthentication 메서드에서 가지고 있는 파라미터인 Authentication 객체를&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PrincipalDetails 으로 다운캐스팅해 놓는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;String jwtToken = JWT.&lt;span&gt;create&lt;/span&gt;()&lt;br /&gt;.withSubject(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;cos&lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;토큰&lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;&lt;/span&gt;)&lt;span style=&quot;color: #808080;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;토큰이름&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; &lt;/span&gt;.withExpiresAt(&lt;span style=&quot;color: #cc7832;&quot;&gt;new &lt;/span&gt;Date(System.&lt;span&gt;currentTimeMillis&lt;/span&gt;()+(&lt;span style=&quot;color: #6897bb;&quot;&gt;60000&lt;/span&gt;*&lt;span style=&quot;color: #6897bb;&quot;&gt;10&lt;/span&gt;)))&lt;span style=&quot;color: #808080;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;토큰만료시간 현재시간&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;+10&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;분&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; 60&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;초&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;*10&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; &lt;/span&gt;.withClaim(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;,&lt;/span&gt;principalDetails.getUsers().getId())&lt;br /&gt;.withClaim(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;username&quot;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;,&lt;/span&gt;principalDetails.getUsers().getUsername())&lt;br /&gt;.sign(Algorithm.&lt;span&gt;HMAC512&lt;/span&gt;(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;cos&quot;&lt;/span&gt;))&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;사인&lt;/span&gt;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런식으로 토큰을 생성 해준 후&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;response.addHeader(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;Authorization&quot;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;Bearer &quot;&lt;/span&gt;+jwtToken)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;헤더에 달아 준다. 중요 Bearer뒤에는 무조건 공백을 넣어주라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 후 로그인을 해보면&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1388&quot; data-origin-height=&quot;878&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b02alE/btsyPUy5SV3/TGkIKsPCkxcMTJaQ3S9NsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b02alE/btsyPUy5SV3/TGkIKsPCkxcMTJaQ3S9NsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b02alE/btsyPUy5SV3/TGkIKsPCkxcMTJaQ3S9NsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb02alE%2FbtsyPUy5SV3%2FTGkIKsPCkxcMTJaQ3S9NsK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1388&quot; height=&quot;878&quot; data-origin-width=&quot;1388&quot; data-origin-height=&quot;878&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;짠 토큰이 생긴다. Bearer 뒤의 온 토큰을 복사하여 jwt.io에 넣어보면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1579&quot; data-origin-height=&quot;727&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhLcCI/btsyOGajm4E/5770xwzd4lk1sFcWmQ5CoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhLcCI/btsyOGajm4E/5770xwzd4lk1sFcWmQ5CoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhLcCI/btsyOGajm4E/5770xwzd4lk1sFcWmQ5CoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhLcCI%2FbtsyOGajm4E%2F5770xwzd4lk1sFcWmQ5CoK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1579&quot; height=&quot;727&quot; data-origin-width=&quot;1579&quot; data-origin-height=&quot;727&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;토큰 생성 완료..!&lt;/p&gt;</description>
      <category>jwt</category>
      <author>hellojava</author>
      <guid isPermaLink="true">https://java-woo.tistory.com/41</guid>
      <comments>https://java-woo.tistory.com/41#entry41comment</comments>
      <pubDate>Fri, 20 Oct 2023 13:53:14 +0900</pubDate>
    </item>
    <item>
      <title>jwt를 위한 강제 로그인</title>
      <link>https://java-woo.tistory.com/40</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;UsernamePasswordAuthenticationFilter 를 상속받은 JwtAuthenticationFilter 클래스에서 attemptAuthentication과 successfulAuthentication을 overried 하였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;attemptAuthentication 여기에서는 username과 password를 받아서 파싱을 한 후 UsernamePasswordAuthenticationToken 에 집어넣는다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 후에는 PrincipalDetailsService 의 loadUserByUsername()함수가 실행되고, 정상이면 (db에 있는 username과 password가 일치하면) authentication이 리턴된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 후 authentication을 PrincipalDetails에 다운캐스팅하여 넣고 로그에 찍어보면 로그인이 됐는지 확인 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;authentication 객체를 session 영역에 저장해야하고 그 방법이 return 해주는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리턴의 이유는 권한관리를 springsecurity가 대신 해주기때문에 편하게 하려고 하는것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;굳이 jwt토큰을 사용하면서 세션을 만들 이유는 없지만 권한처리를 위해 session영역에 넣어주는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Override&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public &lt;/span&gt;Authentication &lt;span style=&quot;color: #ffc66d;&quot;&gt;attemptAuthentication&lt;/span&gt;(HttpServletRequest request&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;HttpServletResponse response) &lt;span style=&quot;color: #cc7832;&quot;&gt;throws &lt;/span&gt;AuthenticationException {&lt;br /&gt;System.&lt;span style=&quot;color: #9876aa;&quot;&gt;out&lt;/span&gt;.println(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;JwtAuthenticationFilter : &lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;로그인 시도중&lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;//1. username, password &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;받아서&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;try &lt;/span&gt;{&lt;br /&gt;&lt;span style=&quot;color: #808080;&quot;&gt;// BufferedReader br = request.getReader();&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;// String input = null;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;// while((input = br.readLine()) != null)&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;// System.out.println(input);&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;// System.out.println(request.getInputStream().toString());&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; &lt;/span&gt;ObjectMapper om = &lt;span style=&quot;color: #cc7832;&quot;&gt;new &lt;/span&gt;ObjectMapper()&lt;span style=&quot;color: #cc7832;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;//json &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;데이터 파싱&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; &lt;/span&gt;Users users = om.readValue(request.getInputStream()&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;Users.&lt;span style=&quot;color: #cc7832;&quot;&gt;class&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; &lt;/span&gt;System.&lt;span style=&quot;color: #9876aa;&quot;&gt;out&lt;/span&gt;.println(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;users = &quot; &lt;/span&gt;+ users)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; &lt;/span&gt;UsernamePasswordAuthenticationToken authenticationToken =&lt;br /&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;new &lt;/span&gt;UsernamePasswordAuthenticationToken(users.getUsername()&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;users.getPassword())&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;//PrincipalDetailsService&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;의&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; loadUserByUsername() &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;함수가 실행된 후 정상이면&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; authentication&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;이 리턴됨&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;// db&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;에 있는&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; username &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;과&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; password &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;가 일치&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; &lt;/span&gt;Authentication authentication = &lt;span style=&quot;color: #9876aa;&quot;&gt;authenticationManager&lt;/span&gt;.authenticate(authenticationToken)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; &lt;/span&gt;PrincipalDetails principalDetails = (PrincipalDetails) authentication.getPrincipal()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; &lt;/span&gt;System.&lt;span style=&quot;color: #9876aa;&quot;&gt;out&lt;/span&gt;.println(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;principalDetails : &quot; &lt;/span&gt;+ principalDetails.getUsers().getUsername())&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;로그인 완료&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;// authentication &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;객체가&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; session &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;영역에 저장해야하고 그 방법이&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; return &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;해주면 됨&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;// &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;리턴의 이유는 권한 관리를&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; security&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;가 대신 해주기 때문에 편하려고 하는거임&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;.&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; // &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;굳이&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; jwt &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;토큰을 사용하면서 세션을 만들 이유는 없음&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;. &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;근데 단지 권한처리때매&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; session&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;을 넣어줌&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;return &lt;/span&gt;authentication&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; &lt;/span&gt;}&lt;br /&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;catch &lt;/span&gt;(IOException e) {&lt;br /&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;throw new &lt;/span&gt;RuntimeException(e)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;}&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;//로그창&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;users&amp;nbsp;=&amp;nbsp;Users(id=0,&amp;nbsp;username=ssar,&amp;nbsp;password=1234,&amp;nbsp;roles=null) &lt;br /&gt;PrincipalDetailsService의&amp;nbsp;loadUserByUsername() &lt;br /&gt;Hibernate:&amp;nbsp;select&amp;nbsp;users0_.id&amp;nbsp;as&amp;nbsp;id1_0_,&amp;nbsp;users0_.password&amp;nbsp;as&amp;nbsp;password2_0_,&amp;nbsp;users0_.roles&amp;nbsp;as&amp;nbsp;roles3_0_,&amp;nbsp;users0_.username&amp;nbsp;as&amp;nbsp;username4_0_&amp;nbsp;from&amp;nbsp;Users&amp;nbsp;users0_&amp;nbsp;where&amp;nbsp;users0_.username=? &lt;br /&gt;principalDetails&amp;nbsp;:&amp;nbsp;ssar&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;//&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아직 너무너무 어렵다 ㅠ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;successfulAuthentication는 위의 함수에서 인증이 정상적으로 되었으면 실행되는 함수이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;jwt토큰을 만들어서 request 요청한 사용자에게 jwt토큰을 response해주는 함수를 만들ㅇ ㅖ정이다.&lt;/p&gt;</description>
      <category>jwt</category>
      <author>hellojava</author>
      <guid isPermaLink="true">https://java-woo.tistory.com/40</guid>
      <comments>https://java-woo.tistory.com/40#entry40comment</comments>
      <pubDate>Fri, 20 Oct 2023 13:25:18 +0900</pubDate>
    </item>
    <item>
      <title>jwt 임시 토큰 만들어보기</title>
      <link>https://java-woo.tistory.com/39</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;우선 필터에 대한 이해가 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필터를 간단하게&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public class &lt;/span&gt;MyFilter1 &lt;span style=&quot;color: #cc7832;&quot;&gt;implements &lt;/span&gt;Filter {&lt;br /&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Override&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public void &lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;doFilter&lt;/span&gt;(ServletRequest request&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;ServletResponse response&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;FilterChain chain) &lt;span style=&quot;color: #cc7832;&quot;&gt;throws &lt;/span&gt;IOException&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;ServletException {&lt;br /&gt;System.&lt;span style=&quot;color: #9876aa;&quot;&gt;out&lt;/span&gt;.println(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;필터&lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;1&quot;&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; &lt;/span&gt;chain.doFilter(request&lt;span style=&quot;color: #cc7832;&quot;&gt;,&lt;/span&gt;response)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; &lt;/span&gt;}&lt;br /&gt;}&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 식으로 만든후&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;filterConfig이라는 파일을 생성한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Configuration&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public class &lt;/span&gt;FilterConfig {&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Bean&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public &lt;/span&gt;FilterRegistrationBean&amp;lt;MyFilter1&amp;gt; &lt;span style=&quot;color: #ffc66d;&quot;&gt;filter1&lt;/span&gt;() {&lt;br /&gt;FilterRegistrationBean&amp;lt;MyFilter1&amp;gt; bean = &lt;span style=&quot;color: #cc7832;&quot;&gt;new &lt;/span&gt;FilterRegistrationBean&amp;lt;&amp;gt;(&lt;span style=&quot;color: #cc7832;&quot;&gt;new &lt;/span&gt;MyFilter1())&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; &lt;/span&gt;bean.addUrlPatterns(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;/*&quot;&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; &lt;/span&gt;bean.setOrder(&lt;span style=&quot;color: #6897bb;&quot;&gt;0&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;낮은 번호가 필터중 가장 먼저 실행 됨&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;return &lt;/span&gt;bean&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; &lt;/span&gt;}&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필터가 많아질 경우에는 빈을 더 추가하여 setOrder 안에 파라미터로 그 순서를 조절 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;securityConfig 파일에&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;http.addFilterBefore(&lt;span style=&quot;color: #cc7832;&quot;&gt;new &lt;/span&gt;MyFilter3()&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;SecurityContextPersistenceFilter.&lt;span style=&quot;color: #cc7832;&quot;&gt;class&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;//filterConfig&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;보다 빨리 실행됨&lt;/span&gt;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런식으로 코드를 작성하면 filterConfig보다 빠르게 실행된다. 또한 springSecurity 보다 빨리 실행되게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 대충 컨트롤러에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@PostMapping&lt;/span&gt;(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;/token&quot;&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public &lt;/span&gt;String &lt;span style=&quot;color: #ffc66d;&quot;&gt;token&lt;/span&gt;() {&lt;br /&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;return &lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;&amp;lt;h1&amp;gt;home&amp;lt;/h1&amp;gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;}&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;post 메서드를 만든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Override&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public void &lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;doFilter&lt;/span&gt;(ServletRequest request&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;ServletResponse response&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;FilterChain chain) &lt;span style=&quot;color: #cc7832;&quot;&gt;throws &lt;/span&gt;IOException&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;ServletException {&lt;br /&gt;HttpServletRequest req = (HttpServletRequest) request&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; &lt;/span&gt;HttpServletResponse res = (HttpServletResponse) response&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;토큰&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; : cos &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;이걸 만들어줘야함&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;. id,pw &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;정상적으로 들어와서 로그인이 완료되면 토큰을 만들어주고 그걸 응답해준다&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;.&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; //&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;요청 할 때마다&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; header&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;에&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; Authorizaion&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;에&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; value &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;값으로 토큰을 가지고 온다&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;.&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; //&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;그때 토큰이 넘어오면 이 토큰이 내가 만든 토큰이 맞는지 검증만 하면 된다&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;. (RSA, HS256)&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;if &lt;/span&gt;(req.getMethod().equals(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;POST&quot;&lt;/span&gt;)) {&lt;br /&gt;System.&lt;span style=&quot;color: #9876aa;&quot;&gt;out&lt;/span&gt;.println(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;POST&lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;요청됨&lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; &lt;/span&gt;String headerAuth = req.getHeader(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;Authorization&quot;&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; &lt;/span&gt;System.&lt;span style=&quot;color: #9876aa;&quot;&gt;out&lt;/span&gt;.println(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;headerAuth = &quot; &lt;/span&gt;+ headerAuth)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; &lt;/span&gt;System.&lt;span style=&quot;color: #9876aa;&quot;&gt;out&lt;/span&gt;.println(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;필터&lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;3&quot;&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; if &lt;/span&gt;(headerAuth.equals(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;cos&quot;&lt;/span&gt;)) {&lt;br /&gt;chain.doFilter(req&lt;span style=&quot;color: #cc7832;&quot;&gt;,&lt;/span&gt;res)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; &lt;/span&gt;}&lt;span style=&quot;color: #cc7832;&quot;&gt;else&lt;/span&gt;{&lt;br /&gt;PrintWriter out = res.getWriter()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; &lt;/span&gt;out.println(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;인증안됨&lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; &lt;/span&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 정해둔 cos라는 토큰?을 만들고 포스트맨에 headers에 밸류값으로 cos가 들어오지 않으면 필터가 작동하지 않고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인증안됨. 이라는 문자만 나온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;702&quot; data-origin-height=&quot;657&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/raosP/btsyNpZXMeD/vmPHGzkNNQb7HB1CFOHfzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/raosP/btsyNpZXMeD/vmPHGzkNNQb7HB1CFOHfzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/raosP/btsyNpZXMeD/vmPHGzkNNQb7HB1CFOHfzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FraosP%2FbtsyNpZXMeD%2FvmPHGzkNNQb7HB1CFOHfzk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;378&quot; height=&quot;354&quot; data-origin-width=&quot;702&quot; data-origin-height=&quot;657&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;540&quot; data-origin-height=&quot;510&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rgEcI/btsyQeXrOCU/H5PSwClUncN8yNJ3xoIhdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rgEcI/btsyQeXrOCU/H5PSwClUncN8yNJ3xoIhdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rgEcI/btsyQeXrOCU/H5PSwClUncN8yNJ3xoIhdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrgEcI%2FbtsyQeXrOCU%2FH5PSwClUncN8yNJ3xoIhdk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;393&quot; height=&quot;371&quot; data-origin-width=&quot;540&quot; data-origin-height=&quot;510&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이걸 지금은 내가 지정한 cos로 하였지만 나중엔 RSA나 HS256로 암호화된 토큰을 보내주고 받으며 검증을 해주면 된다.&lt;/p&gt;</description>
      <category>jwt</category>
      <author>hellojava</author>
      <guid isPermaLink="true">https://java-woo.tistory.com/39</guid>
      <comments>https://java-woo.tistory.com/39#entry39comment</comments>
      <pubDate>Thu, 19 Oct 2023 16:54:38 +0900</pubDate>
    </item>
    <item>
      <title>JWT 를 위한 Security 설정</title>
      <link>https://java-woo.tistory.com/38</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;여태 이론적으로 공부를 맛봤고 본격 코딩작업에 들어간당.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;jwt를 사용하기 위해 config설정을 해줄게 조금 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 프로젝트를 생성 할 때 lombok,jpa,security,web,devtools,db를 넣어준다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 후 mavenrepository에서 jwt를 위한 dependency를 가져와 추가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://mvnrepository.com/&quot;&gt;https://mvnrepository.com/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 버전이 높고 사람들이 가장 많이 사용한 버전을 가져와 추가하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;dependencies &lt;span&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;implementation &lt;span style=&quot;color: #6a8759;&quot;&gt;'org.springframework.boot:spring-boot-starter-data-jpa'&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt; &lt;/span&gt;implementation &lt;span style=&quot;color: #6a8759;&quot;&gt;'org.springframework.boot:spring-boot-starter-security'&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt; &lt;/span&gt;implementation &lt;span style=&quot;color: #6a8759;&quot;&gt;'org.springframework.boot:spring-boot-starter-web'&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt; &lt;/span&gt;implementation &lt;span style=&quot;color: #6a8759;&quot;&gt;group&lt;/span&gt;: &lt;span style=&quot;color: #6a8759;&quot;&gt;'com.auth0'&lt;/span&gt;, &lt;span style=&quot;color: #6a8759;&quot;&gt;name&lt;/span&gt;: &lt;span style=&quot;color: #6a8759;&quot;&gt;'java-jwt'&lt;/span&gt;, &lt;span style=&quot;color: #6a8759;&quot;&gt;version&lt;/span&gt;: &lt;span style=&quot;color: #6a8759;&quot;&gt;'4.4.0'&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt; &lt;/span&gt;compileOnly &lt;span style=&quot;color: #6a8759;&quot;&gt;'org.projectlombok:lombok'&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt; &lt;/span&gt;developmentOnly &lt;span style=&quot;color: #6a8759;&quot;&gt;'org.springframework.boot:spring-boot-devtools'&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt; &lt;/span&gt;runtimeOnly &lt;span style=&quot;color: #6a8759;&quot;&gt;'com.mysql:mysql-connector-j'&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt; &lt;/span&gt;annotationProcessor &lt;span style=&quot;color: #6a8759;&quot;&gt;'org.projectlombok:lombok'&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt; &lt;/span&gt;testImplementation &lt;span style=&quot;color: #6a8759;&quot;&gt;'org.springframework.boot:spring-boot-starter-test'&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt; &lt;/span&gt;testImplementation &lt;span style=&quot;color: #6a8759;&quot;&gt;'org.springframework.security:spring-security-test'&lt;br /&gt;&lt;/span&gt;&lt;span&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적인 세팅은 완료가 되었고 controller와 model, config파일을 우선 만들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;controller는 @RestController를 이용하여 restapi를 사용하기 위해 준비 해놓았고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;model에는 간단히 Users파일을 만들어놓았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Entity&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Data&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public class &lt;/span&gt;Users {&lt;br /&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Id&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt; @GeneratedValue&lt;/span&gt;(strategy = GenerationType.&lt;span style=&quot;color: #9876aa;&quot;&gt;IDENTITY&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;private long &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; private &lt;/span&gt;String &lt;span style=&quot;color: #9876aa;&quot;&gt;username&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; private &lt;/span&gt;String &lt;span style=&quot;color: #9876aa;&quot;&gt;password&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; private &lt;/span&gt;String &lt;span style=&quot;color: #9876aa;&quot;&gt;roles&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;//user,admin&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public &lt;/span&gt;List&amp;lt;String&amp;gt; &lt;span style=&quot;color: #ffc66d;&quot;&gt;getRoleList&lt;/span&gt;() {&lt;br /&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;if &lt;/span&gt;(&lt;span style=&quot;color: #cc7832;&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color: #9876aa;&quot;&gt;roles&lt;/span&gt;.length() &amp;gt; &lt;span style=&quot;color: #6897bb;&quot;&gt;0&lt;/span&gt;) {&lt;br /&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;return &lt;/span&gt;Arrays.&lt;span&gt;asList&lt;/span&gt;(&lt;span style=&quot;color: #cc7832;&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color: #9876aa;&quot;&gt;roles&lt;/span&gt;.split(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #364135; color: #6a8759;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;&lt;/span&gt;))&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; &lt;/span&gt;}&lt;br /&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;return new &lt;/span&gt;ArrayList&amp;lt;&amp;gt;()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; &lt;/span&gt;}&lt;br /&gt;}&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;roles는 유저의 사용자 권한인데 user, admin등 여러개가 들어 갈 수 있다고 판단하여 roles라고 지정 해 놓은 후&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;권한이 여러개인 유저는 , 으로 구분하여 리턴받을 수 있도록 하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 후 config에 SecurityConfig, CorsConfig 파일 만들었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 CorsConfig에 configuration 이라는 어노테이션을 달고, CorsFilter라는 객체로 메서드를 만든 후 빈으로 등록해주었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Configuration&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public class &lt;/span&gt;CorsConfig {&lt;br /&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Bean&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public &lt;/span&gt;CorsFilter &lt;span style=&quot;color: #ffc66d;&quot;&gt;corsFilter&lt;/span&gt;() {&lt;br /&gt;UrlBasedCorsConfigurationSource source = &lt;span style=&quot;color: #cc7832;&quot;&gt;new &lt;/span&gt;UrlBasedCorsConfigurationSource()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; &lt;/span&gt;CorsConfiguration config = &lt;span style=&quot;color: #cc7832;&quot;&gt;new &lt;/span&gt;CorsConfiguration()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; &lt;/span&gt;config.setAllowCredentials(&lt;span style=&quot;color: #cc7832;&quot;&gt;true&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;내 서버가 응답할때&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; json&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;을 자바스크립트에서 처리할 수 있게 할지를 설정하는 것&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;.&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; &lt;/span&gt;config.addAllowedOrigin(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;*&quot;&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;모든&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; ip&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;에 응답을 허용&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; &lt;/span&gt;config.addAllowedHeader(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;*&quot;&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;모든&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; header&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;에 응답을 허용&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; &lt;/span&gt;config.addAllowedMethod(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;*&quot;&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;모든&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; post,get,put,delete,patch &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;모든 응답 허용&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; &lt;/span&gt;source.registerCorsConfiguration(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;/api/**&quot;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;config)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; return new &lt;/span&gt;CorsFilter(source)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; &lt;/span&gt;}&lt;br /&gt;}&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Configuration&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@EnableWebSecurity&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@RequiredArgsConstructor&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public class &lt;/span&gt;SecurityConfig &lt;span style=&quot;color: #cc7832;&quot;&gt;extends &lt;/span&gt;WebSecurityConfigurerAdapter {&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;private final &lt;/span&gt;CorsFilter &lt;span style=&quot;color: #9876aa;&quot;&gt;corsFilter&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Override&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;protected void &lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;configure&lt;/span&gt;(HttpSecurity http) &lt;span style=&quot;color: #cc7832;&quot;&gt;throws &lt;/span&gt;Exception {&lt;br /&gt;http.csrf().disable()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; &lt;/span&gt;http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.&lt;span style=&quot;color: #9876aa;&quot;&gt;STATELESS&lt;/span&gt;)&lt;span style=&quot;color: #808080;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;세션 사용안함&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; &lt;/span&gt;.and()&lt;br /&gt;.addFilter(&lt;span style=&quot;color: #9876aa;&quot;&gt;corsFilter&lt;/span&gt;)&lt;span style=&quot;color: #808080;&quot;&gt;//@CorssOrigin(&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;인증&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;X) , &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;시큐리티필터에 등록 인증&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;(0)&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; &lt;/span&gt;.formLogin().disable()&lt;span style=&quot;color: #808080;&quot;&gt;//form&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;로그인 안씀&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; &lt;/span&gt;.httpBasic().disable()&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt; &lt;/span&gt;.authorizeRequests()&lt;br /&gt;.antMatchers(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;/api/v1/users/**&quot;&lt;/span&gt;)&lt;br /&gt;.access(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #364135; color: #6a8759;&quot;&gt;hasRole('ROLE_USER') or hasRole('ROLE_MANAGER') or hasRole('ROLE_ADMIN')&lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;&lt;/span&gt;)&lt;br /&gt;.antMatchers(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;/api/v1/manager/**&quot;&lt;/span&gt;)&lt;br /&gt;.access(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #364135; color: #6a8759;&quot;&gt;hasRole('ROLE_MANAGER') or hasRole('ROLE_ADMIN')&lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;&lt;/span&gt;)&lt;br /&gt;.antMatchers(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;/api/v1/admin/**&quot;&lt;/span&gt;)&lt;br /&gt;.access(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #364135; color: #6a8759;&quot;&gt;hasRole('ROLE_ADMIN')&lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;&lt;/span&gt;)&lt;br /&gt;.anyRequest().permitAll()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt; &lt;/span&gt;}&lt;br /&gt;}&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;form로그인과&amp;nbsp; 세션을 사용한다는 내용과 권한에 대한 내용이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 만들어놓은 filter로 필터도 추가해 놓았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;httpBasic방식은 쿠키와 세션을 사용하지 않는다고 생각할 때 기존의 httpBasic방식은 header의 authorization이라는 키값에 id와 pw를 담아서 보낸다. 하지만 노출이 된다면 보안적으로 굉장히 불리하기 떄문에 https(secure)를 사용하면 암호화가 되긴 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 Bearer인증방식은 authorization 에 id,pw를 토큰에 넣어서 보낸다. 기존 basic 방식보다 보안적으로 안전한 방식이다. 물론 똑같이 노출이 되면 안되지만 노출이 되어도 서버쪽에서 토큰을 계속 만들어 주기 때문에 안전한 방식이라고 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 토큰을 만들 때 JWT 을 만드는 것이다. 이 방식을 사용하기 떄문에 session방식도 사용 안하고 basic,formlogin 등을 하지 않는다고 선언 하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>jwt</category>
      <author>hellojava</author>
      <guid isPermaLink="true">https://java-woo.tistory.com/38</guid>
      <comments>https://java-woo.tistory.com/38#entry38comment</comments>
      <pubDate>Thu, 19 Oct 2023 14:58:21 +0900</pubDate>
    </item>
    <item>
      <title>JWT 구조 이해</title>
      <link>https://java-woo.tistory.com/37</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://jwt.io/introduction&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://jwt.io/introduction&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1697610279230&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;JWT.IO&quot; data-og-description=&quot;JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.&quot; data-og-host=&quot;jwt.io&quot; data-og-source-url=&quot;https://jwt.io/introduction&quot; data-og-url=&quot;http://jwt.io/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/qdOlE/hyUdUSE2fm/FAsW0OAif5uAzGwqbmdox0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bGBrID/hyUdRavxUp/WHtJMtS8YScW9EEU0YHjKK/img.png?width=1024&amp;amp;height=512&amp;amp;face=0_0_1024_512&quot;&gt;&lt;a href=&quot;https://jwt.io/introduction&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jwt.io/introduction&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/qdOlE/hyUdUSE2fm/FAsW0OAif5uAzGwqbmdox0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bGBrID/hyUdRavxUp/WHtJMtS8YScW9EEU0YHjKK/img.png?width=1024&amp;amp;height=512&amp;amp;face=0_0_1024_512');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;JWT.IO&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jwt.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 사이트를 보면 JWT에 대한 설명을 확인 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JWT는 보안을 제공하긴 하지만 요점은 누가보냈나?에 중점을 둔 기술?이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JWT의 구조는 header/payload/signature 라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;xxxxx.yyyyy.zzzzz 라고 표현한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;헤더에는 알고리즘은 뭐로 사용했는지, 타입이 뭔지 나타나있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #000000;&quot;&gt; &lt;span style=&quot;color: #ffffff; text-align: start;&quot;&gt;{ &lt;/span&gt;&lt;span style=&quot;color: #ffffff; text-align: start;&quot;&gt;&quot;alg&quot;&lt;/span&gt;&lt;span style=&quot;color: #ffffff; text-align: start;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #00fbca; text-align: start;&quot;&gt;&quot;HS256&quot;&lt;/span&gt;&lt;span style=&quot;color: #ffffff; text-align: start;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ffffff; text-align: start;&quot;&gt;&quot;typ&quot;&lt;/span&gt;&lt;span style=&quot;color: #ffffff; text-align: start;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #00fbca; text-align: start;&quot;&gt;&quot;JWT&quot;&lt;/span&gt;&lt;span style=&quot;color: #ffffff; text-align: start;&quot;&gt; }&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;페이로드는 어떠한 정보 부분이다. 이 정보는 클레임을 가지고 있다. 클레임은 등록 된 클레임과 개인 클레임으로 이루어지 는데 등록 된 클레임은 필수 조건은 아니지만 권장되는 클레임 집합니다. 그 내용에는 발행자, 만료시간, 주제, 청중 등이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인 클레임엔 유저아이디같은 것을 넣는다고 한다. 공개되도 상관 없지만 그 유저인지 특정 할 수 있는 PK를 개인클레임에 넣을 예정이라고 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #000000;&quot;&gt; &lt;span style=&quot;color: #ffffff; text-align: start;&quot;&gt;{ &lt;/span&gt;&lt;span style=&quot;color: #ffffff; text-align: start;&quot;&gt;&quot;sub&quot;&lt;/span&gt;&lt;span style=&quot;color: #ffffff; text-align: start;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #00fbca; text-align: start;&quot;&gt;&quot;1234567890&quot;&lt;/span&gt;&lt;span style=&quot;color: #ffffff; text-align: start;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ffffff; text-align: start;&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span style=&quot;color: #ffffff; text-align: start;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #00fbca; text-align: start;&quot;&gt;&quot;John Doe&quot;&lt;/span&gt;&lt;span style=&quot;color: #ffffff; text-align: start;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ffffff; text-align: start;&quot;&gt;&quot;admin&quot;&lt;/span&gt;&lt;span style=&quot;color: #ffffff; text-align: start;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #42c7f4; text-align: start;&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color: #ffffff; text-align: start;&quot;&gt; }&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sub나 name은 등록된 클레임인 것 같고 admin은 개인이 원하면 만들어 낼 수 있는 키 밸류값일 것이라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;header에는 어떤 알고리즘으로 암호화했는지를 넣고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;payload에는 어떠한 정보들을 담는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;signature에는 header와 payload, 나만 알고 있는 개인키를 넣는다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1437&quot; data-origin-height=&quot;515&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vWuGC/btsyIMOBvZs/EBMxXC6iZKpFLJpzhHICrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vWuGC/btsyIMOBvZs/EBMxXC6iZKpFLJpzhHICrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vWuGC/btsyIMOBvZs/EBMxXC6iZKpFLJpzhHICrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvWuGC%2FbtsyIMOBvZs%2FEBMxXC6iZKpFLJpzhHICrK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1437&quot; height=&quot;515&quot; data-origin-width=&quot;1437&quot; data-origin-height=&quot;515&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;id 와 pw 로 로그인 요청을 하면 서버는 서버만 알고 있는 key값을 이용하여 jwt 토큰을 만든후 클라이언트에 보낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 클라이언트는 로컬스토리지라는 영역에 들고 있다가 서버에게 '내 정보 좀 줘' 하면서 jwt 토큰을 같이 보낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버는 토큰이 유효한 토큰인지 확인 해야한다. 만약 클라이언트에서 보낸 토큰이 12345 라고 했을때 서버는 그 토큰을 복호하고 하는 것이 아니라 서버만 가지고 있는 key를 이용하여 다시 암호화를 해본다. 유효한 토큰이라면 12345가 똑같이 나올 것이다. 그러면 payload에 있는 id값을 이용하여 쿼리문을 날리고 다시 클라이언트에 정보를 보내준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 RSA 암호방식을 사용하고 싶다면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;header에 RSA를 넣고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;payload에 username : woo&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;signiture ---- 개인키 (header +&amp;nbsp; payload)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시그니쳐에 secret키를 넣는 것이 아닌 header와 payload를 개인키로 묶어 보낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 클라이언트에서 서버로 요청이 왔을 때에는 공개키로 열어서 확인만 하면 인증이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설명만 들었을 때에는 RSA가 더 간편해 보이긴 하는데 HS256방식을 더 많이 선호한다고 한다.&lt;/p&gt;</description>
      <category>jwt</category>
      <author>hellojava</author>
      <guid isPermaLink="true">https://java-woo.tistory.com/37</guid>
      <comments>https://java-woo.tistory.com/37#entry37comment</comments>
      <pubDate>Wed, 18 Oct 2023 16:02:43 +0900</pubDate>
    </item>
    <item>
      <title>RFC 문서</title>
      <link>https://java-woo.tistory.com/36</link>
      <description>&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;RFC문서란 무엇인가.. 대략적으로 설명을 들었다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;먼저 미국의 벨연구소란 곳에서 내부통신망을 이용하여 소통?을하고 있었다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;근데 별도의 내부통신망을 이용하던 A대학에서 '나도 너네랑 소통할게 있어' 라며 벨연구소와 소통약속을 만들었다. 그게 RFC 1번문서이다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;또 B대학에서 C대학에서...&amp;nbsp; 이 대학들이 서로 소통하는것을 World Wide Web (www) 인터넷이고 소통하며 만든 약속들이 RFC 문서들이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;즉 인터넷은 RFC문서로 만들었고 이 약속들이 http 프로토콜이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;JWT는 7519번째 RFC이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;만약 현재 시점에서 W라는 대학교가 www에 끼고싶은데 W대학의 특별한 규칙을 넣고 싶을 때에는 모든 대학들의 동의를 얻어야만 한다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;처음 RFC가 만들어지고 있을때에는 상호간의 동의만 있다면 서로 동등한 위치에서 규칙을 만들었을 것이다. 하지만 지금은 동등한 위치가 아닐 것이다.&lt;/p&gt;</description>
      <category>jwt</category>
      <author>hellojava</author>
      <guid isPermaLink="true">https://java-woo.tistory.com/36</guid>
      <comments>https://java-woo.tistory.com/36#entry36comment</comments>
      <pubDate>Wed, 18 Oct 2023 15:24:02 +0900</pubDate>
    </item>
    <item>
      <title>RSA</title>
      <link>https://java-woo.tistory.com/35</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;RSA(암호화)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Public Key : 공개 키&lt;/li&gt;
&lt;li&gt;Private Key : 개인 키&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1248&quot; data-origin-height=&quot;364&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k1AkM/btsxrZQjPUQ/cWizm9klsxukCjTRoSMqk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k1AkM/btsxrZQjPUQ/cWizm9klsxukCjTRoSMqk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k1AkM/btsxrZQjPUQ/cWizm9klsxukCjTRoSMqk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk1AkM%2FbtsxrZQjPUQ%2FcWizm9klsxukCjTRoSMqk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1248&quot; height=&quot;364&quot; data-origin-width=&quot;1248&quot; data-origin-height=&quot;364&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a가 b에게 메시지를 보낼때 b의 공개키로 암호화 하여 메시지를 보낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b의 공개키로 암호되어있기 때문에 b의 개인키로만 풀 수 있기 때문에 중간에 누가 가로채더라도 읽을 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1304&quot; data-origin-height=&quot;563&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAL9vQ/btsx2vzcjy2/IEFitheHSE9fYY6gAbxmGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAL9vQ/btsx2vzcjy2/IEFitheHSE9fYY6gAbxmGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAL9vQ/btsx2vzcjy2/IEFitheHSE9fYY6gAbxmGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAL9vQ%2Fbtsx2vzcjy2%2FIEFitheHSE9fYY6gAbxmGk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1304&quot; height=&quot;563&quot; data-origin-width=&quot;1304&quot; data-origin-height=&quot;563&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공개키를 담아서 보내면 암호화 (개인키로 풀어서 봄)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인키를 담아서 보내면 전자서명..(공개키로 풀어서 봄) (해커가 봐도 상관 없단 마인드..?)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1324&quot; data-origin-height=&quot;545&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTR43h/btsx2LaZeKD/ZMxDHXRuWvYSLOJgfhYIfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTR43h/btsx2LaZeKD/ZMxDHXRuWvYSLOJgfhYIfK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTR43h/btsx2LaZeKD/ZMxDHXRuWvYSLOJgfhYIfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTR43h%2Fbtsx2LaZeKD%2FZMxDHXRuWvYSLOJgfhYIfK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1324&quot; height=&quot;545&quot; data-origin-width=&quot;1324&quot; data-origin-height=&quot;545&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;암호화가 필요한 문서를 보낼때에&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 상대의 공개키로 암호화를 한 후에, 자신의 개인키로 묶어서 보낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 중간에 누가 가로채서 변형 후 b에게 보내도 (해커는 A의 개인키를 모르기때문에 A와 같이 암호화 못함) 인증이 안된 문서이기 때문에 볼 필요가 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 RSA의 방식으로 암호화를 한다면 누가 보냈는지, 암호화에 대한 이슈를 해결 할 수 있다.&lt;/p&gt;</description>
      <category>jwt</category>
      <author>hellojava</author>
      <guid isPermaLink="true">https://java-woo.tistory.com/35</guid>
      <comments>https://java-woo.tistory.com/35#entry35comment</comments>
      <pubDate>Tue, 10 Oct 2023 18:13:16 +0900</pubDate>
    </item>
    <item>
      <title>CIA</title>
      <link>https://java-woo.tistory.com/34</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;CIA ( &lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;Confidentiality Integrity Availability&lt;/span&gt; )란&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Confidentiality : 기밀성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Integrity : 무결성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Aailability : 가용성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a,b,c 나라가 있다고 생각해 보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a나라가 c 나라에 b나라가 보면 안되는 문서를 보내야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 중간에 c 나라에게 걸렸고 문서를 c나라가 봤다면 기밀성이 깨진 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c나라가 만일 그 문서를 파기하고 변조해서 b 나라에 보낸다면 기밀성이 깨짐과 동시에 무결성이 깨진 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문서가 b나라에 전달된 순간 가용성까지 깨진것이다. 내가 원하는 문서에 제대로 접근할 수 있는가에 대한 내용인데 이미 변조가 되었기 때문에 ...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그냥 문서를 보내게 된다면 CIA는 깨지는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계속 강의를 듣다보면 이런 보안이슈에 대한 해결법을 배울 수 있을것 같다&lt;/p&gt;</description>
      <category>jwt</category>
      <author>hellojava</author>
      <guid isPermaLink="true">https://java-woo.tistory.com/34</guid>
      <comments>https://java-woo.tistory.com/34#entry34comment</comments>
      <pubDate>Tue, 10 Oct 2023 17:43:48 +0900</pubDate>
    </item>
    <item>
      <title>TCP</title>
      <link>https://java-woo.tistory.com/33</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;통신 OSI 7계층&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물리,데이터링크,네트워크,트랜스포트,세션,프리젠테이션,응용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1114&quot; data-origin-height=&quot;515&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZbK5w/btsxqxTPuo6/Rfr9fv8dwtsU6uxn46bFA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZbK5w/btsxqxTPuo6/Rfr9fv8dwtsU6uxn46bFA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZbK5w/btsxqxTPuo6/Rfr9fv8dwtsU6uxn46bFA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZbK5w%2FbtsxqxTPuo6%2FRfr9fv8dwtsU6uxn46bFA0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1114&quot; height=&quot;515&quot; data-origin-width=&quot;1114&quot; data-origin-height=&quot;515&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*TCP&amp;nbsp; 신뢰성! 속도X 웹은 tcp&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A--------------------------------B&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-----------&amp;gt;안뇽------------&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;-----------ACK--------------&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;---------&amp;gt;반가워----------&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;----------ack를 못보냄------&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;------------&amp;gt;반가워------&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;---------------ACK--------&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(ACK를 a가 못받음 유실or&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;누군가 낚아챔, 통신끊김)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;------------&amp;gt;반가워-----&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;--------------ACK--------&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UDP&amp;nbsp; 신뢰성X 속도! 사람이 추측할만한것을 udp&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A------------------------B&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;---------&amp;gt;안녕-----&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;---------&amp;gt;반가워----&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;------데이터를 ack안받고 보냄&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주로 전&lt;/p&gt;</description>
      <category>jwt</category>
      <author>hellojava</author>
      <guid isPermaLink="true">https://java-woo.tistory.com/33</guid>
      <comments>https://java-woo.tistory.com/33#entry33comment</comments>
      <pubDate>Tue, 10 Oct 2023 15:58:31 +0900</pubDate>
    </item>
  </channel>
</rss>